From b1d60414200d825672955fbf54ac47ebf32b382c Mon Sep 17 00:00:00 2001 From: Hinali Marfatia Date: Sat, 25 Oct 2014 23:58:59 -0400 Subject: [PATCH] Implement a basic WebSocket interface. --- components/script/dom/eventtarget.rs | 1 + .../script/dom/webidls/WebSocket.webidl | 27 ++++++++++ components/script/dom/websocket.rs | 49 +++++++++++++++++++ components/script/lib.rs | 1 + tests/content/test_interfaces.html | 1 + .../wpt/metadata/html/dom/interfaces.html.ini | 36 -------------- 6 files changed, 79 insertions(+), 36 deletions(-) create mode 100644 components/script/dom/webidls/WebSocket.webidl create mode 100644 components/script/dom/websocket.rs diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 19ec8c08251..151a1ac939a 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -38,6 +38,7 @@ pub enum ListenerPhase { #[jstraceable] pub enum EventTargetTypeId { NodeTargetTypeId(NodeTypeId), + WebSocketTypeId, WindowTypeId, WorkerTypeId, WorkerGlobalScopeTypeId(WorkerGlobalScopeId), diff --git a/components/script/dom/webidls/WebSocket.webidl b/components/script/dom/webidls/WebSocket.webidl new file mode 100644 index 00000000000..3f54ec79019 --- /dev/null +++ b/components/script/dom/webidls/WebSocket.webidl @@ -0,0 +1,27 @@ +/* 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/. */ + +[Constructor(DOMString url)] +interface WebSocket : EventTarget { +readonly attribute DOMString url; + //attribute DOMString port; + //attribute DOMString host; + //ready state + const unsigned short CONNECTING = 0; + const unsigned short OPEN = 1; + const unsigned short CLOSING = 2; + const unsigned short CLOSED = 3; + //readonly attribute unsigned short readyState; + //readonly attribute unsigned long bufferedAmount; + //networking + //attribute EventHandler onopen; + //attribute EventHandler onerror; + //attribute EventHandler onclose; + //readonly attribute DOMString extensions; + //readonly attribute DOMString protocol; + //void send(USVString data); + //void send(Blob data); + //void send(ArrayBuffer data); + //void send(ArrayBufferView data); +}; diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs new file mode 100644 index 00000000000..b31d404d9b5 --- /dev/null +++ b/components/script/dom/websocket.rs @@ -0,0 +1,49 @@ +/* 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::WebSocketBinding; +use dom::bindings::codegen::Bindings::WebSocketBinding::WebSocketMethods; +use dom::bindings::error::Fallible; +use dom::bindings::global::GlobalRef; +use dom::bindings::js::{Temporary, JSRef}; +use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; +use dom::eventtarget::{EventTarget, WebSocketTypeId}; +use servo_util::str::DOMString; + +#[dom_struct] +pub struct WebSocket { + eventtarget: EventTarget, + url: DOMString +} + +impl WebSocket { + pub fn new_inherited(url: DOMString) -> WebSocket { + WebSocket { + eventtarget: EventTarget::new_inherited(WebSocketTypeId), + url: url + } + } + + pub fn new(global: &GlobalRef, url: DOMString) -> Temporary { + reflect_dom_object(box WebSocket::new_inherited(url), + global, + WebSocketBinding::Wrap) + } + + pub fn Constructor(global: &GlobalRef, url: DOMString) -> Fallible> { + Ok(WebSocket::new(global, url)) + } +} + +impl Reflectable for WebSocket { + fn reflector<'a>(&'a self) -> &'a Reflector { + self.eventtarget.reflector() + } +} + +impl<'a> WebSocketMethods for JSRef<'a, WebSocket> { + fn Url(self) -> DOMString { + self.url.clone() + } +} diff --git a/components/script/lib.rs b/components/script/lib.rs index 123417e9429..1e524ec7a62 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -203,6 +203,7 @@ pub mod dom { pub mod urlsearchparams; pub mod validitystate; pub mod virtualmethods; + pub mod websocket; pub mod window; pub mod worker; pub mod workerglobalscope; diff --git a/tests/content/test_interfaces.html b/tests/content/test_interfaces.html index 1a1fa9f1cd0..1d14d3587a4 100644 --- a/tests/content/test_interfaces.html +++ b/tests/content/test_interfaces.html @@ -164,6 +164,7 @@ var interfaceNamesInGlobalScope = [ "UIEvent", "URLSearchParams", "ValidityState", + "WebSocket", "Window", "Worker", "WorkerGlobalScope", // #2823 diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index 723efa98ea4..2ab53711a71 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -9228,45 +9228,9 @@ [EventSource interface: operation close()] expected: FAIL - [WebSocket interface: existence and properties of interface object] - expected: FAIL - [WebSocket interface object length] expected: FAIL - [WebSocket interface: existence and properties of interface prototype object] - expected: FAIL - - [WebSocket interface: existence and properties of interface prototype object\'s "constructor" property] - expected: FAIL - - [WebSocket interface: attribute url] - expected: FAIL - - [WebSocket interface: constant CONNECTING on interface object] - expected: FAIL - - [WebSocket interface: constant CONNECTING on interface prototype object] - expected: FAIL - - [WebSocket interface: constant OPEN on interface object] - expected: FAIL - - [WebSocket interface: constant OPEN on interface prototype object] - expected: FAIL - - [WebSocket interface: constant CLOSING on interface object] - expected: FAIL - - [WebSocket interface: constant CLOSING on interface prototype object] - expected: FAIL - - [WebSocket interface: constant CLOSED on interface object] - expected: FAIL - - [WebSocket interface: constant CLOSED on interface prototype object] - expected: FAIL - [WebSocket interface: attribute readyState] expected: FAIL