From 5bf44d1690c883b81a4e1cc7ccbd27539525d295 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Tue, 6 Sep 2016 12:35:39 -0500 Subject: [PATCH] servo: Merge #13174 - Prepare for error reporting in workers (from servo:error-workers); r=nox Source-Repo: https://github.com/servo/servo Source-Revision: 3631e314b93746e04944de9f9b77b994420b0bf6 --- servo/components/script/dom/abstractworker.rs | 22 -------------- servo/components/script/dom/bindings/error.rs | 4 +-- .../components/script/dom/bindings/global.rs | 10 +++++++ servo/components/script/dom/serviceworker.rs | 30 ++----------------- servo/components/script/dom/worker.rs | 28 +---------------- 5 files changed, 15 insertions(+), 79 deletions(-) diff --git a/servo/components/script/dom/abstractworker.rs b/servo/components/script/dom/abstractworker.rs index 28c755d4f03c..6c5abd0d0207 100644 --- a/servo/components/script/dom/abstractworker.rs +++ b/servo/components/script/dom/abstractworker.rs @@ -4,7 +4,6 @@ use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::Reflectable; -use dom::bindings::str::DOMString; use dom::bindings::structuredclone::StructuredCloneData; use js::jsapi::{JSRuntime, JS_RequestInterruptCallback}; use js::rust::Runtime; @@ -30,27 +29,6 @@ impl SimpleWorkerErrorHandler { } } -pub struct WorkerErrorHandler { - pub addr: Trusted, - pub msg: DOMString, - pub file_name: DOMString, - pub line_num: u32, - pub col_num: u32, -} - -impl WorkerErrorHandler { - pub fn new(addr: Trusted, msg: DOMString, file_name: DOMString, line_num: u32, col_num: u32) - -> WorkerErrorHandler { - WorkerErrorHandler { - addr: addr, - msg: msg, - file_name: file_name, - line_num: line_num, - col_num: col_num, - } - } -} - #[derive(Copy, Clone)] pub struct SharedRt { pub rt: *mut JSRuntime diff --git a/servo/components/script/dom/bindings/error.rs b/servo/components/script/dom/bindings/error.rs index c111bb62a2af..88ed079d2baf 100644 --- a/servo/components/script/dom/bindings/error.rs +++ b/servo/components/script/dom/bindings/error.rs @@ -245,9 +245,7 @@ pub unsafe fn report_pending_exception(cx: *mut JSContext, dispatch_event: bool) if dispatch_event { let global = global_root_from_context(cx); - if let GlobalRef::Window(window) = global.r() { - window.report_an_error(error_info, value.handle()); - } + global.r().report_an_error(error_info, value.handle()); } } } diff --git a/servo/components/script/dom/bindings/global.rs b/servo/components/script/dom/bindings/global.rs index bfc3212a9c45..af4cd59a86f6 100644 --- a/servo/components/script/dom/bindings/global.rs +++ b/servo/components/script/dom/bindings/global.rs @@ -10,11 +10,13 @@ use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId}; use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::conversions::root_from_object; +use dom::bindings::error::ErrorInfo; use dom::bindings::js::Root; use dom::bindings::reflector::{Reflectable, Reflector}; use dom::window::{self, ScriptHelpers}; use dom::workerglobalscope::WorkerGlobalScope; use ipc_channel::ipc::IpcSender; +use js::jsapi::HandleValue; use js::jsapi::{CurrentGlobalOrNull, GetGlobalForObjectCrossCompartment}; use js::jsapi::{JSContext, JSObject, JS_GetClass, MutableHandleValue}; use js::{JSCLASS_IS_DOMJSCLASS, JSCLASS_IS_GLOBAL}; @@ -285,6 +287,14 @@ impl<'a> GlobalRef<'a> { GlobalRef::Worker(ref worker) => worker.get_runnable_wrapper(), } } + + /// https://html.spec.whatwg.org/multipage/#report-the-error + pub fn report_an_error(&self, error_info: ErrorInfo, value: HandleValue) { + match *self { + GlobalRef::Window(ref window) => window.report_an_error(error_info, value), + GlobalRef::Worker(_) => (), + } + } } impl GlobalRoot { diff --git a/servo/components/script/dom/serviceworker.rs b/servo/components/script/dom/serviceworker.rs index 19af9b09ba4e..2b79be43dc85 100644 --- a/servo/components/script/dom/serviceworker.rs +++ b/servo/components/script/dom/serviceworker.rs @@ -2,8 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use dom::abstractworker::WorkerScriptMsg; -use dom::abstractworker::{SimpleWorkerErrorHandler, WorkerErrorHandler}; +use dom::abstractworker::{SimpleWorkerErrorHandler, WorkerScriptMsg}; use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::ServiceWorkerBinding::{ServiceWorkerMethods, ServiceWorkerState, Wrap}; @@ -11,12 +10,9 @@ use dom::bindings::global::GlobalRef; use dom::bindings::inheritance::Castable; use dom::bindings::js::Root; use dom::bindings::refcounted::Trusted; -use dom::bindings::reflector::{Reflectable, reflect_dom_object}; -use dom::bindings::str::{DOMString, USVString}; -use dom::errorevent::ErrorEvent; -use dom::event::{Event, EventBubbles, EventCancelable}; +use dom::bindings::reflector::reflect_dom_object; +use dom::bindings::str::USVString; use dom::eventtarget::EventTarget; -use js::jsval::UndefinedValue; use script_thread::Runnable; use std::cell::Cell; use std::sync::mpsc::Sender; @@ -66,18 +62,6 @@ impl ServiceWorker { Url::parse(&self.script_url.borrow().clone()).unwrap() } - pub fn handle_error_message(address: TrustedServiceWorkerAddress, message: DOMString, - filename: DOMString, lineno: u32, colno: u32) { - let worker = address.root(); - - let global = worker.r().global(); - rooted!(in(global.r().get_cx()) let error = UndefinedValue()); - let errorevent = ErrorEvent::new(global.r(), atom!("error"), - EventBubbles::Bubbles, EventCancelable::Cancelable, - message, filename, lineno, colno, error.handle()); - errorevent.upcast::().fire(worker.upcast()); - } - pub fn install_serviceworker(global: GlobalRef, script_url: Url, skip_waiting: bool) -> Root { @@ -112,11 +96,3 @@ impl Runnable for SimpleWorkerErrorHandler { ServiceWorker::dispatch_simple_error(this.addr); } } - -impl Runnable for WorkerErrorHandler { - #[allow(unrooted_must_root)] - fn handler(self: Box>) { - let this = *self; - ServiceWorker::handle_error_message(this.addr, this.msg, this.file_name, this.line_num, this.col_num); - } -} diff --git a/servo/components/script/dom/worker.rs b/servo/components/script/dom/worker.rs index c1ad7cf5a96e..f171d1ee5154 100644 --- a/servo/components/script/dom/worker.rs +++ b/servo/components/script/dom/worker.rs @@ -4,7 +4,7 @@ use devtools_traits::{ScriptToDevtoolsControlMsg, DevtoolsPageInfo}; use dom::abstractworker::WorkerScriptMsg; -use dom::abstractworker::{SimpleWorkerErrorHandler, SharedRt, WorkerErrorHandler}; +use dom::abstractworker::{SimpleWorkerErrorHandler, SharedRt}; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::WorkerBinding; use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods; @@ -17,8 +17,6 @@ use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::str::DOMString; use dom::bindings::structuredclone::StructuredCloneData; use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; -use dom::errorevent::ErrorEvent; -use dom::event::{Event, EventBubbles, EventCancelable}; use dom::eventtarget::EventTarget; use dom::messageevent::MessageEvent; use dom::workerglobalscope::prepare_workerscope_init; @@ -139,22 +137,6 @@ impl Worker { let worker = address.root(); worker.upcast().fire_simple_event("error"); } - - pub fn handle_error_message(address: TrustedWorkerAddress, message: DOMString, - filename: DOMString, lineno: u32, colno: u32) { - let worker = address.root(); - - if worker.is_terminated() { - return; - } - - let global = worker.r().global(); - rooted!(in(global.r().get_cx()) let error = UndefinedValue()); - let errorevent = ErrorEvent::new(global.r(), atom!("error"), - EventBubbles::Bubbles, EventCancelable::Cancelable, - message, filename, lineno, colno, error.handle()); - errorevent.upcast::().fire(worker.upcast()); - } } impl WorkerMethods for Worker { @@ -220,11 +202,3 @@ impl Runnable for SimpleWorkerErrorHandler { Worker::dispatch_simple_error(this.addr); } } - -impl Runnable for WorkerErrorHandler { - #[allow(unrooted_must_root)] - fn handler(self: Box>) { - let this = *self; - Worker::handle_error_message(this.addr, this.msg, this.file_name, this.line_num, this.col_num); - } -}