summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_tabs_onUpdated_filter.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_tabs_onUpdated_filter.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_tabs_onUpdated_filter.js354
1 files changed, 354 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_onUpdated_filter.js b/browser/components/extensions/test/browser/browser_ext_tabs_onUpdated_filter.js
new file mode 100644
index 0000000000..83d305e491
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_onUpdated_filter.js
@@ -0,0 +1,354 @@
+/* -*- 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(
+ (tabId, changeInfo) => {
+ 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,
+ "http://mochi.test:8888/"
+ );
+ 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(
+ (tabId, changeInfo) => {
+ 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,
+ "http://mochi.test:8888/#foreground"
+ );
+ 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,
+ "http://mochi.test:8888/"
+ );
+ 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,
+ "http://mochi.test:8888/"
+ );
+ 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(
+ "chrome://mochitests/content",
+ "http://mochi.test:8888/"
+ );
+ 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,
+ "http://mochi.test:8888/"
+ );
+ await ok;
+
+ await extension.unload();
+
+ await BrowserTestUtils.removeTab(tab);
+});