diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-07-16 14:18:52 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-07-16 14:53:22 +0200 |
commit | d40b97ea73a885479c1fb1d09f44c61ea1fbec3b (patch) | |
tree | b0731b550bc07d29b9fcd0a36a10fbaa0f3f4cc1 | |
parent | e8996d5ce57c473c33b3bf5c140f7e91dd811e91 (diff) | |
download | servo-d40b97ea73a885479c1fb1d09f44c61ea1fbec3b.tar.gz servo-d40b97ea73a885479c1fb1d09f44c61ea1fbec3b.zip |
Implement MessageEvent.
-rw-r--r-- | src/components/script/dom/event.rs | 1 | ||||
-rw-r--r-- | src/components/script/dom/messageevent.rs | 90 | ||||
-rw-r--r-- | src/components/script/dom/webidls/MessageEvent.webidl | 23 | ||||
-rw-r--r-- | src/components/script/script.rs | 1 | ||||
-rw-r--r-- | src/test/content/test_interfaces.html | 1 |
5 files changed, 116 insertions, 0 deletions
diff --git a/src/components/script/dom/event.rs b/src/components/script/dom/event.rs index e68f04f2821..8b159dd292e 100644 --- a/src/components/script/dom/event.rs +++ b/src/components/script/dom/event.rs @@ -40,6 +40,7 @@ pub enum EventTypeId { CustomEventTypeId, HTMLEventTypeId, KeyEventTypeId, + MessageEventTypeId, MouseEventTypeId, ProgressEventTypeId, UIEventTypeId diff --git a/src/components/script/dom/messageevent.rs b/src/components/script/dom/messageevent.rs new file mode 100644 index 00000000000..a9d536fad06 --- /dev/null +++ b/src/components/script/dom/messageevent.rs @@ -0,0 +1,90 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::codegen::Bindings::MessageEventBinding; +use dom::bindings::codegen::InheritTypes::{EventCast, MessageEventDerived}; +use dom::bindings::error::Fallible; +use dom::bindings::global::GlobalRef; +use dom::bindings::js::{JSRef, Temporary}; +use dom::bindings::trace::Traceable; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; +use dom::event::{Event, EventMethods, MessageEventTypeId}; + +use servo_util::str::DOMString; + +use js::jsapi::JSContext; +use js::jsval::JSVal; + +#[deriving(Encodable)] +pub struct MessageEvent { + event: Event, + data: Traceable<JSVal>, + origin: DOMString, + lastEventId: DOMString, +} + +impl MessageEventDerived for Event { + fn is_messageevent(&self) -> bool { + self.type_id == MessageEventTypeId + } +} + +impl MessageEvent { + pub fn new_inherited(data: JSVal, origin: DOMString, lastEventId: DOMString) + -> MessageEvent { + MessageEvent { + event: Event::new_inherited(MessageEventTypeId), + data: Traceable::new(data), + origin: origin, + lastEventId: lastEventId, + } + } + + pub fn new(global: &GlobalRef, type_: DOMString, + bubbles: bool, cancelable: bool, + data: JSVal, origin: DOMString, lastEventId: DOMString) + -> Temporary<MessageEvent> { + let ev = reflect_dom_object(box MessageEvent::new_inherited(data, origin, lastEventId), + global, + MessageEventBinding::Wrap).root(); + let event: &JSRef<Event> = EventCast::from_ref(&*ev); + event.InitEvent(type_, bubbles, cancelable); + Temporary::from_rooted(&*ev) + } + + pub fn Constructor(global: &GlobalRef, + type_: DOMString, + init: &MessageEventBinding::MessageEventInit) + -> Fallible<Temporary<MessageEvent>> { + let ev = MessageEvent::new(global, type_, init.parent.bubbles, init.parent.cancelable, + init.data, init.origin.clone(), init.lastEventId.clone()); + Ok(ev) + } +} + +pub trait MessageEventMethods { + fn Data(&self, cx: *mut JSContext) -> JSVal; + fn Origin(&self) -> DOMString; + fn LastEventId(&self) -> DOMString; +} + +impl<'a> MessageEventMethods for JSRef<'a, MessageEvent> { + fn Data(&self, _cx: *mut JSContext) -> JSVal { + *self.data + } + + fn Origin(&self) -> DOMString { + self.origin.clone() + } + + fn LastEventId(&self) -> DOMString { + self.lastEventId.clone() + } +} + +impl Reflectable for MessageEvent { + fn reflector<'a>(&'a self) -> &'a Reflector { + self.event.reflector() + } +} diff --git a/src/components/script/dom/webidls/MessageEvent.webidl b/src/components/script/dom/webidls/MessageEvent.webidl new file mode 100644 index 00000000000..7198708499e --- /dev/null +++ b/src/components/script/dom/webidls/MessageEvent.webidl @@ -0,0 +1,23 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// http://www.whatwg.org/html/#messageevent +[Constructor(DOMString type, optional MessageEventInit eventInitDict)/*, Exposed=Window,Worker*/] +interface MessageEvent : Event { + readonly attribute any data; + readonly attribute DOMString origin; + readonly attribute DOMString lastEventId; + //readonly attribute (WindowProxy or MessagePort)? source; + //readonly attribute MessagePort[]? ports; +}; + +dictionary MessageEventInit : EventInit { + any data = null; + DOMString origin = ""; + DOMString lastEventId = ""; + //DOMString channel; + //(WindowProxy or MessagePort)? source; + //sequence<MessagePort> ports; +}; diff --git a/src/components/script/script.rs b/src/components/script/script.rs index e5a3ab69867..b95db6c76ce 100644 --- a/src/components/script/script.rs +++ b/src/components/script/script.rs @@ -159,6 +159,7 @@ pub mod dom { pub mod htmlvideoelement; pub mod htmlunknownelement; pub mod location; + pub mod messageevent; pub mod mouseevent; pub mod navigator; pub mod node; diff --git a/src/test/content/test_interfaces.html b/src/test/content/test_interfaces.html index 5d851b39092..a784a87f345 100644 --- a/src/test/content/test_interfaces.html +++ b/src/test/content/test_interfaces.html @@ -141,6 +141,7 @@ var interfaceNamesInGlobalScope = [ "HTMLUnknownElement", "HTMLVideoElement", "Location", + "MessageEvent", "MouseEvent", "Navigator", "Node", |