Commit 1e3686d3 authored by Istiaque Ahmed's avatar Istiaque Ahmed Committed by Commit Bot

Extension Messaging: Implement reply to content script from SW.

This CL adds support to send ExtensionHostMsg_PostMessage IPC from
worker threads. This allows reply to work targeting a Service
Worker.

Bug: 925927
Test: chrome.runtime.sendMessage can use reply callback.
Change-Id: I2c64992847f0f8746a455941a58841e5f1fea8c5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1506009
Commit-Queue: Istiaque Ahmed <lazyboy@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#638314}
parent fa2ab1c1
......@@ -82,6 +82,29 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerMessagingTest, TabToWorkerOneWay) {
EXPECT_TRUE(test_listener.WaitUntilSatisfied());
}
// Tests chrome.runtime.sendMessage from content script to SW extension.
IN_PROC_BROWSER_TEST_P(ServiceWorkerMessagingTest, TabToWorker) {
ExtensionTestMessageListener worker_listener("WORKER_RUNNING", false);
const Extension* extension = LoadExtension(test_data_dir_.AppendASCII(
"service_worker/messaging/send_message_tab_to_worker"));
ASSERT_TRUE(extension);
EXPECT_TRUE(worker_listener.WaitUntilSatisfied());
ExtensionTestMessageListener reply_listener("CONTENT_SCRIPT_RECEIVED_REPLY",
false);
reply_listener.set_failure_message("FAILURE");
{
ASSERT_TRUE(StartEmbeddedTestServer());
const GURL url =
embedded_test_server()->GetURL("/extensions/test_file.html");
content::WebContents* new_web_contents = AddTab(browser(), url);
EXPECT_TRUE(new_web_contents);
}
EXPECT_TRUE(reply_listener.WaitUntilSatisfied());
}
INSTANTIATE_TEST_SUITE_P(ServiceWorkerMessagingTestWithNativeBindings,
ServiceWorkerMessagingTest,
::testing::Values(NATIVE_BINDINGS));
......
// Copyright 2019 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.
chrome.runtime.sendMessage('tab->worker', response => {
if (response != 'tab->worker->tab') {
chrome.test.sendMessage('FAILURE');
return;
}
chrome.test.sendMessage('CONTENT_SCRIPT_RECEIVED_REPLY');
});
{
"name": "runtime.sendMessage from content script to SW extension",
"version": "0.1",
"manifest_version": 2,
"description": "service worker",
"content_scripts": [{
"matches": ["*://*/*"],
"js": ["content_script.js"]
}],
"background": {"service_worker_script": "service_worker_background.js"}
}
// Copyright 2019 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.
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg != 'tab->worker') {
chrome.test.sendMessage('FAILURE');
return;
}
sendResponse('tab->worker->tab');
});
chrome.test.sendMessage('WORKER_RUNNING');
......@@ -35,14 +35,15 @@ ExtensionPort::ExtensionPort(ScriptContext* script_context,
ExtensionPort::~ExtensionPort() {}
void ExtensionPort::PostExtensionMessage(std::unique_ptr<Message> message) {
content::RenderFrame* render_frame = script_context_->GetRenderFrame();
// TODO(devlin): What should we do if there's no render frame? Up until now,
// we've always just dropped the messages, but we might need to figure this
// out for service workers.
// TODO(crbug.com/925918): Support Service Worker.
if (!render_frame)
return;
render_frame->Send(new ExtensionHostMsg_PostMessage(id_, *message));
if (worker_thread_util::IsWorkerThread()) {
DCHECK(!script_context_->GetRenderFrame());
GetWorkerThreadIPCMessageSender()->SendPostMessageToPort(id_, *message);
} else {
content::RenderFrame* render_frame = script_context_->GetRenderFrame();
if (!render_frame)
return;
render_frame->Send(new ExtensionHostMsg_PostMessage(id_, *message));
}
}
void ExtensionPort::Close(bool close_channel) {
......
......@@ -389,7 +389,7 @@ class WorkerThreadIPCMessageSender : public IPCMessageSender {
void SendPostMessageToPort(const PortId& port_id,
const Message& message) override {
NOTIMPLEMENTED();
dispatcher_->Send(new ExtensionHostMsg_PostMessage(port_id, message));
}
private:
......
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