Bug 1320412 - Emit tabs.onUpdated event for title changes draft 1320412-onUpdate-title
authorTomislav Jovanovic <tomica@gmail.com>
Thu, 05 Jan 2017 00:19:38 +0100
changeset 457216 c8c625ae72b975cb8cf741699787b0052f7683ac
parent 456417 b548da4e16f067e5b69349376e37b2db97983cf7
child 541424 ad8160bb249bef88081110c754f021243d17ff6b
push id40712
push userbmo:tomica@gmail.com
push dateSat, 07 Jan 2017 01:44:44 +0000
bugs1320412
milestone53.0a1
Bug 1320412 - Emit tabs.onUpdated event for title changes MozReview-Commit-ID: I0d5GJ8Rsev
browser/components/extensions/ext-tabs.js
browser/components/extensions/test/browser/browser_ext_tabs_onUpdated.js
--- a/browser/components/extensions/ext-tabs.js
+++ b/browser/components/extensions/ext-tabs.js
@@ -382,21 +382,23 @@ extensions.registerSchemaAPI("tabs", "ad
         AllWindowEvents.addListener("TabOpen", openListener);
         return () => {
           AllWindowEvents.removeListener("TabMove", moveListener);
           AllWindowEvents.removeListener("TabOpen", openListener);
         };
       }).api(),
 
       onUpdated: new EventManager(context, "tabs.onUpdated", fire => {
+        const restricted = ["url", "favIconUrl", "title"];
+
         function sanitize(extension, changeInfo) {
           let result = {};
           let nonempty = false;
           for (let prop in changeInfo) {
-            if ((prop != "favIconUrl" && prop != "url") || extension.hasPermission("tabs")) {
+            if (extension.hasPermission("tabs") || !restricted.includes(prop)) {
               nonempty = true;
               result[prop] = changeInfo[prop];
             }
           }
           return [nonempty, result];
         }
 
         let fireForBrowser = (browser, changed) => {
@@ -418,24 +420,27 @@ extensions.registerSchemaAPI("tabs", "ad
               needed.push("favIconUrl");
             }
             if (changed.includes("muted")) {
               needed.push("mutedInfo");
             }
             if (changed.includes("soundplaying")) {
               needed.push("audible");
             }
+            if (changed.includes("label")) {
+              needed.push("title");
+            }
           } else if (event.type == "TabPinned") {
             needed.push("pinned");
           } else if (event.type == "TabUnpinned") {
             needed.push("pinned");
           }
 
           if (needed.length && !extension.hasPermission("tabs")) {
-            needed = needed.filter(attr => attr != "url" && attr != "favIconUrl");
+            needed = needed.filter(attr => !restricted.includes(attr));
           }
 
           if (needed.length) {
             let tab = TabManager.convert(extension, event.originalTarget);
 
             let changeInfo = {};
             for (let prop of needed) {
               changeInfo[prop] = tab[prop];
--- a/browser/components/extensions/test/browser/browser_ext_tabs_onUpdated.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_onUpdated.js
@@ -89,17 +89,17 @@ add_task(function* () {
 
 function* do_test_update(background, withPermissions = true) {
   let win1 = yield BrowserTestUtils.openNewBrowserWindow();
 
   yield focusWindow(win1);
 
   let manifest = {};
   if (withPermissions) {
-    manifest.permissions = ["tabs"];
+    manifest.permissions = ["tabs", "http://mochi.test/"];
   }
   let extension = ExtensionTestUtils.loadExtension({manifest, background});
 
   yield Promise.all([
     yield extension.startup(),
     yield extension.awaitFinish("finish"),
   ]);
 
@@ -170,29 +170,58 @@ add_task(function* test_url() {
           return;
         }
       });
       browser.tabs.update(tab.id, {url: "about:blank"});
     });
   });
 });
 
-add_task(function* test_without_tabs_permission() {
-  yield do_test_update(function background() {
-    browser.tabs.create({url: "about:blank"}, function(tab) {
-      browser.tabs.onUpdated.addListener(function onUpdated(tabId, changeInfo) {
-        if (tabId == tab.id) {
-          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");
+add_task(function* test_title() {
+  yield do_test_update(async function background() {
+    const url = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context_tabs_onUpdated_page.html";
+    const tab = await browser.tabs.create({url});
+
+    browser.tabs.onUpdated.addListener(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);
+        browser.tabs.remove(tabId);
+        browser.test.notifyPass("finish");
+      }
+    });
+
+    browser.tabs.executeScript(tab.id, {code: "document.title = 'New Message (1)'"});
+  });
+});
 
-          if (changeInfo.status == "complete") {
-            browser.tabs.onUpdated.removeListener(onUpdated);
-            browser.tabs.remove(tabId);
-            browser.test.notifyPass("finish");
-          }
+add_task(function* test_without_tabs_permission() {
+  yield do_test_update(async function background() {
+    const url = "http://mochi.test:8888/browser/browser/components/extensions/test/browser/context_tabs_onUpdated_page.html";
+    const tab = await browser.tabs.create({url});
+    let count = 0;
+
+    browser.tabs.onUpdated.addListener(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);
+          browser.tabs.remove(tabId);
+          browser.test.notifyPass("finish");
         }
-      });
-      browser.tabs.reload(tab.id);
+      }
     });
+
+    browser.tabs.reload(tab.id);
   }, false /* withPermissions */);
 });
 
 add_task(forceGC);