diff options
author | Sam Gibson <sam@ifdown.net> | 2015-12-07 14:35:10 +1100 |
---|---|---|
committer | Ms2ger <Ms2ger@gmail.com> | 2016-02-26 09:43:12 +0100 |
commit | 4f736e6f7c987447db88cf31dfebead748a85a1f (patch) | |
tree | 5c5d5bc768ef47475aa4c04eb965bc5787ad2909 | |
parent | b188cb542e92f3490b049e8db8473c7e2acf6dc9 (diff) | |
download | servo-4f736e6f7c987447db88cf31dfebead748a85a1f.tar.gz servo-4f736e6f7c987447db88cf31dfebead748a85a1f.zip |
Trigger WebSocket error event
Trigger a WebSocket error after receiving an invalid message from the server
9 files changed, 23 insertions, 46 deletions
diff --git a/components/net/websocket_loader.rs b/components/net/websocket_loader.rs index 305a991e957..ab576077cf8 100644 --- a/components/net/websocket_loader.rs +++ b/components/net/websocket_loader.rs @@ -107,7 +107,11 @@ pub fn init(connect: WebSocketCommunicate, connect_data: WebSocketConnectData, c for message in receiver.incoming_messages() { let message: Message = match message { Ok(m) => m, - Err(_) => break, + Err(e) => { + debug!("Error receiving incoming WebSocket message: {:?}", e); + let _ = resource_event_sender.send(WebSocketNetworkEvent::Fail); + break; + } }; let message = match message.opcode { Type::Text => MessageData::Text(String::from_utf8_lossy(&message.payload).into_owned()), diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index 438979c2b14..a6d9d9ae358 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -141,7 +141,7 @@ pub fn close_the_websocket_connection(address: Trusted<WebSocket>, code: Option<u16>, reason: String) { let close_task = box CloseTask { - addr: address, + address: address, failed: false, code: code, reason: Some(reason), @@ -151,7 +151,7 @@ pub fn close_the_websocket_connection(address: Trusted<WebSocket>, pub fn fail_the_websocket_connection(address: Trusted<WebSocket>, sender: Box<ScriptChan>) { let close_task = box CloseTask { - addr: address, + address: address, failed: true, code: Some(close_code::ABNORMAL), reason: None, @@ -271,7 +271,7 @@ impl WebSocket { match event { WebSocketNetworkEvent::ConnectionEstablished(headers, protocols) => { let open_thread = box ConnectionEstablishedTask { - addr: moved_address.clone(), + address: moved_address.clone(), headers: headers, protocols: protocols, }; @@ -324,7 +324,7 @@ impl WebSocket { self.clearing_buffer.set(true); let task = box BufferedAmountTask { - addr: address, + address: address, }; chan.send(CommonScriptMsg::RunnableMsg(WebSocketEvent, task)).unwrap(); @@ -456,20 +456,20 @@ impl WebSocketMethods for WebSocket { /// Task queued when *the WebSocket connection is established*. struct ConnectionEstablishedTask { - addr: Trusted<WebSocket>, + address: Trusted<WebSocket>, protocols: Vec<String>, headers: Headers, } impl Runnable for ConnectionEstablishedTask { fn handler(self: Box<Self>) { - let ws = self.addr.root(); + let ws = self.address.root(); let global = ws.r().global(); // Step 1: Protocols. if !self.protocols.is_empty() && self.headers.get::<WebSocketProtocol>().is_none() { let sender = global.r().networking_task_source(); - fail_the_websocket_connection(self.addr, sender); + fail_the_websocket_connection(self.address, sender); return; } @@ -502,7 +502,7 @@ impl Runnable for ConnectionEstablishedTask { } struct BufferedAmountTask { - addr: Trusted<WebSocket>, + address: Trusted<WebSocket>, } impl Runnable for BufferedAmountTask { @@ -512,7 +512,7 @@ impl Runnable for BufferedAmountTask { // reaches step 1. In our implementation, the bytes will already have been sent on a background // thread. fn handler(self: Box<Self>) { - let ws = self.addr.root(); + let ws = self.address.root(); ws.buffered_amount.set(0); ws.clearing_buffer.set(false); @@ -520,7 +520,7 @@ impl Runnable for BufferedAmountTask { } struct CloseTask { - addr: Trusted<WebSocket>, + address: Trusted<WebSocket>, failed: bool, code: Option<u16>, reason: Option<String>, @@ -528,7 +528,7 @@ struct CloseTask { impl Runnable for CloseTask { fn handler(self: Box<Self>) { - let ws = self.addr.root(); + let ws = self.address.root(); let ws = ws.r(); let global = ws.global(); @@ -545,9 +545,7 @@ impl Runnable for CloseTask { // Step 2. if self.failed { - ws.upcast().fire_event("error", - EventBubbles::DoesNotBubble, - EventCancelable::Cancelable); + ws.upcast().fire_simple_event("error"); } // Step 3. diff --git a/tests/wpt/metadata/websockets/constructor/010.html.ini b/tests/wpt/metadata/websockets/constructor/010.html.ini index d16a207d619..451cc5c17a5 100644 --- a/tests/wpt/metadata/websockets/constructor/010.html.ini +++ b/tests/wpt/metadata/websockets/constructor/010.html.ini @@ -1,6 +1,5 @@ [010.html] type: testharness - expected: TIMEOUT [WebSockets: protocol in response but no requested protocol] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/websockets/constructor/011.html.ini b/tests/wpt/metadata/websockets/constructor/011.html.ini deleted file mode 100644 index 6062f84bb80..00000000000 --- a/tests/wpt/metadata/websockets/constructor/011.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[011.html] - type: testharness - expected: TIMEOUT - [WebSockets: protocol mismatch] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/websockets/cookies/005.html.ini b/tests/wpt/metadata/websockets/cookies/005.html.ini new file mode 100644 index 00000000000..33cab0334fe --- /dev/null +++ b/tests/wpt/metadata/websockets/cookies/005.html.ini @@ -0,0 +1,4 @@ +[005.html] + type: testharness + [WebSockets: setting HttpOnly cookies in ws response, checking ws request] + expected: FAIL diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/015.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/015.html.ini deleted file mode 100644 index 7569d80fe8b..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/015.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[015.html] - type: testharness - expected: TIMEOUT - [WebSockets: instanceof on events] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/017.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/017.html.ini deleted file mode 100644 index dac07f5dd0c..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/017.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[017.html] - type: testharness - expected: TIMEOUT - [WebSockets: this, e.target, e.currentTarget, e.eventPhase] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/018.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/018.html.ini deleted file mode 100644 index 9d86c49155b..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/018.html.ini +++ /dev/null @@ -1,9 +0,0 @@ -[018.html] - type: testharness - expected: TIMEOUT - [error event] - expected: TIMEOUT - - [close event] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/websockets/opening-handshake/005.html.ini b/tests/wpt/metadata/websockets/opening-handshake/005.html.ini index 392bf799295..136b64c7d7d 100644 --- a/tests/wpt/metadata/websockets/opening-handshake/005.html.ini +++ b/tests/wpt/metadata/websockets/opening-handshake/005.html.ini @@ -1,6 +1,5 @@ [005.html] type: testharness - expected: TIMEOUT [WebSockets: proper first line] - expected: TIMEOUT + expected: FAIL |