Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Tabs onUpdated Test</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
<script type="text/javascript" src="head.js"></script>
<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<script type="text/javascript">
"use strict";
add_task(async function test_onUpdated() {
const extension = ExtensionTestUtils.loadExtension({
manifest: {
"permissions": ["tabs"],
"content_scripts": [{
"js": ["content-script.js"],
"run_at": "document_start",
}],
},
background: function() {
const expectedSequence = [
{status: "loading"},
{status: "loading", url: pageURL},
{status: "complete"},
];
const collectedSequence = [];
let tabId;
browser.tabs.onUpdated.addListener(function(tabId, updatedInfo) {
// onUpdated also fires with updatedInfo.faviconUrl, so explicitly
// check for updatedInfo.status before recording the event.
if ("status" in updatedInfo) {
collectedSequence.push(updatedInfo);
}
});
browser.runtime.onMessage.addListener(async () => {
if (collectedSequence.length !== expectedSequence.length) {
browser.test.assertEq(
JSON.stringify(expectedSequence),
JSON.stringify(collectedSequence),
"got unexpected number of updateInfo data"
);
} else {
for (let i = 0; i < expectedSequence.length; i++) {
browser.test.assertEq(
expectedSequence[i].status,
collectedSequence[i].status,
"check updatedInfo status"
);
if (expectedSequence[i].url || collectedSequence[i].url) {
browser.test.assertEq(
expectedSequence[i].url,
collectedSequence[i].url,
"check updatedInfo url"
);
}
}
}
await browser.tabs.remove(tabId);
browser.test.notifyPass("tabs.onUpdated");
});
browser.tabs.create({url: pageURL}).then(tab => {
tabId = tab.id;
});
},
files: {
"content-script.js": `
window.addEventListener("message", function(evt) {
if (evt.data == "frame-updated") {
browser.runtime.sendMessage("load-completed");
}
}, true);
`,
},
});
await Promise.all([
extension.startup(),
extension.awaitFinish("tabs.onUpdated"),
]);
await extension.unload();
});
async function do_test_update(background, withPermissions = true) {
const manifest = {};
if (withPermissions) {
manifest.permissions = ["tabs", "http://mochi.test/"];
}
const extension = ExtensionTestUtils.loadExtension({
manifest,
background,
});
await extension.startup();
await extension.awaitFinish("finish");
await extension.unload();
}
add_task(async function test_url() {
await do_test_update(function background() {
// Create a new tab for testing update.
browser.tabs.create({}, function(tab) {
browser.tabs.onUpdated.addListener(async function onUpdated(tabId, changeInfo) {
// Check callback
browser.test.assertEq(tabId, tab.id, "Check tab id");
browser.test.log("onUpdate: " + JSON.stringify(changeInfo));
if ("url" in changeInfo) {
browser.test.assertEq("about:blank", changeInfo.url,
"Check changeInfo.url");
browser.tabs.onUpdated.removeListener(onUpdated);
// Remove created tab.
await browser.tabs.remove(tabId);
browser.test.notifyPass("finish");
}
});
browser.tabs.update(tab.id, {url: "about:blank"});
});
});
});
add_task(async function test_title() {
await do_test_update(async function background() {
const tab = await browser.tabs.create({url});
browser.tabs.onUpdated.addListener(async function onUpdated(tabId, changeInfo) {
browser.test.assertEq(tabId, tab.id, "Check tab id");
browser.test.log(`onUpdated: ${JSON.stringify(changeInfo)}`);
if ("title" in changeInfo && changeInfo.title === "New Message (1)") {
browser.test.log("changeInfo.title is correct");
browser.tabs.onUpdated.removeListener(onUpdated);
await browser.tabs.remove(tabId);
browser.test.notifyPass("finish");
}
});
browser.tabs.executeScript(tab.id, {code: "document.title = 'New Message (1)'"});
});
});
add_task(async function test_without_tabs_permission() {
await do_test_update(async function background() {
const tab = await browser.tabs.create({url});
let count = 0;
browser.tabs.onUpdated.addListener(async function onUpdated(tabId, changeInfo) {
browser.test.assertEq(tabId, tab.id, "Check tab id");
browser.test.log(`onUpdated: ${JSON.stringify(changeInfo)}`);
browser.test.assertFalse("url" in changeInfo, "url should not be included without tabs permission");
browser.test.assertFalse("favIconUrl" in changeInfo, "favIconUrl should not be included without tabs permission");
browser.test.assertFalse("title" in changeInfo, "title should not be included without tabs permission");
if (changeInfo.status == "complete") {
count++;
if (count === 2) {
browser.test.log("Reload complete");
browser.tabs.onUpdated.removeListener(onUpdated);
await browser.tabs.remove(tabId);
browser.test.notifyPass("finish");
}
}
});
browser.tabs.reload(tab.id);
}, false /* withPermissions */);
});
</script>
</body>
</html>