Use task! to forward unhandled errors to worker objects

This commit is contained in:
Anthony Ramine 2017-09-18 09:45:20 +02:00
parent c53d1e46b4
commit 1fa0e21e4b
4 changed files with 44 additions and 78 deletions

View file

@ -15,15 +15,18 @@ use dom::bindings::js::{Root, RootCollection};
use dom::bindings::reflector::DomObject;
use dom::bindings::str::DOMString;
use dom::bindings::structuredclone::StructuredCloneData;
use dom::errorevent::ErrorEvent;
use dom::event::{Event, EventBubbles, EventCancelable, EventStatus};
use dom::eventtarget::EventTarget;
use dom::globalscope::GlobalScope;
use dom::messageevent::MessageEvent;
use dom::worker::{TrustedWorkerAddress, Worker, WorkerErrorHandler};
use dom::worker::{TrustedWorkerAddress, Worker};
use dom::workerglobalscope::WorkerGlobalScope;
use dom_struct::dom_struct;
use ipc_channel::ipc::{self, IpcReceiver, IpcSender};
use ipc_channel::router::ROUTER;
use js::jsapi::{HandleValue, JS_SetInterruptCallback};
use js::jsapi::{JSAutoCompartment, JSContext};
use js::jsapi::{JSAutoCompartment, JSContext, NullHandleValue};
use js::jsval::UndefinedValue;
use js::rust::Runtime;
use msg::constellation_msg::TopLevelBrowsingContextId;
@ -348,13 +351,36 @@ impl DedicatedWorkerGlobalScope {
}
}
// https://html.spec.whatwg.org/multipage/#runtime-script-errors-2
#[allow(unsafe_code)]
pub fn forward_error_to_worker_object(&self, error_info: ErrorInfo) {
let worker = self.worker.borrow().as_ref().unwrap().clone();
let task = box task!(forward_error_to_worker_object: move || {
let worker = worker.root();
let global = worker.global();
// Step 1.
let event = ErrorEvent::new(
&global,
atom!("error"),
EventBubbles::DoesNotBubble,
EventCancelable::Cancelable,
error_info.message.as_str().into(),
error_info.filename.as_str().into(),
error_info.lineno,
error_info.column,
unsafe { NullHandleValue },
);
let event_status =
event.upcast::<Event>().fire(worker.upcast::<EventTarget>());
// Step 2.
if event_status == EventStatus::NotCanceled {
global.report_an_error(error_info, unsafe { NullHandleValue });
}
});
// TODO: Should use the DOM manipulation task source.
self.parent_sender
.send(CommonScriptMsg::Task(WorkerEvent,
box WorkerErrorHandler::new(worker, error_info)))
.unwrap();
self.parent_sender.send(CommonScriptMsg::Task(WorkerEvent, task)).unwrap();
}
}