aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/window.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/window.rs')
-rw-r--r--components/script/dom/window.rs37
1 files changed, 26 insertions, 11 deletions
diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs
index 565308ff36f..7f3b6d1fb8d 100644
--- a/components/script/dom/window.rs
+++ b/components/script/dom/window.rs
@@ -17,6 +17,7 @@ use crate::dom::bindings::codegen::Bindings::WindowBinding::{
};
use crate::dom::bindings::codegen::Bindings::WindowBinding::{ScrollBehavior, ScrollToOptions};
use crate::dom::bindings::codegen::UnionTypes::RequestOrUSVString;
+use crate::dom::bindings::conversions::ToJSValConvertible;
use crate::dom::bindings::error::{Error, ErrorResult, Fallible};
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::num::Finite;
@@ -43,6 +44,7 @@ use crate::dom::location::Location;
use crate::dom::mediaquerylist::{MediaQueryList, MediaQueryListMatchState};
use crate::dom::mediaquerylistevent::MediaQueryListEvent;
use crate::dom::messageevent::MessageEvent;
+use crate::dom::messageport::TRANSFERRED_MESSAGE_PORTS;
use crate::dom::navigator::Navigator;
use crate::dom::node::{document_from_node, from_untrusted_node_address, Node, NodeDamage};
use crate::dom::performance::Performance;
@@ -80,12 +82,13 @@ use euclid::{Point2D, Rect, Scale, Size2D, Vector2D};
use ipc_channel::ipc::{channel, IpcSender};
use ipc_channel::router::ROUTER;
use js::jsapi::JSAutoRealm;
+use js::jsapi::JSObject;
use js::jsapi::JSPROP_ENUMERATE;
use js::jsapi::{GCReason, JS_GC};
use js::jsval::UndefinedValue;
use js::jsval::{JSVal, NullValue};
use js::rust::wrappers::JS_DefineProperty;
-use js::rust::HandleValue;
+use js::rust::{CustomAutoRooterGuard, HandleValue};
use media::WindowGLContext;
use msg::constellation_msg::PipelineId;
use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse};
@@ -969,12 +972,18 @@ impl WindowMethods for Window {
}
// https://html.spec.whatwg.org/multipage/#dom-window-postmessage
- fn PostMessage(&self, cx: JSContext, message: HandleValue, origin: DOMString) -> ErrorResult {
+ fn PostMessage(
+ &self,
+ cx: JSContext,
+ message: HandleValue,
+ origin: USVString,
+ transfer: CustomAutoRooterGuard<Option<Vec<*mut JSObject>>>,
+ ) -> ErrorResult {
let source_global = GlobalScope::incumbent().expect("no incumbent global??");
let source = source_global.as_window();
// Step 3-5.
- let origin = match &origin[..] {
+ let origin = match &origin.0[..] {
"*" => None,
"/" => Some(source.Document().origin().immutable().clone()),
url => match ServoUrl::parse(&url) {
@@ -984,8 +993,10 @@ impl WindowMethods for Window {
};
// Step 1-2, 6-8.
- // TODO(#12717): Should implement the `transfer` argument.
- let data = StructuredCloneData::write(*cx, message)?;
+ rooted!(in(*cx) let mut val = UndefinedValue());
+ (*transfer).as_ref().unwrap_or(&Vec::new()).to_jsval(*cx, val.handle_mut());
+
+ let data = StructuredCloneData::write(*cx, message, val.handle())?;
// Step 9.
self.post_message(origin, &*source.window_proxy(), data);
@@ -2342,10 +2353,11 @@ impl Window {
let task = task!(post_serialised_message: move || {
let this = this.root();
let source = source.root();
+ let document = this.Document();
// Step 7.1.
- if let Some(target_origin) = target_origin {
- if !target_origin.same_origin(this.Document().origin()) {
+ if let Some(ref target_origin) = target_origin {
+ if !target_origin.same_origin(document.origin()) {
return;
}
}
@@ -2355,13 +2367,15 @@ impl Window {
let obj = this.reflector().get_jsobject();
let _ac = JSAutoRealm::new(*cx, obj.get());
rooted!(in(*cx) let mut message_clone = UndefinedValue());
- serialize_with_transfer_result.read(
+ assert!(serialize_with_transfer_result.read(
this.upcast(),
message_clone.handle_mut(),
- );
+ ));
// Step 7.6.
- // TODO: MessagePort array.
+ let new_ports = TRANSFERRED_MESSAGE_PORTS.with(|list| {
+ mem::replace(&mut *list.borrow_mut(), vec![])
+ });
// Step 7.7.
// TODO(#12719): Set the other attributes.
@@ -2369,8 +2383,9 @@ impl Window {
this.upcast(),
this.upcast(),
message_clone.handle(),
- None,
+ Some(&document.origin().immutable().ascii_serialization()),
Some(&*source),
+ new_ports,
);
});
// FIXME(nox): Why are errors silenced here?