From 4dd7387799a39078bba1c5ed649907b72328fbfe Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Tue, 14 Jul 2020 12:17:05 -0400 Subject: [PATCH] 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) };