diff options
6 files changed, 34 insertions, 33 deletions
diff --git a/components/script/dom/webidls/WebSocket.webidl b/components/script/dom/webidls/WebSocket.webidl index a07514a357a..9355b37dde1 100644 --- a/components/script/dom/webidls/WebSocket.webidl +++ b/components/script/dom/webidls/WebSocket.webidl @@ -27,7 +27,7 @@ interface WebSocket : EventTarget { //messaging attribute EventHandler onmessage; - //attribute BinaryType binaryType; + attribute BinaryType binaryType; [Throws] void send(optional USVString data); //void send(Blob data); //void send(ArrayBuffer data); diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index ce515d0f276..7b8fb8c85c3 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -4,7 +4,7 @@ use dom::bindings::cell::DOMRefCell; use dom::bindings::codegen::Bindings::WebSocketBinding; -use dom::bindings::codegen::Bindings::WebSocketBinding::WebSocketMethods; +use dom::bindings::codegen::Bindings::WebSocketBinding::{BinaryType, WebSocketMethods}; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::InheritTypes::EventTargetCast; use dom::bindings::codegen::InheritTypes::EventCast; @@ -30,8 +30,10 @@ use util::str::DOMString; use util::task::spawn_named; use js::jsapi::{RootedValue, JSAutoRequest, JSAutoCompartment}; +use js::jsapi::{JS_NewArrayBuffer, JS_GetArrayBufferData}; use js::jsval::UndefinedValue; use hyper::header::Host; +use libc::{uint8_t, uint32_t}; use websocket::Message; use websocket::ws::sender::Sender as Sender_Object; use websocket::client::sender::Sender; @@ -46,6 +48,7 @@ use websocket::ws::util::url::parse_url; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; +use std::ptr; use std::sync::{Arc, Mutex}; #[derive(JSTraceable, PartialEq, Copy, Clone, Debug)] @@ -76,6 +79,7 @@ pub struct WebSocket { code: Cell<u16>, //Closing code reason: DOMRefCell<DOMString>, //Closing reason data: DOMRefCell<DOMString>, //Data from send - TODO: Remove after buffer is added. + binary_type: Cell<BinaryType>, } /// *Establish a WebSocket Connection* as defined in RFC 6455. @@ -115,6 +119,7 @@ impl WebSocket { code: Cell::new(0), reason: DOMRefCell::new("".to_owned()), data: DOMRefCell::new("".to_owned()), + binary_type: Cell::new(BinaryType::Blob), } } @@ -236,6 +241,16 @@ impl<'a> WebSocketMethods for &'a WebSocket { self.ready_state.get() as u16 } + // https://html.spec.whatwg.org/multipage/#dom-websocket-binarytype + fn BinaryType(self) -> BinaryType { + self.binary_type.get() + } + + // https://html.spec.whatwg.org/multipage/#dom-websocket-binarytype + fn SetBinaryType(self, btype: BinaryType) { + self.binary_type.set(btype) + } + // https://html.spec.whatwg.org/multipage/#dom-websocket-send fn Send(self, data: Option<USVString>) -> Fallible<()> { match self.ready_state.get() { @@ -394,6 +409,7 @@ struct MessageReceivedTask { } impl Runnable for MessageReceivedTask { + #[allow(unsafe_code)] fn handler(self: Box<Self>) { let ws = self.address.root(); debug!("MessageReceivedTask::handler({:p}): readyState={:?}", &*ws, @@ -413,8 +429,22 @@ impl Runnable for MessageReceivedTask { match self.message { MessageData::Text(text) => text.to_jsval(cx, message.handle_mut()), MessageData::Binary(data) => { - let blob = Blob::new(global.r(), Some(data), ""); - blob.to_jsval(cx, message.handle_mut()); + match ws.binary_type.get() { + BinaryType::Blob => { + let blob = Blob::new(global.r(), Some(data), ""); + blob.to_jsval(cx, message.handle_mut()); + } + BinaryType::Arraybuffer => { + unsafe { + let len = data.len() as uint32_t; + let buf = JS_NewArrayBuffer(cx, len); + let buf_data: *mut uint8_t = JS_GetArrayBufferData(buf, ptr::null()); + ptr::copy_nonoverlapping(data.as_ptr(), buf_data, len as usize); + buf.to_jsval(cx, message.handle_mut()); + } + } + + } }, } diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index 45c273d6e75..5c67bd6c652 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -8304,9 +8304,6 @@ [WebSocket interface: attribute protocol] expected: FAIL - [WebSocket interface: attribute binaryType] - expected: FAIL - [CloseEvent interface: existence and properties of interface object] expected: FAIL @@ -8987,4 +8984,3 @@ [HTMLOptionElement interface: new Option() must inherit property "index" with the proper type (7)] expected: FAIL - diff --git a/tests/wpt/metadata/websockets/Create-Secure-valid-url-binaryType-blob.htm.ini b/tests/wpt/metadata/websockets/Create-Secure-valid-url-binaryType-blob.htm.ini deleted file mode 100644 index a3e0abcf14f..00000000000 --- a/tests/wpt/metadata/websockets/Create-Secure-valid-url-binaryType-blob.htm.ini +++ /dev/null @@ -1,9 +0,0 @@ -[Create-Secure-valid-url-binaryType-blob.htm] - type: testharness - expected: TIMEOUT - [W3C WebSocket API - Create Secure WebSocket - wsocket.binaryType should be set to 'blob' after connection is established - Connection should be opened] - expected: FAIL - - [W3C WebSocket API - Create Secure WebSocket - wsocket.binaryType should be set to 'blob' after connection is established - Connection should be closed] - expected: NOTRUN - diff --git a/tests/wpt/metadata/websockets/binaryType-wrong-value.htm.ini b/tests/wpt/metadata/websockets/binaryType-wrong-value.htm.ini deleted file mode 100644 index 06a717e4cd8..00000000000 --- a/tests/wpt/metadata/websockets/binaryType-wrong-value.htm.ini +++ /dev/null @@ -1,9 +0,0 @@ -[binaryType-wrong-value.htm] - type: testharness - expected: TIMEOUT - [W3C WebSocket API - Create WebSocket - set binaryType to something other than blob or arraybuffer - SYNTAX_ERR is returned - Connection should be opened] - expected: FAIL - - [W3C WebSocket API - Create WebSocket - set binaryType to something other than blob or arraybuffer - SYNTAX_ERR is returned - Connection should be closed] - expected: NOTRUN - diff --git a/tests/wpt/metadata/websockets/interfaces.html.ini b/tests/wpt/metadata/websockets/interfaces.html.ini index 155767f35ee..1b501d09ec2 100644 --- a/tests/wpt/metadata/websockets/interfaces.html.ini +++ b/tests/wpt/metadata/websockets/interfaces.html.ini @@ -15,9 +15,6 @@ [WebSocket interface: attribute protocol] expected: FAIL - [WebSocket interface: attribute binaryType] - expected: FAIL - [WebSocket interface: operation send(DOMString)] expected: FAIL @@ -42,9 +39,6 @@ [WebSocket interface: new WebSocket("ws://foo") must inherit property "protocol" with the proper type (11)] expected: FAIL - [WebSocket interface: new WebSocket("ws://foo") must inherit property "binaryType" with the proper type (14)] - expected: FAIL - [WebSocket interface: calling send(DOMString) on new WebSocket("ws://foo") with too few arguments must throw TypeError] expected: FAIL @@ -62,4 +56,3 @@ [CloseEvent interface: existence and properties of interface prototype object] expected: FAIL - |