From e6cdfddea6c8435a6147ccc11967cb027a965a97 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 14 Jul 2020 12:16:34 -0400 Subject: [PATCH 1/2] dom: Hide debugging extension methods behind a pref. --- components/config/prefs.rs | 3 +++ components/script/dom/webidls/Window.webidl | 3 +++ resources/prefs.json | 1 + resources/user-agent-js/00.example.js | 1 + .../meta-layout-2020/mozilla/media_query_list_gc.html.ini | 1 + .../wpt/mozilla/meta-layout-2020/mozilla/prototypes.html.ini | 1 + .../wpt/mozilla/meta-layout-2020/mozilla/trace_null.html.ini | 1 + .../meta-layout-2020/mozilla/transitionend_safety.html.ini | 1 + tests/wpt/mozilla/meta-layout-2020/mozilla/weakref.html.ini | 5 ++--- tests/wpt/mozilla/meta/mozilla/media_query_list_gc.html.ini | 1 + tests/wpt/mozilla/meta/mozilla/prototypes.html.ini | 1 + tests/wpt/mozilla/meta/mozilla/trace_null.html.ini | 1 + tests/wpt/mozilla/meta/mozilla/transitionend_safety.html.ini | 1 + tests/wpt/mozilla/meta/mozilla/weakref.html.ini | 2 +- 14 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 tests/wpt/mozilla/meta-layout-2020/mozilla/media_query_list_gc.html.ini create mode 100644 tests/wpt/mozilla/meta-layout-2020/mozilla/prototypes.html.ini create mode 100644 tests/wpt/mozilla/meta-layout-2020/mozilla/trace_null.html.ini create mode 100644 tests/wpt/mozilla/meta-layout-2020/mozilla/transitionend_safety.html.ini create mode 100644 tests/wpt/mozilla/meta/mozilla/media_query_list_gc.html.ini create mode 100644 tests/wpt/mozilla/meta/mozilla/prototypes.html.ini create mode 100644 tests/wpt/mozilla/meta/mozilla/trace_null.html.ini create mode 100644 tests/wpt/mozilla/meta/mozilla/transitionend_safety.html.ini diff --git a/components/config/prefs.rs b/components/config/prefs.rs index bf78d8d584d..36b35c3447f 100644 --- a/components/config/prefs.rs +++ b/components/config/prefs.rs @@ -187,6 +187,9 @@ mod gen { enabled: bool, timeout_seconds: i64, }, + servo_helpers: { + enabled: bool, + }, servoparser: { async_html_tokenizer: { enabled: bool, diff --git a/components/script/dom/webidls/Window.webidl b/components/script/dom/webidls/Window.webidl index 71f03a2e1f4..80a8d31595a 100644 --- a/components/script/dom/webidls/Window.webidl +++ b/components/script/dom/webidls/Window.webidl @@ -136,8 +136,11 @@ partial interface Window { // Proprietary extensions. partial interface Window { + [Pref="dom.servo_helpers.enabled"] void debug(DOMString arg); + [Pref="dom.servo_helpers.enabled"] void gc(); + [Pref="dom.servo_helpers.enabled"] void trap(); }; diff --git a/resources/prefs.json b/resources/prefs.json index 0b219f7966a..d05504d5f43 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -19,6 +19,7 @@ "dom.permissions.testing.allowed_in_nonsecure_contexts": false, "dom.serviceworker.enabled": false, "dom.serviceworker.timeout_seconds": 60, + "dom.servo_helpers.enabled": false, "dom.servoparser.async_html_tokenizer.enabled": false, "dom.shadowdom.enabled": false, "dom.svg.enabled": false, diff --git a/resources/user-agent-js/00.example.js b/resources/user-agent-js/00.example.js index c024b0f6a48..168f3d6254c 100644 --- a/resources/user-agent-js/00.example.js +++ b/resources/user-agent-js/00.example.js @@ -3,3 +3,4 @@ // Files are sorted alphabetically. When committing polyfills // order them with numbers, e.g. `01.innerhtml.js` will be executed before // `05.jquery.js` +onunhandledrejection = (e) => console.error("xxxjdm error: " + JSON.stringify(e.reason)); diff --git a/tests/wpt/mozilla/meta-layout-2020/mozilla/media_query_list_gc.html.ini b/tests/wpt/mozilla/meta-layout-2020/mozilla/media_query_list_gc.html.ini new file mode 100644 index 00000000000..e30744b586d --- /dev/null +++ b/tests/wpt/mozilla/meta-layout-2020/mozilla/media_query_list_gc.html.ini @@ -0,0 +1 @@ +prefs: ["dom.servo_helpers.enabled:true"] diff --git a/tests/wpt/mozilla/meta-layout-2020/mozilla/prototypes.html.ini b/tests/wpt/mozilla/meta-layout-2020/mozilla/prototypes.html.ini new file mode 100644 index 00000000000..e30744b586d --- /dev/null +++ b/tests/wpt/mozilla/meta-layout-2020/mozilla/prototypes.html.ini @@ -0,0 +1 @@ +prefs: ["dom.servo_helpers.enabled:true"] diff --git a/tests/wpt/mozilla/meta-layout-2020/mozilla/trace_null.html.ini b/tests/wpt/mozilla/meta-layout-2020/mozilla/trace_null.html.ini new file mode 100644 index 00000000000..e30744b586d --- /dev/null +++ b/tests/wpt/mozilla/meta-layout-2020/mozilla/trace_null.html.ini @@ -0,0 +1 @@ +prefs: ["dom.servo_helpers.enabled:true"] diff --git a/tests/wpt/mozilla/meta-layout-2020/mozilla/transitionend_safety.html.ini b/tests/wpt/mozilla/meta-layout-2020/mozilla/transitionend_safety.html.ini new file mode 100644 index 00000000000..e30744b586d --- /dev/null +++ b/tests/wpt/mozilla/meta-layout-2020/mozilla/transitionend_safety.html.ini @@ -0,0 +1 @@ +prefs: ["dom.servo_helpers.enabled:true"] diff --git a/tests/wpt/mozilla/meta-layout-2020/mozilla/weakref.html.ini b/tests/wpt/mozilla/meta-layout-2020/mozilla/weakref.html.ini index f0fc027e023..8faf1a9b047 100644 --- a/tests/wpt/mozilla/meta-layout-2020/mozilla/weakref.html.ini +++ b/tests/wpt/mozilla/meta-layout-2020/mozilla/weakref.html.ini @@ -1,4 +1,3 @@ [weakref.html] - [Weak references work] - expected: FAIL - + type: testharness + prefs: ["dom.testbinding.enabled:true", "dom.servo_helpers.enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/media_query_list_gc.html.ini b/tests/wpt/mozilla/meta/mozilla/media_query_list_gc.html.ini new file mode 100644 index 00000000000..e30744b586d --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/media_query_list_gc.html.ini @@ -0,0 +1 @@ +prefs: ["dom.servo_helpers.enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/prototypes.html.ini b/tests/wpt/mozilla/meta/mozilla/prototypes.html.ini new file mode 100644 index 00000000000..e30744b586d --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/prototypes.html.ini @@ -0,0 +1 @@ +prefs: ["dom.servo_helpers.enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/trace_null.html.ini b/tests/wpt/mozilla/meta/mozilla/trace_null.html.ini new file mode 100644 index 00000000000..e30744b586d --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/trace_null.html.ini @@ -0,0 +1 @@ +prefs: ["dom.servo_helpers.enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/transitionend_safety.html.ini b/tests/wpt/mozilla/meta/mozilla/transitionend_safety.html.ini new file mode 100644 index 00000000000..e30744b586d --- /dev/null +++ b/tests/wpt/mozilla/meta/mozilla/transitionend_safety.html.ini @@ -0,0 +1 @@ +prefs: ["dom.servo_helpers.enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/weakref.html.ini b/tests/wpt/mozilla/meta/mozilla/weakref.html.ini index 3c694147814..8faf1a9b047 100644 --- a/tests/wpt/mozilla/meta/mozilla/weakref.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/weakref.html.ini @@ -1,3 +1,3 @@ [weakref.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: ["dom.testbinding.enabled:true", "dom.servo_helpers.enabled:true"] From 4dd7387799a39078bba1c5ed649907b72328fbfe Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 14 Jul 2020 12:17:05 -0400 Subject: [PATCH 2/2] dom: Add Window.js_backtrace debugging extension method. --- components/script/Cargo.toml | 6 +++--- components/script/dom/webidls/Window.webidl | 2 ++ components/script/dom/window.rs | 17 ++++++++++++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 225367a7090..d155919ba12 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -18,8 +18,8 @@ jitspew = ['js/jitspew'] profilemozjs = ['js/profilemozjs'] unrooted_must_root_lint = ["script_plugins/unrooted_must_root_lint"] default = ["unrooted_must_root_lint"] -webgl_backtrace = ["backtrace", "canvas_traits/webgl_backtrace"] -js_backtrace = ["backtrace"] +webgl_backtrace = ["canvas_traits/webgl_backtrace"] +js_backtrace = [] refcell_backtrace = ["accountable-refcell"] uwp = ["js/uwp"] xr-profile = ["webxr-api/profile"] @@ -33,7 +33,7 @@ serde_json = "1.0" accountable-refcell = { version = "0.2.0", optional = true } app_units = "0.7" arrayvec = "0.5.1" -backtrace = { version = "0.3", optional = true } +backtrace = "0.3" base64 = "0.10.1" bitflags = "1.0" bluetooth_traits = { path = "../bluetooth_traits" } diff --git a/components/script/dom/webidls/Window.webidl b/components/script/dom/webidls/Window.webidl index 80a8d31595a..fa3460e9889 100644 --- a/components/script/dom/webidls/Window.webidl +++ b/components/script/dom/webidls/Window.webidl @@ -142,6 +142,8 @@ partial interface Window { void gc(); [Pref="dom.servo_helpers.enabled"] void trap(); + [Pref="dom.servo_helpers.enabled"] + void js_backtrace(); }; // WebDriver extensions diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index d6a4ac22622..09497c0798a 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -72,6 +72,7 @@ use crate::task_source::{TaskSource, TaskSourceName}; use crate::timers::{IsInterval, TimerCallback}; use crate::webdriver_handlers::jsval_to_webdriver; use app_units::Au; +use backtrace::Backtrace; use base64; use bluetooth_traits::BluetoothRequest; use canvas_traits::webgl::WebGLChan; @@ -89,7 +90,7 @@ use js::jsapi::Heap; use js::jsapi::JSAutoRealm; use js::jsapi::JSObject; use js::jsapi::JSPROP_ENUMERATE; -use js::jsapi::{GCReason, JS_GC}; +use js::jsapi::{GCReason, StackFormat, JS_GC}; use js::jsval::UndefinedValue; use js::jsval::{JSVal, NullValue}; use js::rust::wrappers::JS_DefineProperty; @@ -1081,6 +1082,20 @@ impl WindowMethods for Window { unsafe { ::std::intrinsics::breakpoint() } } + #[allow(unsafe_code)] + fn Js_backtrace(&self) { + unsafe { + capture_stack!(in(*self.get_cx()) let stack); + let js_stack = stack.and_then(|s| s.as_string(None, StackFormat::SpiderMonkey)); + let rust_stack = Backtrace::new(); + println!( + "Current JS stack:\n{}\nCurrent Rust stack:\n{:?}", + js_stack.unwrap_or(String::new()), + rust_stack + ); + } + } + #[allow(unsafe_code)] fn WebdriverCallback(&self, cx: JSContext, val: HandleValue) { let rv = unsafe { jsval_to_webdriver(*cx, &self.globalscope, val) };