aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-02-05 15:27:44 -0700
committerbors-servo <metajack+bors@gmail.com>2015-02-05 15:27:44 -0700
commitc360b75e1640d5329068cfdbaa560b63ed03b35f (patch)
tree8053a32a482cb7dd0468b4c0773337eb7a7c8702 /components/script/dom
parent0d560806f8fd621c2744429ae534e93e1f2563cb (diff)
parent7309f2a4283a1e3afd1becec94a325b3bc1ec5ea (diff)
downloadservo-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.rs19
-rw-r--r--components/script/dom/worker.rs20
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> {