Commit 5a4ddce8 authored by Yutaka Hirano's avatar Yutaka Hirano Committed by Commit Bot

[Network Service] Support WebRequest API for WebSocket on dedicated workers.

Bug: 721400
Change-Id: I033be720b2b1deb69ddb70cdd25a76087935423f
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_mojo
Reviewed-on: https://chromium-review.googlesource.com/1084809Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: default avatarKaran Bhatia <karandeepb@chromium.org>
Commit-Queue: Yutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#564816}
parent c6824e4f
...@@ -1135,6 +1135,15 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, ...@@ -1135,6 +1135,15 @@ IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
<< message_; << message_;
} }
// Test that the webRequest events are dispatched for the WebSocket handshake
// requests.
IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebSocketRequestOnWorker) {
ASSERT_TRUE(StartEmbeddedTestServer());
ASSERT_TRUE(StartWebSocketServer(net::GetWebSocketTestDataDirectory()));
ASSERT_TRUE(RunExtensionSubtest("webrequest", "test_websocket_worker.html"))
<< message_;
}
// Test behavior when intercepting requests from a browser-initiated url fetch. // Test behavior when intercepting requests from a browser-initiated url fetch.
IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
WebRequestURLLoaderInterception) { WebRequestURLLoaderInterception) {
......
...@@ -75,7 +75,7 @@ chrome.tabs.getCurrent(function(tab) { ...@@ -75,7 +75,7 @@ chrome.tabs.getCurrent(function(tab) {
['onBeforeRequest', 'onBeforeSendHeaders', 'onSendHeaders', ['onBeforeRequest', 'onBeforeSendHeaders', 'onSendHeaders',
'onHeadersReceived', 'onResponseStarted', 'onCompleted'] 'onHeadersReceived', 'onResponseStarted', 'onCompleted']
], ],
{urls: ['<all_urls>']}, // filter {urls: ['ws://*/*']}, // filter
['blocking'] // extraInfoSpec ['blocking'] // extraInfoSpec
); );
testWebSocketConnection(url, true /* expectedToConnect*/); testWebSocketConnection(url, true /* expectedToConnect*/);
...@@ -112,7 +112,7 @@ chrome.tabs.getCurrent(function(tab) { ...@@ -112,7 +112,7 @@ chrome.tabs.getCurrent(function(tab) {
[ // event order [ // event order
['onBeforeRequest', 'onErrorOccurred'] ['onBeforeRequest', 'onErrorOccurred']
], ],
{urls: ['<all_urls>']}, // filter {urls: ['ws://*/*']}, // filter
['blocking'] // extraInfoSpec ['blocking'] // extraInfoSpec
); );
testWebSocketConnection(url, false /* expectedToConnect*/); testWebSocketConnection(url, false /* expectedToConnect*/);
...@@ -192,7 +192,7 @@ chrome.tabs.getCurrent(function(tab) { ...@@ -192,7 +192,7 @@ chrome.tabs.getCurrent(function(tab) {
['onBeforeRequest', 'onBeforeSendHeaders', 'onHeadersReceived', ['onBeforeRequest', 'onBeforeSendHeaders', 'onHeadersReceived',
'onResponseStarted', 'onCompleted'] 'onResponseStarted', 'onCompleted']
], ],
{urls: ['<all_urls>']}, // filter {urls: ['ws://*/*']}, // filter
['blocking'] // extraInfoSpec ['blocking'] // extraInfoSpec
); );
testWebSocketConnection(url, true /* expectedToConnect*/); testWebSocketConnection(url, true /* expectedToConnect*/);
......
<!--
* Copyright 2018 The Chromium Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
-->
<body>
<script src="framework.js"></script>
<script src="test_websocket_worker_main.js"></script>
<script src="test_websocket.js"></script>
</body>
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
function getWSTestURL(port) {
return 'ws://localhost:' + port + '/echo-with-no-extension';
}
// Creates a dedicated worker which makes a WebSocket request.
function testWebSocketConnection(url, expectedToConnect) {
const keepAlive = chrome.test.callbackAdded();
const worker = new Worker('websocket_worker.js');
worker.postMessage({url, expectedToConnect});
worker.onmessage = (message) => {
worker.terminate();
chrome.test.assertEq('PASS', message.data);
keepAlive();
};
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
self.onmessage = (message) => {
const ws = new WebSocket(message.data.url);
const expectedToConnect = message.data.expectedToConnect;
const messageData = 'test message';
ws.onerror = (error) => {
postMessage(expectedToConnect ? 'FAIL; onerror' : 'PASS');
};
ws.onmessage = (message) => {
if (!expectedToConnect || message.data !== messageData) {
postMessage('FAIL; onmessage');
}
ws.close();
};
ws.onclose = (event) => {
if (expectedToConnect) {
postMessage(event.wasClean ? 'PASS' : 'FAIL; onclose');
}
};
ws.onopen = () => {
if (!expectedToConnect) {
postMessage('FAIL; onopen');
}
ws.send(messageData);
};
}
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "content/browser/interface_provider_filtering.h" #include "content/browser/interface_provider_filtering.h"
#include "content/browser/renderer_interface_binders.h" #include "content/browser/renderer_interface_binders.h"
#include "content/browser/websockets/websocket_manager.h" #include "content/browser/websockets/websocket_manager.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
#include "mojo/public/cpp/bindings/strong_binding.h" #include "mojo/public/cpp/bindings/strong_binding.h"
#include "mojo/public/cpp/system/message_pipe.h" #include "mojo/public/cpp/system/message_pipe.h"
...@@ -53,9 +54,8 @@ class DedicatedWorkerHost : public service_manager::mojom::InterfaceProvider { ...@@ -53,9 +54,8 @@ class DedicatedWorkerHost : public service_manager::mojom::InterfaceProvider {
private: private:
void RegisterMojoInterfaces() { void RegisterMojoInterfaces() {
registry_.AddInterface( registry_.AddInterface(base::BindRepeating(
base::BindRepeating(&WebSocketManager::CreateWebSocket, process_id_, &DedicatedWorkerHost::CreateWebSocket, base::Unretained(this)));
parent_render_frame_id_, origin_, nullptr));
registry_.AddInterface(base::BindRepeating( registry_.AddInterface(base::BindRepeating(
&DedicatedWorkerHost::CreateUsbDeviceManager, base::Unretained(this))); &DedicatedWorkerHost::CreateUsbDeviceManager, base::Unretained(this)));
} }
...@@ -67,6 +67,17 @@ class DedicatedWorkerHost : public service_manager::mojom::InterfaceProvider { ...@@ -67,6 +67,17 @@ class DedicatedWorkerHost : public service_manager::mojom::InterfaceProvider {
std::move(request)); std::move(request));
} }
void CreateWebSocket(network::mojom::WebSocketRequest request) {
network::mojom::AuthenticationHandlerPtr auth_handler;
GetContentClient()->browser()->WillCreateWebSocket(
RenderFrameHost::FromID(process_id_, parent_render_frame_id_), &request,
&auth_handler);
WebSocketManager::CreateWebSocket(process_id_, parent_render_frame_id_,
origin_, std::move(auth_handler),
std::move(request));
}
const int process_id_; const int process_id_;
const int parent_render_frame_id_; const int parent_render_frame_id_;
const url::Origin origin_; const url::Origin origin_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment