diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-02-05 15:27:44 -0700 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-02-05 15:27:44 -0700 |
commit | c360b75e1640d5329068cfdbaa560b63ed03b35f (patch) | |
tree | 8053a32a482cb7dd0468b4c0773337eb7a7c8702 /components/script/dom | |
parent | 0d560806f8fd621c2744429ae534e93e1f2563cb (diff) | |
parent | 7309f2a4283a1e3afd1becec94a325b3bc1ec5ea (diff) | |
download | servo-c360b75e1640d5329068cfdbaa560b63ed03b35f.tar.gz servo-c360b75e1640d5329068cfdbaa560b63ed03b35f.zip |
auto merge of #4854 : jdm/servo/workererr, r=jdm
...rker object.
Rebased from #4537.
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 19 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 20 |
2 files changed, 36 insertions, 3 deletions
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index cbabe771163..d906e570ece 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -5,6 +5,7 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding; use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding::DedicatedWorkerGlobalScopeMethods; +use dom::bindings::codegen::Bindings::ErrorEventBinding::ErrorEventMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeDerived; use dom::bindings::codegen::InheritTypes::{EventTargetCast, WorkerGlobalScopeCast}; @@ -14,12 +15,14 @@ use dom::bindings::js::{JSRef, Temporary, RootCollection}; use dom::bindings::refcounted::LiveDOMReferences; use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::utils::Reflectable; +use dom::errorevent::ErrorEvent; use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId}; use dom::messageevent::MessageEvent; -use dom::worker::{TrustedWorkerAddress, WorkerMessageHandler}; +use dom::worker::{TrustedWorkerAddress, WorkerMessageHandler, Worker}; use dom::workerglobalscope::{WorkerGlobalScope, WorkerGlobalScopeHelpers}; use dom::workerglobalscope::WorkerGlobalScopeTypeId; use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource}; +use script_task::ScriptMsg::WorkerDispatchErrorEvent; use script_task::StackRootTLS; use servo_net::resource_task::{ResourceTask, load_whole_resource}; @@ -193,6 +196,7 @@ impl<'a> DedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalSc trait PrivateDedicatedWorkerGlobalScopeHelpers { fn handle_event(self, msg: ScriptMsg); + fn dispatch_error_to_worker(self, JSRef<ErrorEvent>); } impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalScope> { @@ -211,6 +215,9 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerG let scope: JSRef<WorkerGlobalScope> = WorkerGlobalScopeCast::from_ref(self); LiveDOMReferences::cleanup(scope.get_cx(), addr); } + ScriptMsg::WorkerDispatchErrorEvent(addr, msg, file_name, line_num, col_num) => { + Worker::handle_error_message(addr, msg, file_name, line_num, col_num); + }, ScriptMsg::FireTimer(TimerSource::FromWorker, timer_id) => { let scope: JSRef<WorkerGlobalScope> = WorkerGlobalScopeCast::from_ref(self); scope.handle_fire_timer(timer_id); @@ -218,6 +225,16 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerG _ => panic!("Unexpected message"), } } + + fn dispatch_error_to_worker(self, errorevent: JSRef<ErrorEvent>) { + let msg = errorevent.Message(); + let file_name = errorevent.Filename(); + let line_num = errorevent.Lineno(); + let col_num = errorevent.Colno(); + let worker = self.worker.borrow().as_ref().unwrap().clone(); + self.parent_sender.send(ScriptMsg::WorkerDispatchErrorEvent(worker, msg, file_name, + line_num, col_num)); + } } impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalScope> { diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 255890f5a07..530d34683f3 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -5,7 +5,7 @@ use dom::bindings::codegen::Bindings::WorkerBinding; use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; -use dom::bindings::codegen::InheritTypes::EventTargetCast; +use dom::bindings::codegen::InheritTypes::{EventCast, EventTargetCast}; use dom::bindings::error::{Fallible, ErrorResult}; use dom::bindings::error::Error::Syntax; use dom::bindings::global::{GlobalRef, GlobalField}; @@ -15,6 +15,8 @@ use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::trace::JSTraceable; use dom::bindings::utils::{Reflectable, reflect_dom_object}; use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; +use dom::errorevent::ErrorEvent; +use dom::event::{Event, EventBubbles, EventCancelable, EventHelpers}; use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId}; use dom::messageevent::MessageEvent; use script_task::{ScriptChan, ScriptMsg, Runnable}; @@ -22,9 +24,10 @@ use script_task::{ScriptChan, ScriptMsg, Runnable}; use util::str::DOMString; use js::jsapi::JSContext; -use js::jsval::JSVal; +use js::jsval::{JSVal, UndefinedValue}; use url::UrlParser; +use std::borrow::ToOwned; use std::cell::Cell; use std::sync::mpsc::{channel, Sender}; @@ -88,6 +91,19 @@ impl Worker { let message = data.read(global.r()); MessageEvent::dispatch_jsval(target, global.r(), message); } + + pub fn handle_error_message(address: TrustedWorkerAddress, message: DOMString, + filename: DOMString, lineno: u32, colno: u32) { + let worker = address.to_temporary().root(); + let global = worker.r().global.root(); + let error = UndefinedValue(); + let target: JSRef<EventTarget> = EventTargetCast::from_ref(worker.r()); + let errorevent = ErrorEvent::new(global.r(), "error".to_owned(), + EventBubbles::Bubbles, EventCancelable::Cancelable, + message, filename, lineno, colno, error).root(); + let event: JSRef<Event> = EventCast::from_ref(errorevent.r()); + event.fire(target); + } } impl<'a> WorkerMethods for JSRef<'a, Worker> { |