aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/testbinding.rs9
-rw-r--r--components/script/dom/webidls/TestBinding.webidl5
-rw-r--r--components/servo/Cargo.lock7
-rw-r--r--components/servo/Cargo.toml4
-rw-r--r--components/servo/main.rs33
-rw-r--r--ports/cef/Cargo.lock7
-rw-r--r--resources/prefs.json1
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json6
-rw-r--r--tests/wpt/mozilla/meta/mozilla/sigsegv.html.ini4
-rw-r--r--tests/wpt/mozilla/tests/mozilla/sigsegv.html8
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>