Implement MessageEvent.InitMessageEvent

InitMessageEvent had to be implemented as required by wpt.
For this few keys of struct `MessageEvent` are now wrapped inside
DomRefCell wrapper.
This commit is contained in:
Kunal Mohan 2019-12-13 11:01:16 +05:30
parent dcdf910a25
commit cb1cb40a51
No known key found for this signature in database
GPG key ID: 2B475A4524237BAC
2 changed files with 46 additions and 12 deletions

View file

@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods;
use crate::dom::bindings::codegen::Bindings::MessageEventBinding; use crate::dom::bindings::codegen::Bindings::MessageEventBinding;
use crate::dom::bindings::codegen::Bindings::MessageEventBinding::MessageEventMethods; use crate::dom::bindings::codegen::Bindings::MessageEventBinding::MessageEventMethods;
@ -56,10 +57,10 @@ pub struct MessageEvent {
event: Event, event: Event,
#[ignore_malloc_size_of = "mozjs"] #[ignore_malloc_size_of = "mozjs"]
data: Heap<JSVal>, data: Heap<JSVal>,
origin: DOMString, origin: DomRefCell<DOMString>,
source: Option<SrcObject>, source: DomRefCell<Option<SrcObject>>,
lastEventId: DOMString, lastEventId: DomRefCell<DOMString>,
ports: Vec<DomRoot<MessagePort>>, ports: DomRefCell<Vec<DomRoot<MessagePort>>>,
} }
impl MessageEvent { impl MessageEvent {
@ -85,10 +86,10 @@ impl MessageEvent {
let ev = Box::new(MessageEvent { let ev = Box::new(MessageEvent {
event: Event::new_inherited(), event: Event::new_inherited(),
data: Heap::default(), data: Heap::default(),
source: source.map(|source| source.into()), source: DomRefCell::new(source.map(|source| source.into())),
origin, origin: DomRefCell::new(origin),
lastEventId, lastEventId: DomRefCell::new(lastEventId),
ports, ports: DomRefCell::new(ports),
}); });
let ev = reflect_dom_object(ev, global, MessageEventBinding::Wrap); let ev = reflect_dom_object(ev, global, MessageEventBinding::Wrap);
ev.data.set(data.get()); ev.data.set(data.get());
@ -187,12 +188,12 @@ impl MessageEventMethods for MessageEvent {
/// <https://html.spec.whatwg.org/multipage/#dom-messageevent-origin> /// <https://html.spec.whatwg.org/multipage/#dom-messageevent-origin>
fn Origin(&self) -> DOMString { fn Origin(&self) -> DOMString {
self.origin.clone() self.origin.borrow().clone()
} }
// https://html.spec.whatwg.org/multipage/#dom-messageevent-source // https://html.spec.whatwg.org/multipage/#dom-messageevent-source
fn GetSource(&self) -> Option<WindowProxyOrMessagePortOrServiceWorker> { fn GetSource(&self) -> Option<WindowProxyOrMessagePortOrServiceWorker> {
match &self.source { match &*self.source.borrow() {
Some(SrcObject::WindowProxy(i)) => Some( Some(SrcObject::WindowProxy(i)) => Some(
WindowProxyOrMessagePortOrServiceWorker::WindowProxy(DomRoot::from_ref(&*i)), WindowProxyOrMessagePortOrServiceWorker::WindowProxy(DomRoot::from_ref(&*i)),
), ),
@ -208,7 +209,7 @@ impl MessageEventMethods for MessageEvent {
/// <https://html.spec.whatwg.org/multipage/#dom-messageevent-lasteventid> /// <https://html.spec.whatwg.org/multipage/#dom-messageevent-lasteventid>
fn LastEventId(&self) -> DOMString { fn LastEventId(&self) -> DOMString {
self.lastEventId.clone() self.lastEventId.borrow().clone()
} }
/// <https://dom.spec.whatwg.org/#dom-event-istrusted> /// <https://dom.spec.whatwg.org/#dom-event-istrusted>
@ -218,6 +219,28 @@ impl MessageEventMethods for MessageEvent {
/// <https://html.spec.whatwg.org/multipage/#dom-messageevent-ports> /// <https://html.spec.whatwg.org/multipage/#dom-messageevent-ports>
fn Ports(&self, cx: JSContext) -> JSVal { fn Ports(&self, cx: JSContext) -> JSVal {
message_ports_to_frozen_array(self.ports.as_slice(), cx) message_ports_to_frozen_array(self.ports.borrow().as_slice(), cx)
}
/// <https://html.spec.whatwg.org/multipage/#dom-messageevent-initmessageevent>
fn InitMessageEvent(
&self,
_cx: JSContext,
type_: DOMString,
bubbles: bool,
cancelable: bool,
data: HandleValue,
origin: DOMString,
lastEventId: DOMString,
source: Option<WindowProxyOrMessagePortOrServiceWorker>,
ports: Vec<DomRoot<MessagePort>>,
) {
self.data.set(data.get());
*self.origin.borrow_mut() = origin.clone();
*self.source.borrow_mut() = source.as_ref().map(|source| source.into());
*self.lastEventId.borrow_mut() = lastEventId.clone();
*self.ports.borrow_mut() = ports;
self.event
.init_event(Atom::from(type_), bubbles, cancelable);
} }
} }

View file

@ -11,6 +11,17 @@ interface MessageEvent : Event {
readonly attribute DOMString lastEventId; readonly attribute DOMString lastEventId;
readonly attribute MessageEventSource? source; readonly attribute MessageEventSource? source;
readonly attribute /*FrozenArray<MessagePort>*/any ports; readonly attribute /*FrozenArray<MessagePort>*/any ports;
void initMessageEvent(
DOMString type,
optional boolean bubbles = false,
optional boolean cancelable = false,
optional any data = null,
optional DOMString origin = "",
optional DOMString lastEventId = "",
optional MessageEventSource? source = null,
optional sequence<MessagePort> ports = []
);
}; };
dictionary MessageEventInit : EventInit { dictionary MessageEventInit : EventInit {