aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2014-07-16 14:18:52 +0200
committerMs2ger <ms2ger@gmail.com>2014-07-16 14:53:22 +0200
commitd40b97ea73a885479c1fb1d09f44c61ea1fbec3b (patch)
treeb0731b550bc07d29b9fcd0a36a10fbaa0f3f4cc1
parente8996d5ce57c473c33b3bf5c140f7e91dd811e91 (diff)
downloadservo-d40b97ea73a885479c1fb1d09f44c61ea1fbec3b.tar.gz
servo-d40b97ea73a885479c1fb1d09f44c61ea1fbec3b.zip
Implement MessageEvent.
-rw-r--r--src/components/script/dom/event.rs1
-rw-r--r--src/components/script/dom/messageevent.rs90
-rw-r--r--src/components/script/dom/webidls/MessageEvent.webidl23
-rw-r--r--src/components/script/script.rs1
-rw-r--r--src/test/content/test_interfaces.html1
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",