From 48702a014cc2f2ae3a08c0d11930a212f58639c3 Mon Sep 17 00:00:00 2001 From: Bob Silverberg Date: Wed, 11 Jan 2017 09:14:58 -0500 Subject: [PATCH] Bug 1329971 - tab objects returned by sessions.getRecentlyClosed are missing some data, r=kmag MozReview-Commit-ID: GB3Xaxg8HRf --HG-- extra : rebase_source : 47d1d976b51ee53a4bfb64523dac41603380ed6e --- browser/components/extensions/ext-utils.js | 9 ++ .../test/browser/browser-common.ini | 1 + ...ser_ext_sessions_getRecentlyClosed_tabs.js | 96 +++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_tabs.js diff --git a/browser/components/extensions/ext-utils.js b/browser/components/extensions/ext-utils.js index 9ba41981f5b3..6dc60451cec0 100644 --- a/browser/components/extensions/ext-utils.js +++ b/browser/components/extensions/ext-utils.js @@ -710,6 +710,15 @@ ExtensionTabManager.prototype = { incognito: Boolean(tab.state && tab.state.isPrivate), }; + if (this.hasTabPermission(tab)) { + let entries = tab.state ? tab.state.entries : tab.entries; + result.url = entries[0].url; + result.title = entries[0].title; + if (tab.image) { + result.favIconUrl = tab.image; + } + } + return result; }, diff --git a/browser/components/extensions/test/browser/browser-common.ini b/browser/components/extensions/test/browser/browser-common.ini index 779d32db5654..e183250cd916 100644 --- a/browser/components/extensions/test/browser/browser-common.ini +++ b/browser/components/extensions/test/browser/browser-common.ini @@ -63,6 +63,7 @@ support-files = [browser_ext_runtime_setUninstallURL.js] [browser_ext_sessions_getRecentlyClosed.js] [browser_ext_sessions_getRecentlyClosed_private.js] +[browser_ext_sessions_getRecentlyClosed_tabs.js] [browser_ext_sessions_restore.js] [browser_ext_simple.js] [browser_ext_tab_runtimeConnect.js] diff --git a/browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_tabs.js b/browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_tabs.js new file mode 100644 index 000000000000..ae0daff9a49f --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_sessions_getRecentlyClosed_tabs.js @@ -0,0 +1,96 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +function expectedTabInfo(tab, window) { + let browser = tab.linkedBrowser; + return { + url: browser.currentURI.spec, + title: browser.contentTitle, + favIconUrl: window.gBrowser.getIcon(tab), + }; +} + +function checkTabInfo(expected, actual) { + for (let prop in expected) { + is(actual[prop], expected[prop], `Expected value found for ${prop} of tab object.`); + } +} + +add_task(async function test_sessions_get_recently_closed_tabs() { + async function background() { + browser.test.onMessage.addListener(async msg => { + if (msg == "check-sessions") { + let recentlyClosed = await browser.sessions.getRecentlyClosed(); + browser.test.sendMessage("recentlyClosed", recentlyClosed); + } + }); + } + + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + permissions: ["sessions", "tabs"], + }, + background, + }); + + let win = await BrowserTestUtils.openNewBrowserWindow(); + await BrowserTestUtils.loadURI(win.gBrowser.selectedBrowser, "about:addons"); + await BrowserTestUtils.browserLoaded(win.gBrowser.selectedBrowser); + let expectedTabs = []; + let tab = win.gBrowser.selectedTab; + expectedTabs.push(expectedTabInfo(tab, win)); + + for (let url of ["about:robots", "about:mozilla"]) { + tab = await BrowserTestUtils.openNewForegroundTab(win.gBrowser, url); + expectedTabs.push(expectedTabInfo(tab, win)); + } + + await extension.startup(); + + // Test with a closed tab. + await BrowserTestUtils.removeTab(tab); + + extension.sendMessage("check-sessions"); + let recentlyClosed = await extension.awaitMessage("recentlyClosed"); + let tabInfo = recentlyClosed[0].tab; + let expectedTab = expectedTabs.pop(); + checkTabInfo(expectedTab, tabInfo); + + // Test with a closed window containing tabs. + await BrowserTestUtils.closeWindow(win); + + extension.sendMessage("check-sessions"); + recentlyClosed = await extension.awaitMessage("recentlyClosed"); + let tabInfos = recentlyClosed[0].window.tabs; + is(tabInfos.length, 2, "Expected number of tabs in closed window."); + for (let x = 0; x < tabInfos.length; x++) { + checkTabInfo(expectedTabs[x], tabInfos[x]); + } + + await extension.unload(); + + // Test without tabs permission. + extension = ExtensionTestUtils.loadExtension({ + manifest: { + permissions: ["sessions"], + }, + background, + }); + + await extension.startup(); + + extension.sendMessage("check-sessions"); + recentlyClosed = await extension.awaitMessage("recentlyClosed"); + tabInfos = recentlyClosed[0].window.tabs; + is(tabInfos.length, 2, "Expected number of tabs in closed window."); + for (let tabInfo of tabInfos) { + for (let prop in expectedTabs[0]) { + is(undefined, + tabInfo[prop], + `${prop} of tab object is undefined without tabs permission.`); + } + } + + await extension.unload(); +});