From 7781f331d3407a895f1dadeeff3a74ad0c7f5ca8 Mon Sep 17 00:00:00 2001 From: Jinwoo Song Date: Sat, 16 May 2015 14:48:27 +0900 Subject: [PATCH] WebSocket constructor should not panic Make an early return when the WebSocket connection fails in the constructor. Also let the WebSocket connection to be closed when the connection could not be established. Fixes #6082. --- components/script/dom/websocket.rs | 11 ++++++++++- tests/wpt/metadata/FileAPI/progress.html.ini | 3 +++ .../Create-Secure-blocked-port.htm.ini | 4 +++- .../websockets/constructor/008.html.ini | 3 --- .../websockets/constructor/017.html.ini | 3 --- .../websockets/constructor/021.html.ini | 4 +++- ...feredAmount-defineProperty-getter.html.ini | 3 --- ...feredAmount-defineProperty-setter.html.ini | 3 --- .../interfaces/WebSocket/events/020.html.ini | 5 ++++- .../WebSocket/readyState/004.html.ini | 3 --- .../WebSocket/readyState/005.html.ini | 3 --- .../interfaces/WebSocket/url/005.html.ini | 3 --- .../interfaces/WebSocket/url/006.html.ini | 3 --- tests/wpt/mozilla/meta/MANIFEST.json | 6 ++++++ .../mozilla/websocket_connection_fail.html | 19 +++++++++++++++++++ 15 files changed, 48 insertions(+), 28 deletions(-) delete mode 100644 tests/wpt/metadata/websockets/constructor/008.html.ini delete mode 100644 tests/wpt/metadata/websockets/constructor/017.html.ini delete mode 100644 tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-defineProperty-getter.html.ini delete mode 100644 tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-defineProperty-setter.html.ini delete mode 100644 tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/004.html.ini delete mode 100644 tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/005.html.ini delete mode 100644 tests/wpt/metadata/websockets/interfaces/WebSocket/url/005.html.ini delete mode 100644 tests/wpt/metadata/websockets/interfaces/WebSocket/url/006.html.ini create mode 100644 tests/wpt/mozilla/tests/mozilla/websocket_connection_fail.html diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index c0c6a624862..9272346d416 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -141,7 +141,16 @@ impl WebSocket { // TODO Client::connect does not conform to RFC 6455 // see https://github.com/cyderize/rust-websocket/issues/38 - let request = Client::connect(parsed_url).unwrap(); + let request = match Client::connect(parsed_url) { + Ok(request) => request, + Err(_) => { + let global_root = ws_root.global.root(); + let address = Trusted::new(global_root.r().get_cx(), ws_root, global_root.r().script_chan().clone()); + let task = box WebSocketTaskHandler::new(address, WebSocketTask::Close); + global_root.r().script_chan().send(ScriptMsg::RunnableMsg(task)).unwrap(); + return Ok(Temporary::from_rooted(ws_root)); + } + }; let response = request.send().unwrap(); response.validate().unwrap(); ws_root.ready_state.set(WebSocketRequestState::Open); diff --git a/tests/wpt/metadata/FileAPI/progress.html.ini b/tests/wpt/metadata/FileAPI/progress.html.ini index 4a68bc13c80..bd0857516f7 100644 --- a/tests/wpt/metadata/FileAPI/progress.html.ini +++ b/tests/wpt/metadata/FileAPI/progress.html.ini @@ -1,3 +1,6 @@ [progress.html] type: testharness expected: TIMEOUT + [W3C WebSocket API - Create WebSocket - Pass a URL with a non ws/wss scheme - SYNTAX_ERR is thrown] + expected: FAIL + diff --git a/tests/wpt/metadata/websockets/Create-Secure-blocked-port.htm.ini b/tests/wpt/metadata/websockets/Create-Secure-blocked-port.htm.ini index 3b3e39e8b69..f06483f7ead 100644 --- a/tests/wpt/metadata/websockets/Create-Secure-blocked-port.htm.ini +++ b/tests/wpt/metadata/websockets/Create-Secure-blocked-port.htm.ini @@ -1,3 +1,5 @@ [Create-Secure-blocked-port.htm] type: testharness - expected: CRASH + [W3C WebSocket API - Create Secure WebSocket - Pass a URL with a blocked port - SECURITY_ERR should be thrown] + expected: FAIL + diff --git a/tests/wpt/metadata/websockets/constructor/008.html.ini b/tests/wpt/metadata/websockets/constructor/008.html.ini deleted file mode 100644 index dc8d6d123e8..00000000000 --- a/tests/wpt/metadata/websockets/constructor/008.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[008.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/constructor/017.html.ini b/tests/wpt/metadata/websockets/constructor/017.html.ini deleted file mode 100644 index 2e28d320587..00000000000 --- a/tests/wpt/metadata/websockets/constructor/017.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[017.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/constructor/021.html.ini b/tests/wpt/metadata/websockets/constructor/021.html.ini index f80c6711af2..450a75a3112 100644 --- a/tests/wpt/metadata/websockets/constructor/021.html.ini +++ b/tests/wpt/metadata/websockets/constructor/021.html.ini @@ -1,3 +1,5 @@ [021.html] type: testharness - expected: CRASH + [WebSockets: Same sub protocol twice] + expected: FAIL + diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-defineProperty-getter.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-defineProperty-getter.html.ini deleted file mode 100644 index baf752b0c55..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-defineProperty-getter.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[bufferedAmount-defineProperty-getter.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-defineProperty-setter.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-defineProperty-setter.html.ini deleted file mode 100644 index f1f2f87f79f..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-defineProperty-setter.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[bufferedAmount-defineProperty-setter.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/020.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/020.html.ini index 3d080960f3d..e12d8871a89 100644 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/events/020.html.ini +++ b/tests/wpt/metadata/websockets/interfaces/WebSocket/events/020.html.ini @@ -1,3 +1,6 @@ [020.html] type: testharness - expected: CRASH + expected: TIMEOUT + [WebSockets: error events] + expected: TIMEOUT + diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/004.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/004.html.ini deleted file mode 100644 index 58468cab4ee..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/004.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[004.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/005.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/005.html.ini deleted file mode 100644 index 3c0649a3bd8..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/readyState/005.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[005.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/005.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/url/005.html.ini deleted file mode 100644 index 3c0649a3bd8..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/005.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[005.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/006.html.ini b/tests/wpt/metadata/websockets/interfaces/WebSocket/url/006.html.ini deleted file mode 100644 index 016efd444be..00000000000 --- a/tests/wpt/metadata/websockets/interfaces/WebSocket/url/006.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[006.html] - type: testharness - expected: CRASH diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 86b5ac0f31e..097dfd3a42c 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -539,6 +539,12 @@ "url": "/_mozilla/mozilla/union.html" } ], + "mozilla/websocket_connection_fail.html": [ + { + "path": "mozilla/websocket_connection_fail.html", + "url": "/_mozilla/mozilla/websocket_connection_fail.html" + } + ], "mozilla/window.html": [ { "path": "mozilla/window.html", diff --git a/tests/wpt/mozilla/tests/mozilla/websocket_connection_fail.html b/tests/wpt/mozilla/tests/mozilla/websocket_connection_fail.html new file mode 100644 index 00000000000..95c56636d53 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/websocket_connection_fail.html @@ -0,0 +1,19 @@ + + + + + + + + +