mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Implement DedicatedWorkerGlobalScope.postMessage.
This commit is contained in:
parent
e8bd66cfa9
commit
82514dad6e
4 changed files with 27 additions and 1 deletions
|
@ -3,6 +3,7 @@
|
||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding;
|
use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding;
|
||||||
|
use dom::bindings::codegen::Bindings::DedicatedWorkerGlobalScopeBinding::DedicatedWorkerGlobalScopeMethods;
|
||||||
use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeDerived;
|
use dom::bindings::codegen::InheritTypes::DedicatedWorkerGlobalScopeDerived;
|
||||||
use dom::bindings::codegen::InheritTypes::{EventTargetCast, WorkerGlobalScopeCast};
|
use dom::bindings::codegen::InheritTypes::{EventTargetCast, WorkerGlobalScopeCast};
|
||||||
use dom::bindings::global::Worker;
|
use dom::bindings::global::Worker;
|
||||||
|
@ -18,9 +19,11 @@ use dom::workerglobalscope::WorkerGlobalScope;
|
||||||
use dom::xmlhttprequest::XMLHttpRequest;
|
use dom::xmlhttprequest::XMLHttpRequest;
|
||||||
use script_task::{ScriptTask, ScriptChan};
|
use script_task::{ScriptTask, ScriptChan};
|
||||||
use script_task::{ScriptMsg, DOMMessage, XHRProgressMsg, WorkerRelease};
|
use script_task::{ScriptMsg, DOMMessage, XHRProgressMsg, WorkerRelease};
|
||||||
|
use script_task::WorkerPostMessage;
|
||||||
use script_task::StackRootTLS;
|
use script_task::StackRootTLS;
|
||||||
|
|
||||||
use servo_net::resource_task::{ResourceTask, load_whole_resource};
|
use servo_net::resource_task::{ResourceTask, load_whole_resource};
|
||||||
|
use servo_util::str::DOMString;
|
||||||
|
|
||||||
use js::rust::Cx;
|
use js::rust::Cx;
|
||||||
|
|
||||||
|
@ -114,6 +117,9 @@ impl DedicatedWorkerGlobalScope {
|
||||||
Ok(XHRProgressMsg(addr, progress)) => {
|
Ok(XHRProgressMsg(addr, progress)) => {
|
||||||
XMLHttpRequest::handle_xhr_progress(addr, progress)
|
XMLHttpRequest::handle_xhr_progress(addr, progress)
|
||||||
},
|
},
|
||||||
|
Ok(WorkerPostMessage(addr, message)) => {
|
||||||
|
Worker::handle_message(addr, message);
|
||||||
|
},
|
||||||
Ok(WorkerRelease(addr)) => {
|
Ok(WorkerRelease(addr)) => {
|
||||||
Worker::handle_release(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 {
|
trait PrivateDedicatedWorkerGlobalScopeHelpers {
|
||||||
|
|
|
@ -6,5 +6,6 @@
|
||||||
[Global/*=Worker,DedicatedWorker*/]
|
[Global/*=Worker,DedicatedWorker*/]
|
||||||
/*sealed*/ interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
|
/*sealed*/ interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
|
||||||
//void postMessage(any message, optional sequence<Transferable> transfer);
|
//void postMessage(any message, optional sequence<Transferable> transfer);
|
||||||
|
void postMessage(DOMString message);
|
||||||
// attribute EventHandler onmessage;
|
// attribute EventHandler onmessage;
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
|
|
||||||
use dom::bindings::codegen::Bindings::WorkerBinding;
|
use dom::bindings::codegen::Bindings::WorkerBinding;
|
||||||
use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods;
|
use dom::bindings::codegen::Bindings::WorkerBinding::WorkerMethods;
|
||||||
|
use dom::bindings::codegen::InheritTypes::EventTargetCast;
|
||||||
use dom::bindings::error::{Fallible, Syntax};
|
use dom::bindings::error::{Fallible, Syntax};
|
||||||
use dom::bindings::global::{GlobalRef, GlobalField};
|
use dom::bindings::global::{GlobalRef, GlobalField};
|
||||||
use dom::bindings::js::{JS, JSRef, Temporary};
|
use dom::bindings::js::{JS, JSRef, Temporary};
|
||||||
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
|
use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object};
|
||||||
use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope;
|
use dom::dedicatedworkerglobalscope::DedicatedWorkerGlobalScope;
|
||||||
use dom::eventtarget::{EventTarget, WorkerTypeId};
|
use dom::eventtarget::{EventTarget, WorkerTypeId};
|
||||||
|
use dom::messageevent::MessageEvent;
|
||||||
use script_task::{ScriptChan, DOMMessage};
|
use script_task::{ScriptChan, DOMMessage};
|
||||||
|
|
||||||
use servo_util::str::DOMString;
|
use servo_util::str::DOMString;
|
||||||
|
@ -66,6 +68,14 @@ impl Worker {
|
||||||
|
|
||||||
Ok(Temporary::from_rooted(&*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 {
|
impl Worker {
|
||||||
|
|
|
@ -87,6 +87,8 @@ pub enum ScriptMsg {
|
||||||
/// Message sent through Worker.postMessage (only dispatched to
|
/// Message sent through Worker.postMessage (only dispatched to
|
||||||
/// DedicatedWorkerGlobalScope).
|
/// DedicatedWorkerGlobalScope).
|
||||||
DOMMessage(DOMString),
|
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).
|
/// Releases one reference to the Worker object (dispatched to all tasks).
|
||||||
WorkerRelease(TrustedWorkerAddress),
|
WorkerRelease(TrustedWorkerAddress),
|
||||||
}
|
}
|
||||||
|
@ -444,6 +446,7 @@ impl ScriptTask {
|
||||||
FromConstellation(ResizeMsg(..)) => fail!("should have handled ResizeMsg already"),
|
FromConstellation(ResizeMsg(..)) => fail!("should have handled ResizeMsg already"),
|
||||||
FromScript(XHRProgressMsg(addr, progress)) => XMLHttpRequest::handle_xhr_progress(addr, progress),
|
FromScript(XHRProgressMsg(addr, progress)) => XMLHttpRequest::handle_xhr_progress(addr, progress),
|
||||||
FromScript(DOMMessage(..)) => fail!("unexpected message"),
|
FromScript(DOMMessage(..)) => fail!("unexpected message"),
|
||||||
|
FromScript(WorkerPostMessage(addr, message)) => Worker::handle_message(addr, message),
|
||||||
FromScript(WorkerRelease(addr)) => Worker::handle_release(addr),
|
FromScript(WorkerRelease(addr)) => Worker::handle_release(addr),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue