diff options
-rw-r--r-- | components/script/dom/testbinding.rs | 9 | ||||
-rw-r--r-- | components/script/dom/webidls/TestBinding.webidl | 5 | ||||
-rw-r--r-- | components/servo/Cargo.lock | 7 | ||||
-rw-r--r-- | components/servo/Cargo.toml | 4 | ||||
-rw-r--r-- | components/servo/main.rs | 33 | ||||
-rw-r--r-- | ports/cef/Cargo.lock | 7 | ||||
-rw-r--r-- | resources/prefs.json | 1 | ||||
-rw-r--r-- | tests/wpt/mozilla/meta/MANIFEST.json | 6 | ||||
-rw-r--r-- | tests/wpt/mozilla/meta/mozilla/sigsegv.html.ini | 4 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/mozilla/sigsegv.html | 8 |
10 files changed, 83 insertions, 1 deletions
diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index 95341751780..bbbbc8aa5d6 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -571,6 +571,15 @@ impl TestBindingMethods for TestBinding { fn FuncControlledAttributeEnabled(&self) -> bool { false } fn FuncControlledMethodDisabled(&self) {} fn FuncControlledMethodEnabled(&self) {} + + #[allow(unsafe_code)] + fn CrashHard(&self) { + static READ_ONLY_VALUE: i32 = 0; + unsafe { + let p: *mut u32 = &READ_ONLY_VALUE as *const _ as *mut _; + ptr::write_volatile(p, 0xbaadc0de); + } + } } impl TestBinding { diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index cdfb9fd18ae..eb6e5a9ae7b 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -456,3 +456,8 @@ interface TestBinding { [Func="TestBinding::condition_satisfied"] const unsigned short funcControlledConstEnabled = 0; }; + +partial interface TestBinding { + [Pref="dom.testable_crash.enabled"] + void crashHard(); +}; diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 05983de473a..10b36f51793 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -3,6 +3,7 @@ name = "servo" version = "0.0.1" dependencies = [ "android_glue 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "browserhtml 0.1.7 (git+https://github.com/browserhtml/browserhtml?branch=gh-pages)", "canvas 0.0.1", "canvas_traits 0.0.1", @@ -37,6 +38,7 @@ dependencies = [ "script_layout_interface 0.0.1", "script_tests 0.0.1", "script_traits 0.0.1", + "sig 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "style_tests 0.0.1", "url 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2160,6 +2162,11 @@ dependencies = [ ] [[package]] +name = "sig" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "simd" version = "0.1.0" source = "git+https://github.com/huonw/simd#03de1cd0a278ab902b4beb402d57505f3797ea56" diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index fee429f6ff1..ba363a8f2aa 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -75,6 +75,10 @@ euclid = "0.6.4" libc = "0.2" url = "1.0.0" +[target.'cfg(not(target_os = "android"))'.dependencies] +sig = "0.1" +backtrace = "0.2" + [target.'cfg(target_os = "android")'.dependencies] log = "0.3" android_glue = "0.1.3" diff --git a/components/servo/main.rs b/components/servo/main.rs index 4622040fa44..bf4c0b14f4c 100644 --- a/components/servo/main.rs +++ b/components/servo/main.rs @@ -15,11 +15,13 @@ //! //! [glutin]: https://github.com/tomaka/glutin -#![feature(start)] +#![feature(start, core_intrinsics)] #[cfg(target_os = "android")] #[macro_use] extern crate android_glue; +#[cfg(not(target_os = "android"))] +extern crate backtrace; extern crate env_logger; // The window backed by glutin extern crate glutin_app as app; @@ -30,6 +32,9 @@ extern crate libc; extern crate log; // The Servo engine extern crate servo; +#[cfg(not(target_os = "android"))] +#[macro_use] +extern crate sig; use servo::Browser; use servo::compositing::windowing::WindowEvent; @@ -48,7 +53,33 @@ pub mod platform { pub fn deinit() {} } +#[cfg(not(target_os = "android"))] +fn install_crash_handler() { + use backtrace::Backtrace; + use sig::ffi::Sig; + use std::intrinsics::abort; + use std::thread; + + fn handler(_sig: i32) { + let name = thread::current().name() + .map(|n| format!(" for thread \"{}\"", n)) + .unwrap_or("".to_owned()); + println!("Stack trace{}\n{:?}", name, Backtrace::new()); + unsafe { + abort(); + } + } + + signal!(Sig::SEGV, handler); +} + +#[cfg(target_os = "android")] +fn install_crash_handler() { +} + fn main() { + install_crash_handler(); + // Parse the command line options and store them globally let opts_result = opts::from_cmdline_args(&*args()); diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index bc0e7f90b52..d52028bf746 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -1909,6 +1909,7 @@ name = "servo" version = "0.0.1" dependencies = [ "android_glue 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "browserhtml 0.1.7 (git+https://github.com/browserhtml/browserhtml?branch=gh-pages)", "canvas 0.0.1", "canvas_traits 0.0.1", @@ -1935,6 +1936,7 @@ dependencies = [ "script 0.0.1", "script_layout_interface 0.0.1", "script_traits 0.0.1", + "sig 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "style 0.0.1", "url 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "util 0.0.1", @@ -2045,6 +2047,11 @@ dependencies = [ ] [[package]] +name = "sig" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "simd" version = "0.1.0" source = "git+https://github.com/huonw/simd#03de1cd0a278ab902b4beb402d57505f3797ea56" diff --git a/resources/prefs.json b/resources/prefs.json index 0289050a162..6124c2376c3 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -4,6 +4,7 @@ "dom.mouseevent.which.enabled": false, "dom.mozbrowser.enabled": false, "dom.serviceworker.timeout_seconds": 60, + "dom.testable_crash.enabled": false, "dom.testbinding.enabled": false, "gfx.webrender.enabled": false, "js.baseline.enabled": true, diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 1c546649e56..c66a163d2f7 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -6952,6 +6952,12 @@ "url": "/_mozilla/mozilla/service-workers/service-worker-registration.html" } ], + "mozilla/sigsegv.html": [ + { + "path": "mozilla/sigsegv.html", + "url": "/_mozilla/mozilla/sigsegv.html" + } + ], "mozilla/storage.html": [ { "path": "mozilla/storage.html", diff --git a/tests/wpt/mozilla/meta/mozilla/sigsegv.html.ini b/tests/wpt/mozilla/meta/mozilla/sigsegv.html.ini new file mode 100644 index 00000000000..b6d80eeff3b --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/sigsegv.html.ini @@ -0,0 +1,4 @@ +[sigsegv.html] + type: testharness + prefs: [dom.testbinding.enabled:true,dom.testable_crash.enabled:true] + expected: CRASH diff --git a/tests/wpt/mozilla/tests/mozilla/sigsegv.html b/tests/wpt/mozilla/tests/mozilla/sigsegv.html new file mode 100644 index 00000000000..5b1aadd83a2 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/sigsegv.html @@ -0,0 +1,8 @@ +<!doctype html> +<meta charset="utf-8"> +<title></title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +(new TestBinding()).crashHard(); +</script> |