From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../test/browser/browser_ext_devtools_page.js | 304 +++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 browser/components/extensions/test/browser/browser_ext_devtools_page.js (limited to 'browser/components/extensions/test/browser/browser_ext_devtools_page.js') diff --git a/browser/components/extensions/test/browser/browser_ext_devtools_page.js b/browser/components/extensions/test/browser/browser_ext_devtools_page.js new file mode 100644 index 0000000000..8f2700c657 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_devtools_page.js @@ -0,0 +1,304 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +loadTestSubscript("head_devtools.js"); + +/** + * This test file ensures that: + * + * - the devtools_page property creates a new WebExtensions context + * - the devtools_page can exchange messages with the background page + */ +add_task(async function test_devtools_page_runtime_api_messaging() { + let tab = await BrowserTestUtils.openNewForegroundTab( + gBrowser, + "http://mochi.test:8888/" + ); + + function background() { + browser.runtime.onMessage.addListener((msg, sender) => { + if (sender.tab) { + browser.test.sendMessage("content_script_message_received"); + } + }); + + browser.runtime.onConnect.addListener(port => { + if (port.sender.tab) { + browser.test.sendMessage("content_script_port_received"); + return; + } + + let portMessageReceived = false; + + port.onDisconnect.addListener(() => { + browser.test.assertTrue( + portMessageReceived, + "Got a port message before the port disconnect event" + ); + browser.test.sendMessage("devtools_page_connect.done"); + }); + + port.onMessage.addListener(msg => { + portMessageReceived = true; + browser.test.assertEq( + "devtools -> background port message", + msg, + "Got the expected message from the devtools page" + ); + port.postMessage("background -> devtools port message"); + }); + }); + } + + function devtools_page() { + browser.runtime.onConnect.addListener(port => { + // Fail if a content script port has been received by the devtools page (Bug 1383310). + if (port.sender.tab) { + browser.test.fail( + `A DevTools page should not receive ports from content scripts` + ); + } + }); + + browser.runtime.onMessage.addListener((msg, sender) => { + // Fail if a content script message has been received by the devtools page (Bug 1383310). + if (sender.tab) { + browser.test.fail( + `A DevTools page should not receive messages from content scripts` + ); + } + }); + + const port = browser.runtime.connect(); + port.onMessage.addListener(msg => { + browser.test.assertEq( + "background -> devtools port message", + msg, + "Got the expected message from the background page" + ); + port.disconnect(); + }); + port.postMessage("devtools -> background port message"); + + browser.test.sendMessage("devtools_page_loaded"); + } + + function content_script() { + browser.test.onMessage.addListener(msg => { + switch (msg) { + case "content_script.send_message": + browser.runtime.sendMessage("content_script_message"); + break; + case "content_script.connect_port": + const port = browser.runtime.connect(); + port.disconnect(); + break; + default: + browser.test.fail( + `Unexpected message ${msg} received by content script` + ); + } + }); + + browser.test.sendMessage("content_script_loaded"); + } + + let extension = ExtensionTestUtils.loadExtension({ + background, + manifest: { + devtools_page: "devtools_page.html", + content_scripts: [ + { + js: ["content_script.js"], + matches: ["http://mochi.test/*"], + }, + ], + }, + files: { + "content_script.js": content_script, + "devtools_page.html": ` + + + + + + + + `, + "devtools_page.js": devtools_page, + }, + }); + + await extension.startup(); + + info("Wait the content script load"); + await extension.awaitMessage("content_script_loaded"); + + info("Open the developer toolbox"); + await openToolboxForTab(tab); + + info("Wait the devtools page load"); + await extension.awaitMessage("devtools_page_loaded"); + + info("Wait the connection 'devtools_page -> background' to complete"); + await extension.awaitMessage("devtools_page_connect.done"); + + // Send a message from the content script and expect it to be received from + // the background page (repeated twice to be sure that the devtools_page had + // the chance to receive the message and fail as expected). + info( + "Wait for 2 content script messages to be received from the background page" + ); + extension.sendMessage("content_script.send_message"); + await extension.awaitMessage("content_script_message_received"); + extension.sendMessage("content_script.send_message"); + await extension.awaitMessage("content_script_message_received"); + + // Create a port from the content script and expect a port to be received from + // the background page (repeated twice to be sure that the devtools_page had + // the chance to receive the message and fail as expected). + info( + "Wait for 2 content script ports to be received from the background page" + ); + extension.sendMessage("content_script.connect_port"); + await extension.awaitMessage("content_script_port_received"); + extension.sendMessage("content_script.connect_port"); + await extension.awaitMessage("content_script_port_received"); + + await closeToolboxForTab(tab); + + await extension.unload(); + + BrowserTestUtils.removeTab(tab); +}); + +/** + * This test file ensures that: + * + * - the devtools_page can exchange messages with an extension tab page + */ + +add_task(async function test_devtools_page_and_extension_tab_messaging() { + let tab = await BrowserTestUtils.openNewForegroundTab( + gBrowser, + "http://mochi.test:8888/" + ); + + function background() { + browser.runtime.onMessage.addListener((msg, sender) => { + if (sender.tab) { + browser.test.sendMessage("extension_tab_message_received"); + } + }); + + browser.runtime.onConnect.addListener(port => { + if (port.sender.tab) { + browser.test.sendMessage("extension_tab_port_received"); + } + }); + + browser.tabs.create({ url: browser.runtime.getURL("extension_tab.html") }); + } + + function devtools_page() { + browser.runtime.onConnect.addListener(port => { + browser.test.sendMessage("devtools_page_onconnect"); + }); + + browser.runtime.onMessage.addListener((msg, sender) => { + browser.test.sendMessage("devtools_page_onmessage"); + }); + + browser.test.sendMessage("devtools_page_loaded"); + } + + function extension_tab() { + browser.test.onMessage.addListener(msg => { + switch (msg) { + case "extension_tab.send_message": + browser.runtime.sendMessage("content_script_message"); + break; + case "extension_tab.connect_port": + const port = browser.runtime.connect(); + port.disconnect(); + break; + default: + browser.test.fail( + `Unexpected message ${msg} received by content script` + ); + } + }); + + browser.test.sendMessage("extension_tab_loaded"); + } + + let extension = ExtensionTestUtils.loadExtension({ + background, + manifest: { + devtools_page: "devtools_page.html", + }, + files: { + "extension_tab.html": ` + + + + + +

Extension Tab Page

+ + + `, + "extension_tab.js": extension_tab, + "devtools_page.html": ` + + + + + + + + `, + "devtools_page.js": devtools_page, + }, + }); + + await extension.startup(); + + info("Wait the extension tab page load"); + await extension.awaitMessage("extension_tab_loaded"); + + info("Open the developer toolbox"); + await openToolboxForTab(tab); + + info("Wait the devtools page load"); + await extension.awaitMessage("devtools_page_loaded"); + + extension.sendMessage("extension_tab.send_message"); + + info( + "Wait for an extension tab message to be received from the devtools page" + ); + await extension.awaitMessage("devtools_page_onmessage"); + + info( + "Wait for an extension tab message to be received from the background page" + ); + await extension.awaitMessage("extension_tab_message_received"); + + extension.sendMessage("extension_tab.connect_port"); + + info("Wait for an extension tab port to be received from the devtools page"); + await extension.awaitMessage("devtools_page_onconnect"); + + info( + "Wait for an extension tab port to be received from the background page" + ); + await extension.awaitMessage("extension_tab_port_received"); + + await closeToolboxForTab(tab); + + await extension.unload(); + + BrowserTestUtils.removeTab(tab); +}); -- cgit v1.2.3