diff options
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 4 | ||||
-rw-r--r-- | components/script/dom/worker.rs | 31 |
2 files changed, 34 insertions, 1 deletions
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index d7b68f933b6..32314d8fc8a 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -18,7 +18,7 @@ use dom::bindings::utils::Reflectable; use dom::errorevent::ErrorEvent; use dom::eventtarget::{EventTarget, EventTargetHelpers, EventTargetTypeId}; use dom::messageevent::MessageEvent; -use dom::worker::{TrustedWorkerAddress, WorkerMessageHandler, Worker}; +use dom::worker::{TrustedWorkerAddress, WorkerMessageHandler, WorkerEventHandler, Worker}; use dom::workerglobalscope::{WorkerGlobalScope, WorkerGlobalScopeHelpers}; use dom::workerglobalscope::WorkerGlobalScopeTypeId; use script_task::{ScriptTask, ScriptChan, ScriptMsg, TimerSource}; @@ -146,6 +146,8 @@ impl DedicatedWorkerGlobalScope { let (url, source) = match load_whole_resource(&resource_task, worker_url.clone()) { Err(_) => { println!("error loading script {}", worker_url.serialize()); + parent_sender.send(ScriptMsg::RunnableMsg( + box WorkerEventHandler::new(worker))); return; } Ok((metadata, bytes)) => { diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 530d34683f3..705d49b6445 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -92,6 +92,18 @@ impl Worker { MessageEvent::dispatch_jsval(target, global.r(), message); } + pub fn dispatch_simple_error(address: TrustedWorkerAddress) { + let worker = address.to_temporary().root(); + let global = worker.r().global.root(); + let target: JSRef<EventTarget> = EventTargetCast::from_ref(worker.r()); + + let event = Event::new(global.r(), + "error".to_owned(), + EventBubbles::DoesNotBubble, + EventCancelable::NotCancelable).root(); + event.r().fire(target); + } + pub fn handle_error_message(address: TrustedWorkerAddress, message: DOMString, filename: DOMString, lineno: u32, colno: u32) { let worker = address.to_temporary().root(); @@ -137,3 +149,22 @@ impl Runnable for WorkerMessageHandler { Worker::handle_message(this.addr, this.data); } } + +pub struct WorkerEventHandler { + addr: TrustedWorkerAddress, +} + +impl WorkerEventHandler { + pub fn new(addr: TrustedWorkerAddress) -> WorkerEventHandler { + WorkerEventHandler { + addr: addr + } + } +} + +impl Runnable for WorkerEventHandler { + fn handler(self: Box<WorkerEventHandler>) { + let this = *self; + Worker::dispatch_simple_error(this.addr); + } +} |