Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
add_task(async function test_filter_url() {
let ext_fail = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
browser.test.fail(
`received unexpected onUpdated event ${JSON.stringify(changeInfo)}`
);
},
{ urls: ["*://*.mozilla.org/*"] }
);
},
});
await ext_fail.startup();
let ext_perm = ExtensionTestUtils.loadExtension({
background() {
browser.tabs.onUpdated.addListener(
() => {
browser.test.fail(
`received unexpected onUpdated event without tabs permission`
);
},
{ urls: ["*://mochi.test/*"] }
);
},
});
await ext_perm.startup();
let ext_ok = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
browser.test.log(`got onUpdated ${JSON.stringify(changeInfo)}`);
if (changeInfo.status === "complete") {
browser.test.notifyPass("onUpdated");
}
},
{ urls: ["*://mochi.test/*"] }
);
},
});
await ext_ok.startup();
let ok1 = ext_ok.awaitFinish("onUpdated");
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
);
await ok1;
await ext_ok.unload();
await ext_fail.unload();
await ext_perm.unload();
await BrowserTestUtils.removeTab(tab);
});
add_task(async function test_filter_url_activeTab() {
let ext = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["activeTab"],
},
background() {
browser.tabs.onUpdated.addListener(
() => {
browser.test.fail(
"should only have notification for activeTab, selectedTab is not activeTab"
);
},
{ urls: ["*://mochi.test/*"] }
);
},
});
await ext.startup();
let ext2 = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
if (changeInfo.status === "complete") {
browser.test.notifyPass("onUpdated");
}
},
{ urls: ["*://mochi.test/*"] }
);
},
});
await ext2.startup();
let ok = ext2.awaitFinish("onUpdated");
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
);
await Promise.all([ok]);
await ext.unload();
await ext2.unload();
await BrowserTestUtils.removeTab(tab);
});
add_task(async function test_filter_tabId() {
let ext_fail = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
browser.test.fail(
`received unexpected onUpdated event ${JSON.stringify(changeInfo)}`
);
},
{ tabId: 12345 }
);
},
});
await ext_fail.startup();
let ext_ok = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
browser.tabs.onUpdated.addListener((tabId, changeInfo) => {
if (changeInfo.status === "complete") {
browser.test.notifyPass("onUpdated");
}
});
},
});
await ext_ok.startup();
let ok = ext_ok.awaitFinish("onUpdated");
let ext_ok2 = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
browser.tabs.onCreated.addListener(tab => {
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
if (changeInfo.status === "complete") {
browser.test.notifyPass("onUpdated");
}
},
{ tabId: tab.id }
);
browser.test.log(`Tab specific tab listener on tab ${tab.id}`);
});
},
});
await ext_ok2.startup();
let ok2 = ext_ok2.awaitFinish("onUpdated");
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
);
await Promise.all([ok, ok2]);
await ext_ok.unload();
await ext_ok2.unload();
await ext_fail.unload();
await BrowserTestUtils.removeTab(tab);
});
add_task(async function test_filter_windowId() {
let ext_fail = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
browser.test.fail(
`received unexpected onUpdated event ${JSON.stringify(changeInfo)}`
);
},
{ windowId: 12345 }
);
},
});
await ext_fail.startup();
let ext_ok = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
if (changeInfo.status === "complete") {
browser.test.notifyPass("onUpdated");
}
},
{ windowId: browser.windows.WINDOW_ID_CURRENT }
);
},
});
await ext_ok.startup();
let ok = ext_ok.awaitFinish("onUpdated");
let ext_ok2 = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
async background() {
let window = await browser.windows.getCurrent();
browser.test.log(`Window specific tab listener on window ${window.id}`);
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
if (changeInfo.status === "complete") {
browser.test.notifyPass("onUpdated");
}
},
{ windowId: window.id }
);
browser.test.sendMessage("ready");
},
});
await ext_ok2.startup();
await ext_ok2.awaitMessage("ready");
let ok2 = ext_ok2.awaitFinish("onUpdated");
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
);
await Promise.all([ok, ok2]);
await ext_ok.unload();
await ext_ok2.unload();
await ext_fail.unload();
await BrowserTestUtils.removeTab(tab);
});
add_task(async function test_filter_isArticle() {
let extension = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
background() {
// We expect only status updates, anything else is a failure.
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
browser.test.log(`got onUpdated ${JSON.stringify(changeInfo)}`);
if ("isArticle" in changeInfo) {
browser.test.notifyPass("isArticle");
}
},
{ properties: ["isArticle"] }
);
},
});
await extension.startup();
let ok = extension.awaitFinish("isArticle");
const baseUrl = getRootDirectory(gTestPath).replace(
);
const url = `${baseUrl}/readerModeArticle.html`;
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
await ok;
await extension.unload();
await BrowserTestUtils.removeTab(tab);
});
add_task(async function test_filter_property() {
let extension = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["tabs"],
},
async background() {
// We expect only status updates, anything else is a failure.
let properties = new Set([
"audible",
"discarded",
"favIconUrl",
"hidden",
"isArticle",
"mutedInfo",
"pinned",
"sharingState",
"title",
"url",
]);
// Test that updated only happens after created.
let created = false;
let tabIds = (await browser.tabs.query({})).map(t => t.id);
browser.tabs.onCreated.addListener(tab => {
created = tab.id;
});
browser.tabs.onUpdated.addListener(
(tabId, changeInfo) => {
// ignore tabs created prior to extension startup
if (tabIds.includes(tabId)) {
return;
}
browser.test.assertEq(created, tabId, "tab created before updated");
browser.test.log(`got onUpdated ${JSON.stringify(changeInfo)}`);
browser.test.assertTrue(!!changeInfo.status, "changeInfo has status");
if (Object.keys(changeInfo).some(p => properties.has(p))) {
browser.test.fail(
`received unexpected onUpdated event ${JSON.stringify(
changeInfo
)}`
);
}
if (changeInfo.status === "complete") {
browser.test.notifyPass("onUpdated");
}
},
{ properties: ["status"] }
);
browser.test.sendMessage("ready");
},
});
await extension.startup();
await extension.awaitMessage("ready");
let ok = extension.awaitFinish("onUpdated");
let tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
);
await ok;
await extension.unload();
await BrowserTestUtils.removeTab(tab);
});