diff options
Diffstat (limited to 'components/script/dom/dedicatedworkerglobalscope.rs')
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index d4411a811fa..bc71b94144c 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -9,9 +9,9 @@ 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}; -use dom::bindings::error::ErrorResult; +use dom::bindings::error::{ErrorResult, report_pending_exception}; use dom::bindings::global::GlobalRef; -use dom::bindings::js::{JSRef, RootCollection, Rootable, Temporary}; +use dom::bindings::js::{RootCollection, Root}; use dom::bindings::refcounted::LiveDOMReferences; use dom::bindings::structuredclone::StructuredCloneData; use dom::bindings::utils::Reflectable; @@ -33,8 +33,9 @@ use util::task::spawn_named; use util::task_state; use util::task_state::{SCRIPT, IN_WORKER}; -use js::jsapi::JSContext; -use js::jsval::JSVal; +use js::jsapi::{JSContext, RootedValue, HandleValue}; +use js::jsapi::{JSAutoRequest, JSAutoCompartment}; +use js::jsval::UndefinedValue; use js::rust::Runtime; use url::Url; @@ -69,12 +70,12 @@ impl ScriptChan for SendableWorkerScriptChan { /// object only lives as long as necessary (ie. while events are being executed), while /// providing a reference that can be cloned freely. struct AutoWorkerReset<'a> { - workerscope: JSRef<'a, DedicatedWorkerGlobalScope>, + workerscope: &'a DedicatedWorkerGlobalScope, old_worker: Option<TrustedWorkerAddress>, } impl<'a> AutoWorkerReset<'a> { - fn new(workerscope: JSRef<'a, DedicatedWorkerGlobalScope>, worker: TrustedWorkerAddress) -> AutoWorkerReset<'a> { + fn new(workerscope: &'a DedicatedWorkerGlobalScope, worker: TrustedWorkerAddress) -> AutoWorkerReset<'a> { let reset = AutoWorkerReset { workerscope: workerscope, old_worker: workerscope.worker.borrow().clone() @@ -132,7 +133,7 @@ impl DedicatedWorkerGlobalScope { parent_sender: Box<ScriptChan+Send>, own_sender: Sender<(TrustedWorkerAddress, ScriptMsg)>, receiver: Receiver<(TrustedWorkerAddress, ScriptMsg)>) - -> Temporary<DedicatedWorkerGlobalScope> { + -> Root<DedicatedWorkerGlobalScope> { let scope = box DedicatedWorkerGlobalScope::new_inherited( worker_url, id, devtools_chan, runtime.clone(), resource_task, parent_sender, own_sender, receiver); @@ -170,7 +171,7 @@ impl DedicatedWorkerGlobalScope { let runtime = Rc::new(ScriptTask::new_rt_and_cx()); let global = DedicatedWorkerGlobalScope::new( worker_url, id, devtools_chan, runtime.clone(), resource_task, - parent_sender, own_sender, receiver).root(); + parent_sender, own_sender, receiver); { let _ar = AutoWorkerReset::new(global.r(), worker); @@ -178,7 +179,13 @@ impl DedicatedWorkerGlobalScope { match runtime.evaluate_script( global.r().reflector().get_jsobject(), source, url.serialize(), 1) { Ok(_) => (), - Err(_) => println!("evaluate_script failed") + Err(_) => { + // TODO: An error needs to be dispatched to the parent. + // https://github.com/servo/servo/issues/6422 + println!("evaluate_script failed"); + let _ar = JSAutoRequest::new(runtime.cx()); + report_pending_exception(runtime.cx(), global.r().reflector().get_jsobject().get()); + } } } @@ -202,7 +209,7 @@ pub trait DedicatedWorkerGlobalScopeHelpers { fn process_event(self, msg: ScriptMsg); } -impl<'a> DedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalScope> { +impl<'a> DedicatedWorkerGlobalScopeHelpers for &'a DedicatedWorkerGlobalScope { fn script_chan(self) -> Box<ScriptChan+Send> { // FIXME(https://github.com/rust-lang/rust/issues/23338) let worker = self.worker.borrow(); @@ -232,34 +239,37 @@ impl<'a> DedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalSc trait PrivateDedicatedWorkerGlobalScopeHelpers { fn handle_event(self, msg: ScriptMsg); - fn dispatch_error_to_worker(self, JSRef<ErrorEvent>); + fn dispatch_error_to_worker(self, &ErrorEvent); } -impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerGlobalScope> { +impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for &'a DedicatedWorkerGlobalScope { fn handle_event(self, msg: ScriptMsg) { match msg { ScriptMsg::DOMMessage(data) => { - let scope: JSRef<WorkerGlobalScope> = WorkerGlobalScopeCast::from_ref(self); - let target: JSRef<EventTarget> = EventTargetCast::from_ref(self); - let message = data.read(GlobalRef::Worker(scope)); - MessageEvent::dispatch_jsval(target, GlobalRef::Worker(scope), message); + let scope = WorkerGlobalScopeCast::from_ref(self); + let target = EventTargetCast::from_ref(self); + let _ar = JSAutoRequest::new(scope.get_cx()); + let _ac = JSAutoCompartment::new(scope.get_cx(), scope.reflector().get_jsobject().get()); + let mut message = RootedValue::new(scope.get_cx(), UndefinedValue()); + data.read(GlobalRef::Worker(scope), message.handle_mut()); + MessageEvent::dispatch_jsval(target, GlobalRef::Worker(scope), message.handle()); }, ScriptMsg::RunnableMsg(runnable) => { runnable.handler() }, ScriptMsg::RefcountCleanup(addr) => { - let scope: JSRef<WorkerGlobalScope> = WorkerGlobalScopeCast::from_ref(self); + let scope = WorkerGlobalScopeCast::from_ref(self); LiveDOMReferences::cleanup(scope.get_cx(), addr); } ScriptMsg::FireTimer(TimerSource::FromWorker, timer_id) => { - let scope: JSRef<WorkerGlobalScope> = WorkerGlobalScopeCast::from_ref(self); + let scope = WorkerGlobalScopeCast::from_ref(self); scope.handle_fire_timer(timer_id); } _ => panic!("Unexpected message"), } } - fn dispatch_error_to_worker(self, errorevent: JSRef<ErrorEvent>) { + fn dispatch_error_to_worker(self, errorevent: &ErrorEvent) { let msg = errorevent.Message(); let file_name = errorevent.Filename(); let line_num = errorevent.Lineno(); @@ -270,9 +280,9 @@ impl<'a> PrivateDedicatedWorkerGlobalScopeHelpers for JSRef<'a, DedicatedWorkerG } } -impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalScope> { +impl<'a> DedicatedWorkerGlobalScopeMethods for &'a DedicatedWorkerGlobalScope { // https://html.spec.whatwg.org/multipage/#dom-dedicatedworkerglobalscope-postmessage - fn PostMessage(self, cx: *mut JSContext, message: JSVal) -> ErrorResult { + fn PostMessage(self, cx: *mut JSContext, message: HandleValue) -> ErrorResult { let data = try!(StructuredCloneData::write(cx, message)); let worker = self.worker.borrow().as_ref().unwrap().clone(); self.parent_sender.send(ScriptMsg::RunnableMsg( |