mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +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
|
@ -462,13 +462,20 @@ impl DedicatedWorkerGlobalScope {
|
|||
|
||||
fn handle_script_event(&self, msg: WorkerScriptMsg) {
|
||||
match msg {
|
||||
WorkerScriptMsg::DOMMessage(data) => {
|
||||
WorkerScriptMsg::DOMMessage { origin, data } => {
|
||||
let scope = self.upcast::<WorkerGlobalScope>();
|
||||
let target = self.upcast();
|
||||
let _ac = enter_realm(self);
|
||||
rooted!(in(*scope.get_cx()) let mut message = UndefinedValue());
|
||||
data.read(scope.upcast(), message.handle_mut());
|
||||
MessageEvent::dispatch_jsval(target, scope.upcast(), message.handle(), None, None);
|
||||
assert!(data.read(scope.upcast(), message.handle_mut()));
|
||||
MessageEvent::dispatch_jsval(
|
||||
target,
|
||||
scope.upcast(),
|
||||
message.handle(),
|
||||
Some(&origin),
|
||||
None,
|
||||
vec![],
|
||||
);
|
||||
},
|
||||
WorkerScriptMsg::Common(msg) => {
|
||||
self.upcast::<WorkerGlobalScope>().process_event(msg);
|
||||
|
@ -562,11 +569,13 @@ unsafe extern "C" fn interrupt_callback(cx: *mut JSContext) -> bool {
|
|||
impl DedicatedWorkerGlobalScopeMethods for DedicatedWorkerGlobalScope {
|
||||
// https://html.spec.whatwg.org/multipage/#dom-dedicatedworkerglobalscope-postmessage
|
||||
fn PostMessage(&self, cx: SafeJSContext, message: HandleValue) -> ErrorResult {
|
||||
let data = StructuredCloneData::write(*cx, message)?;
|
||||
rooted!(in(*cx) let transfer = UndefinedValue());
|
||||
let data = StructuredCloneData::write(*cx, message, transfer.handle())?;
|
||||
let worker = self.worker.borrow().as_ref().unwrap().clone();
|
||||
let pipeline_id = self.upcast::<GlobalScope>().pipeline_id();
|
||||
let pipeline_id = self.global().pipeline_id();
|
||||
let origin = self.global().origin().immutable().ascii_serialization();
|
||||
let task = Box::new(task!(post_worker_message: move || {
|
||||
Worker::handle_message(worker, data);
|
||||
Worker::handle_message(worker, origin, data);
|
||||
}));
|
||||
// TODO: Change this task source to a new `unshipped-port-message-queue` task source
|
||||
self.parent_sender
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue