diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2016-10-03 02:26:05 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2016-10-06 21:35:46 +0200 |
commit | 86d2008137f48432ba14aed5009775cfd4dadcc5 (patch) | |
tree | 079f17c19a61d5c1efea2e7f81be94a63970d4c0 /components/script/dom/globalscope.rs | |
parent | d4fccbace431b003abbc49f2fbc5e8b2de6b3f2a (diff) | |
download | servo-86d2008137f48432ba14aed5009775cfd4dadcc5.tar.gz servo-86d2008137f48432ba14aed5009775cfd4dadcc5.zip |
Introduce GlobalScope::report_an_error
Diffstat (limited to 'components/script/dom/globalscope.rs')
-rw-r--r-- | components/script/dom/globalscope.rs | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index 33873f4668f..95cd8c4bd4a 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -5,16 +5,21 @@ use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId}; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; +use dom::bindings::error::ErrorInfo; use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, MutNullableHeap, Root}; use dom::bindings::reflector::Reflectable; use dom::bindings::str::DOMString; use dom::crypto::Crypto; +use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; +use dom::errorevent::ErrorEvent; +use dom::event::{Event, EventBubbles, EventCancelable}; +use dom::eventdispatcher::EventStatus; use dom::eventtarget::EventTarget; use dom::window::Window; use dom::workerglobalscope::WorkerGlobalScope; use ipc_channel::ipc::IpcSender; -use js::jsapi::{JS_GetContext, JS_GetObjectRuntime, JSContext}; +use js::jsapi::{HandleValue, JS_GetContext, JS_GetObjectRuntime, JSContext}; use msg::constellation_msg::PipelineId; use profile_traits::{mem, time}; use script_traits::{ScriptMsg as ConstellationMsg, TimerEventRequest}; @@ -58,6 +63,9 @@ pub struct GlobalScope { #[ignore_heap_size_of = "channels are hard"] scheduler_chan: IpcSender<TimerEventRequest>, + + /// https://html.spec.whatwg.org/multipage/#in-error-reporting-mode + in_error_reporting_mode: Cell<bool>, } impl GlobalScope { @@ -81,6 +89,7 @@ impl GlobalScope { time_profiler_chan: time_profiler_chan, constellation_chan: constellation_chan, scheduler_chan: scheduler_chan, + in_error_reporting_mode: Default::default(), } } @@ -195,6 +204,42 @@ impl GlobalScope { pub fn as_window(&self) -> &Window { self.downcast::<Window>().expect("expected a Window scope") } + + /// https://html.spec.whatwg.org/multipage/#report-the-error + pub fn report_an_error(&self, error_info: ErrorInfo, value: HandleValue) { + // Step 1. + if self.in_error_reporting_mode.get() { + return; + } + + // Step 2. + self.in_error_reporting_mode.set(true); + + // Steps 3-12. + // FIXME(#13195): muted errors. + let event = ErrorEvent::new(self, + atom!("error"), + EventBubbles::DoesNotBubble, + EventCancelable::Cancelable, + error_info.message.as_str().into(), + error_info.filename.as_str().into(), + error_info.lineno, + error_info.column, + value); + + // Step 13. + let event_status = event.upcast::<Event>().fire(self.upcast::<EventTarget>()); + + // Step 15 + if event_status == EventStatus::NotCanceled { + if let Some(dedicated) = self.downcast::<DedicatedWorkerGlobalScope>() { + dedicated.forward_error_to_worker_object(error_info); + } + } + + // Step 14 + self.in_error_reporting_mode.set(false); + } } fn timestamp_in_ms(time: Timespec) -> u64 { |