diff options
author | Josh Matthews <josh@joshmatthews.net> | 2018-12-20 16:16:51 -0500 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2019-01-07 22:19:25 -0500 |
commit | 45619db0ba0999d93b5715e1dae0ff49d1088ebe (patch) | |
tree | 5008ee0bf4c228a0eb906296e465f9e8f9b12756 /components/script/dom/messageevent.rs | |
parent | 212ae3b94a869f05a560288a0ec834d143ed7d37 (diff) | |
download | servo-45619db0ba0999d93b5715e1dae0ff49d1088ebe.tar.gz servo-45619db0ba0999d93b5715e1dae0ff49d1088ebe.zip |
Provide the source window as part of postMessage events.
Diffstat (limited to 'components/script/dom/messageevent.rs')
-rw-r--r-- | components/script/dom/messageevent.rs | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/components/script/dom/messageevent.rs b/components/script/dom/messageevent.rs index 65c8203913a..edde48f95e6 100644 --- a/components/script/dom/messageevent.rs +++ b/components/script/dom/messageevent.rs @@ -7,24 +7,27 @@ use crate::dom::bindings::codegen::Bindings::MessageEventBinding; use crate::dom::bindings::codegen::Bindings::MessageEventBinding::MessageEventMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; -use crate::dom::bindings::reflector::reflect_dom_object; -use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::bindings::trace::RootedTraceableBox; use crate::dom::event::Event; use crate::dom::eventtarget::EventTarget; use crate::dom::globalscope::GlobalScope; +use crate::dom::windowproxy::WindowProxy; use dom_struct::dom_struct; -use js::jsapi::{Heap, JSContext}; +use js::jsapi::{Heap, JSContext, JSObject}; use js::jsval::JSVal; use js::rust::HandleValue; use servo_atoms::Atom; +use std::ptr::NonNull; #[dom_struct] pub struct MessageEvent { event: Event, data: Heap<JSVal>, origin: DOMString, + source: Option<Dom<WindowProxy>>, lastEventId: DOMString, } @@ -34,6 +37,7 @@ impl MessageEvent { global, HandleValue::undefined(), DOMString::new(), + None, DOMString::new(), ) } @@ -42,12 +46,14 @@ impl MessageEvent { global: &GlobalScope, data: HandleValue, origin: DOMString, + source: Option<&WindowProxy>, lastEventId: DOMString, ) -> DomRoot<MessageEvent> { let ev = Box::new(MessageEvent { event: Event::new_inherited(), data: Heap::default(), origin: origin, + source: source.map(Dom::from_ref), lastEventId: lastEventId, }); let ev = reflect_dom_object(ev, global, MessageEventBinding::Wrap); @@ -63,9 +69,10 @@ impl MessageEvent { cancelable: bool, data: HandleValue, origin: DOMString, + source: Option<&WindowProxy>, lastEventId: DOMString, ) -> DomRoot<MessageEvent> { - let ev = MessageEvent::new_initialized(global, data, origin, lastEventId); + let ev = MessageEvent::new_initialized(global, data, origin, source, lastEventId); { let event = ev.upcast::<Event>(); event.init_event(type_, bubbles, cancelable); @@ -78,6 +85,10 @@ impl MessageEvent { type_: DOMString, init: RootedTraceableBox<MessageEventBinding::MessageEventInit>, ) -> Fallible<DomRoot<MessageEvent>> { + let source = init + .source + .as_ref() + .and_then(|inner| inner.as_ref().map(|source| source.window_proxy())); let ev = MessageEvent::new( global, Atom::from(type_), @@ -85,6 +96,7 @@ impl MessageEvent { init.parent.cancelable, init.data.handle(), init.origin.clone(), + source.as_ref().map(|source| &**source), init.lastEventId.clone(), ); Ok(ev) @@ -97,6 +109,7 @@ impl MessageEvent { scope: &GlobalScope, message: HandleValue, origin: Option<&str>, + source: Option<&WindowProxy>, ) { let messageevent = MessageEvent::new( scope, @@ -105,6 +118,7 @@ impl MessageEvent { false, message, DOMString::from(origin.unwrap_or("")), + source, DOMString::new(), ); messageevent.upcast::<Event>().fire(target); @@ -123,6 +137,14 @@ impl MessageEventMethods for MessageEvent { self.origin.clone() } + // https://html.spec.whatwg.org/multipage/#dom-messageevent-source + #[allow(unsafe_code)] + unsafe fn GetSource(&self, _cx: *mut JSContext) -> Option<NonNull<JSObject>> { + self.source + .as_ref() + .and_then(|source| NonNull::new(source.reflector().get_jsobject().get())) + } + // https://html.spec.whatwg.org/multipage/#dom-messageevent-lasteventid fn LastEventId(&self) -> DOMString { self.lastEventId.clone() |