Bug 1320412 - Emit tabs.onUpdated event for title changes
MozReview-Commit-ID: I0d5GJ8Rsev
--- 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);