1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
<!DOCTYPE html>
<html>
<head>
<title>WebExtension test</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
<script type="text/javascript" src="head.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<script type="text/javascript">
"use strict";
add_task(function* test_multiple_pages() {
async function background() {
let tabReady = new Promise(resolve => {
browser.runtime.onMessage.addListener(function listener(msg) {
browser.test.log("onMessage " + msg);
if (msg == "tab-ready") {
browser.runtime.onMessage.removeListener(listener);
resolve();
}
});
});
let tabId;
let tabRemoved = new Promise(resolve => {
browser.tabs.onRemoved.addListener(function listener(removedId) {
if (removedId == tabId) {
browser.tabs.onRemoved.removeListener(listener);
// Delay long enough to be sure the inner window has been nuked.
setTimeout(resolve, 0);
}
});
});
try {
let storage = browser.storage.local;
browser.test.log("create");
let tab = await browser.tabs.create({url: "tab.html"});
tabId = tab.id;
await tabReady;
let result = await storage.get("key");
browser.test.assertEq(undefined, result.key, "Key should be undefined");
await browser.runtime.sendMessage("tab-set-key");
result = await storage.get("key");
browser.test.assertEq(JSON.stringify({foo: {bar: "baz"}}),
JSON.stringify(result.key),
"Key should be set to the value from the tab");
browser.test.log("Remove tab");
await Promise.all([
browser.tabs.remove(tabId),
tabRemoved,
]);
result = await storage.get("key");
browser.test.assertEq(JSON.stringify({foo: {bar: "baz"}}),
JSON.stringify(result.key),
"Key should still be set to the value from the tab");
browser.test.notifyPass("storage-multiple");
} catch (e) {
browser.test.fail(`Error: ${e} :: ${e.stack}`);
browser.test.notifyFail("storage-multiple");
}
}
function tab() {
browser.test.log("tab");
browser.runtime.onMessage.addListener(msg => {
if (msg == "tab-set-key") {
return browser.storage.local.set({key: {foo: {bar: "baz"}}});
}
});
browser.runtime.sendMessage("tab-ready");
}
let extension = ExtensionTestUtils.loadExtension({
background,
files: {
"tab.html": `<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="tab.js"><\/script>
</head>
</html>`,
"tab.js": tab,
},
manifest: {
permissions: ["storage"],
},
});
yield extension.startup();
yield extension.awaitFinish("storage-multiple");
yield extension.unload();
});
</script>
</body>
</html>
|