mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
begin messageport, transferable objects, impl
Accept transfer argument for StructuredCloneData::write Allow structured clone reads to return a boolean Add Transferable trait Add basic skeletons to MessagePort Implement transfer and transfer-receiving steps on MessagePort Use transfer and transfer_receive in StructuredClone callbacks Implement MessageChannel Freeze the array object for the MessageEvent ports attribute Implement transfer argument on window.postMessage Use ReentrantMutex instead for MessagePortInternal Accept origin as a parameter in dispatch_jsval Fix BorrowMut crash with pending_port_message Detach port on closure and check for detached during transfer Enable webmessaging tests fix webidl fix
This commit is contained in:
parent
605ddbecd4
commit
c3b17c1201
37 changed files with 801 additions and 81 deletions
|
@ -137,7 +137,11 @@ impl Worker {
|
|||
self.terminated.get()
|
||||
}
|
||||
|
||||
pub fn handle_message(address: TrustedWorkerAddress, data: StructuredCloneData) {
|
||||
pub fn handle_message(
|
||||
address: TrustedWorkerAddress,
|
||||
origin: String,
|
||||
data: StructuredCloneData,
|
||||
) {
|
||||
let worker = address.root();
|
||||
|
||||
if worker.is_terminated() {
|
||||
|
@ -148,8 +152,8 @@ impl Worker {
|
|||
let target = worker.upcast();
|
||||
let _ac = enter_realm(target);
|
||||
rooted!(in(*global.get_cx()) let mut message = UndefinedValue());
|
||||
data.read(&global, message.handle_mut());
|
||||
MessageEvent::dispatch_jsval(target, &global, message.handle(), None, None);
|
||||
assert!(data.read(&global, message.handle_mut()));
|
||||
MessageEvent::dispatch_jsval(target, &global, message.handle(), Some(&origin), None, vec![]);
|
||||
}
|
||||
|
||||
pub fn dispatch_simple_error(address: TrustedWorkerAddress) {
|
||||
|
@ -161,14 +165,18 @@ impl Worker {
|
|||
impl WorkerMethods for Worker {
|
||||
// https://html.spec.whatwg.org/multipage/#dom-worker-postmessage
|
||||
fn PostMessage(&self, cx: JSContext, message: HandleValue) -> ErrorResult {
|
||||
let data = StructuredCloneData::write(*cx, message)?;
|
||||
rooted!(in(*cx) let transfer = UndefinedValue());
|
||||
let data = StructuredCloneData::write(*cx, message, transfer.handle())?;
|
||||
let address = Trusted::new(self);
|
||||
|
||||
// NOTE: step 9 of https://html.spec.whatwg.org/multipage/#dom-messageport-postmessage
|
||||
// indicates that a nonexistent communication channel should result in a silent error.
|
||||
let _ = self.sender.send(DedicatedWorkerScriptMsg::CommonWorker(
|
||||
address,
|
||||
WorkerScriptMsg::DOMMessage(data),
|
||||
WorkerScriptMsg::DOMMessage {
|
||||
origin: self.global().origin().immutable().ascii_serialization(),
|
||||
data,
|
||||
},
|
||||
));
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue