diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/components/script/dom/dedicatedworkerglobalscope.rs | 14 | ||||
-rw-r--r-- | src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl | 1 | ||||
-rw-r--r-- | src/components/script/dom/worker.rs | 10 | ||||
-rw-r--r-- | src/components/script/script_task.rs | 3 |
4 files changed, 27 insertions, 1 deletions
diff --git a/src/components/script/dom/dedicatedworkerglobalscope.rs b/src/components/script/dom/dedicatedworkerglobalscope.rs index 654183757f6..bf3888cced6 100644 --- a/src/components/script/dom/dedicatedworkerglobalscope.rs +++ b/src/components/script/dom/dedicatedworkerglobalscope.rs @@ -3,6 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding; +use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding::DedicatedWorkerGlobalScopeMethods; use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeDerived; use dom::bindings::codegen::InheritTypes::{EventTargetCast, WorkerGlobalScopeCast}; use dom::bindings::global::Worker; @@ -18,9 +19,11 @@ use dom::workerglobalscope::WorkerGlobalScope; use dom::xmlhttprequest::XMLHttpRequest; use script_task::{ScriptTask, ScriptChan}; use script_task::{ScriptMsg, DOMMessage, XHRProgressMsg, WorkerRelease}; +use script_task::WorkerPostMessage; use script_task::StackRootTLS; use servo_net::resource_task::{ResourceTask, load_whole_resource}; +use servo_util::str::DOMString; use js::rust::Cx; @@ -114,6 +117,9 @@ impl DedicatedWorkerGlobalScope { Ok(XHRProgressMsg(addr, progress)) => { XMLHttpRequest::handle_xhr_progress(addr, progress) }, + Ok(WorkerPostMessage(addr, message)) => { + Worker::handle_message(addr, message); + }, Ok(WorkerRelease(addr)) => { Worker::handle_release(addr) }, @@ -125,7 +131,13 @@ impl DedicatedWorkerGlobalScope { } } -pub trait DedicatedWorkerGlobalScopeMethods { +impl<'a> DedicatedWorkerGlobalScopeMethods for JSRef<'a, DedicatedWorkerGlobalScope> { + fn PostMessage(&self, message: DOMString) { + let scope: &JSRef<WorkerGlobalScope> = + WorkerGlobalScopeCast::from_ref(self); + let ScriptChan(ref sender) = *scope.script_chan(); + sender.send(WorkerPostMessage(*self.worker, message)); + } } trait PrivateDedicatedWorkerGlobalScopeHelpers { diff --git a/src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl b/src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl index c0c69219e1e..d92b8a73911 100644 --- a/src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl +++ b/src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl @@ -6,5 +6,6 @@ [Global/*=Worker,DedicatedWorker*/] /*sealed*/ interface DedicatedWorkerGlobalScope : WorkerGlobalScope { //void postMessage(any message, optional sequence<Transferable> transfer); + void postMessage(DOMString message); // attribute EventHandler onmessage; }; diff --git a/src/components/script/dom/worker.rs b/src/components/script/dom/worker.rs index ff41b09e273..3b17375ee46 100644 --- a/src/components/script/dom/worker.rs +++ b/src/components/script/dom/worker.rs @@ -4,12 +4,14 @@ use dom::bindings::codegen::Bindings::WorkerBinding; use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods; +use dom::bindings::codegen::InheritTypes::EventTargetCast; use dom::bindings::error::{Fallible, Syntax}; use dom::bindings::global::{GlobalRef, GlobalField}; use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope; use dom::eventtarget::{EventTarget, WorkerTypeId}; +use dom::messageevent::MessageEvent; use script_task::{ScriptChan, DOMMessage}; use servo_util::str::DOMString; @@ -66,6 +68,14 @@ impl Worker { Ok(Temporary::from_rooted(&*worker)) } + + pub fn handle_message(address: TrustedWorkerAddress, message: DOMString) { + let worker = unsafe { JS::from_trusted_worker_address(address).root() }; + + let target: &JSRef<EventTarget> = EventTargetCast::from_ref(&*worker); + let global = worker.global.root(); + MessageEvent::dispatch(target, &global.root_ref(), message); + } } impl Worker { diff --git a/src/components/script/script_task.rs b/src/components/script/script_task.rs index 090cf38ee47..dd01017ff76 100644 --- a/src/components/script/script_task.rs +++ b/src/components/script/script_task.rs @@ -87,6 +87,8 @@ pub enum ScriptMsg { /// Message sent through Worker.postMessage (only dispatched to /// DedicatedWorkerGlobalScope). DOMMessage(DOMString), + /// Posts a message to the Worker object (dispatched to all tasks). + WorkerPostMessage(TrustedWorkerAddress, DOMString), /// Releases one reference to the Worker object (dispatched to all tasks). WorkerRelease(TrustedWorkerAddress), } @@ -444,6 +446,7 @@ impl ScriptTask { FromConstellation(ResizeMsg(..)) => fail!("should have handled ResizeMsg already"), FromScript(XHRProgressMsg(addr, progress)) => XMLHttpRequest::handle_xhr_progress(addr, progress), FromScript(DOMMessage(..)) => fail!("unexpected message"), + FromScript(WorkerPostMessage(addr, message)) => Worker::handle_message(addr, message), FromScript(WorkerRelease(addr)) => Worker::handle_release(addr), } } |