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"/>
12 <script type=
"text/javascript">
15 function backgroundScript(token
) {
16 browser
.runtime
.onMessage
.addListener(msg
=> {
17 browser
.test
.assertEq(msg
, "done");
18 browser
.test
.notifyPass("sendmessage_reply");
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");
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
) {
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
57 browser
.runtime
.sendMessage("done");
61 function makeExtension() {
62 let token
= Math
.random();
64 background
: `(${backgroundScript})("${token}")`,
66 "permissions": ["tabs"],
68 "matches": ["http://mochi.test/*/file_sample.html"],
69 "js": ["content_script.js"],
70 "run_at": "document_idle",
75 "content_script.js": `(${contentScript})("${token}")`,
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")]);
97 await extension1
.unload();
98 await extension2
.unload();