aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/script/dom/dedicatedworkerglobalscope.rs14
-rw-r--r--src/components/script/dom/webidls/DedicatedWorkerGlobalScope.webidl1
-rw-r--r--src/components/script/dom/worker.rs10
-rw-r--r--src/components/script/script_task.rs3
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),
}
}