Bug 1787379 - Add `origin` to `runtime.MessageSender`. r=robwu,zombie,geckoview-reviewers
[gecko.git] / toolkit / components / extensions / test / mochitest / test_ext_runtime_connect2.html
blob32620b5b3ba514d40b36b8a3853370ccfb1a7b4f
1 <!DOCTYPE HTML>
2 <html>
3 <head>
4 <title>WebExtension test</title>
5 <script src="/tests/SimpleTest/SimpleTest.js"></script>
6 <script src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
7 <script type="text/javascript" src="head.js"></script>
8 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
9 </head>
10 <body>
12 <script type="text/javascript">
13 "use strict";
15 function backgroundScript(token) {
16 browser.runtime.onMessage.addListener(msg => {
17 browser.test.assertEq(msg, "done");
18 browser.test.notifyPass("sendmessage_reply");
19 });
21 browser.runtime.onConnect.addListener(port => {
22 browser.test.assertTrue(port.sender.url.endsWith("file_sample.html"), "sender url correct");
23 browser.test.assertTrue(port.sender.tab.url.endsWith("file_sample.html"), "sender url correct");
24 browser.test.assertEq(new URL(port.sender.url).origin, port.sender.origin, "sender origin correct");
26 let tabId = port.sender.tab.id;
27 browser.tabs.connect(tabId, {name: token});
29 browser.test.assertEq(port.name, token, "token matches");
30 port.postMessage(token + "-done");
31 });
33 browser.test.sendMessage("background-ready");
36 function contentScript(token) {
37 let gotTabMessage = false;
38 let badTabMessage = false;
39 browser.runtime.onConnect.addListener(port => {
40 if (port.name == token) {
41 gotTabMessage = true;
42 } else {
43 badTabMessage = true;
45 port.disconnect();
46 });
48 let port = browser.runtime.connect(null, {name: token});
49 port.onMessage.addListener(function(msg) {
50 if (msg != token + "-done" || !gotTabMessage || badTabMessage) {
51 return; // test failed
54 // FIXME: Removing this line causes the test to fail:
55 // resource://gre/modules/ExtensionUtils.jsm, line 651: NS_ERROR_NOT_INITIALIZED
56 port.disconnect();
57 browser.runtime.sendMessage("done");
58 });
61 function makeExtension() {
62 let token = Math.random();
63 let extensionData = {
64 background: `(${backgroundScript})("${token}")`,
65 manifest: {
66 "permissions": ["tabs"],
67 "content_scripts": [{
68 "matches": ["http://mochi.test/*/file_sample.html"],
69 "js": ["content_script.js"],
70 "run_at": "document_idle",
71 }],
74 files: {
75 "content_script.js": `(${contentScript})("${token}")`,
78 return extensionData;
81 add_task(async function test_contentscript() {
82 let extension1 = ExtensionTestUtils.loadExtension(makeExtension());
83 let extension2 = ExtensionTestUtils.loadExtension(makeExtension());
84 await Promise.all([extension1.startup(), extension2.startup()]);
86 await extension1.awaitMessage("background-ready");
87 await extension2.awaitMessage("background-ready");
89 let win = window.open("file_sample.html");
91 await Promise.all([waitForLoad(win),
92 extension1.awaitFinish("sendmessage_reply"),
93 extension2.awaitFinish("sendmessage_reply")]);
95 win.close();
97 await extension1.unload();
98 await extension2.unload();
99 });
100 </script>
102 </body>
103 </html>