diff options
author | Kunal Mohan <kunalmohan99@gmail.com> | 2019-12-13 11:01:16 +0530 |
---|---|---|
committer | Kunal Mohan <kunalmohan99@gmail.com> | 2019-12-18 23:01:53 +0530 |
commit | cb1cb40a517590119162a428318e3a051c59f710 (patch) | |
tree | f53d6e71c1125b35a8ca8148f2c82658e6014b78 /components/script/dom/messageevent.rs | |
parent | dcdf910a259005bbdd993089d12f9f7eca9a26db (diff) | |
download | servo-cb1cb40a517590119162a428318e3a051c59f710.tar.gz servo-cb1cb40a517590119162a428318e3a051c59f710.zip |
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.
Diffstat (limited to 'components/script/dom/messageevent.rs')
-rw-r--r-- | components/script/dom/messageevent.rs | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/components/script/dom/messageevent.rs b/components/script/dom/messageevent.rs index 9d9e5f88e35..cc5725ffb6c 100644 --- a/components/script/dom/messageevent.rs +++ b/components/script/dom/messageevent.rs @@ -2,6 +2,7 @@ * 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/. */ +use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::EventBinding::EventMethods; use crate::dom::bindings::codegen::Bindings::MessageEventBinding; use crate::dom::bindings::codegen::Bindings::MessageEventBinding::MessageEventMethods; @@ -56,10 +57,10 @@ pub struct MessageEvent { event: Event, #[ignore_malloc_size_of = "mozjs"] data: Heap<JSVal>, - origin: DOMString, - source: Option<SrcObject>, - lastEventId: DOMString, - ports: Vec<DomRoot<MessagePort>>, + origin: DomRefCell<DOMString>, + source: DomRefCell<Option<SrcObject>>, + lastEventId: DomRefCell<DOMString>, + ports: DomRefCell<Vec<DomRoot<MessagePort>>>, } impl MessageEvent { @@ -85,10 +86,10 @@ impl MessageEvent { let ev = Box::new(MessageEvent { event: Event::new_inherited(), data: Heap::default(), - source: source.map(|source| source.into()), - origin, - lastEventId, - ports, + source: DomRefCell::new(source.map(|source| source.into())), + origin: DomRefCell::new(origin), + lastEventId: DomRefCell::new(lastEventId), + ports: DomRefCell::new(ports), }); let ev = reflect_dom_object(ev, global, MessageEventBinding::Wrap); ev.data.set(data.get()); @@ -187,12 +188,12 @@ impl MessageEventMethods for MessageEvent { /// <https://html.spec.whatwg.org/multipage/#dom-messageevent-origin> fn Origin(&self) -> DOMString { - self.origin.clone() + self.origin.borrow().clone() } // https://html.spec.whatwg.org/multipage/#dom-messageevent-source fn GetSource(&self) -> Option<WindowProxyOrMessagePortOrServiceWorker> { - match &self.source { + match &*self.source.borrow() { Some(SrcObject::WindowProxy(i)) => Some( WindowProxyOrMessagePortOrServiceWorker::WindowProxy(DomRoot::from_ref(&*i)), ), @@ -208,7 +209,7 @@ impl MessageEventMethods for MessageEvent { /// <https://html.spec.whatwg.org/multipage/#dom-messageevent-lasteventid> fn LastEventId(&self) -> DOMString { - self.lastEventId.clone() + self.lastEventId.borrow().clone() } /// <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> 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); } } |