From 5b1d6732678f1ae5ca040408efb0818117600af7 Mon Sep 17 00:00:00 2001 From: arai Date: Mon, 21 May 2018 14:12:28 +0900 Subject: [PATCH] Add Reopen in Container context menu for tab --- src/js/background/index.html | 2 ++ src/js/background/reopen.js | 69 ++++++++++++++++++++++++++++++++++++ src/manifest.json | 1 + test/browser.mock.js | 11 ++++++ 4 files changed, 83 insertions(+) create mode 100644 src/js/background/reopen.js diff --git a/src/js/background/index.html b/src/js/background/index.html index e167f0b..6915b12 100644 --- a/src/js/background/index.html +++ b/src/js/background/index.html @@ -11,6 +11,7 @@ "js/background/badge.js", "js/background/identityState.js", "js/background/messageHandler.js", + "js/background/reopen.js", ] --> @@ -18,5 +19,6 @@ + diff --git a/src/js/background/reopen.js b/src/js/background/reopen.js new file mode 100644 index 0000000..cb2baac --- /dev/null +++ b/src/js/background/reopen.js @@ -0,0 +1,69 @@ +const reopenIn = { + // Map from menuItemId to cookieStoreId. + cookieStoreIds: new Map(), + + init() { + browser.menus.onShown.addListener(async (info, tab) => { + if (info.contexts.length !== 1) { + return; + } + if (info.contexts[0] !== "tab") { + return; + } + + await this.rebuildMenu(tab); + }); + + browser.menus.onClicked.addListener((info, tab) => { + browser.tabs.create({ + url: tab.url, + index: tab.index + 1, + cookieStoreId: this.cookieStoreIds.get(info.menuItemId) + }); + }); + }, + + async rebuildMenu(tab) { + browser.menus.removeAll(); + + const containers = await browser.contextualIdentities.query({}); + + const folderId = browser.menus.create({ + title: "Reopen in Container", + contexts: ["tab"], + }); + + if (tab.cookieStoreId !== "firefox-default") { + const menuItemId = "openin-firefox-default"; + this.cookieStoreIds.set(menuItemId, "firefox-default"); + browser.menus.create({ + id: menuItemId, + title: "No Container", + parentId: folderId, + }); + browser.menus.create({ + type: "separator", + parentId: folderId, + }); + } + + for (const [i, container] of containers.entries()) { + if (container.cookieStoreId === tab.cookieStoreId) + continue; + + const menuItemId = "openin-" + i; + this.cookieStoreIds.set(menuItemId, container.cookieStoreId); + browser.menus.create({ + id: menuItemId, + title: container.name, + icons: { + "16": container.iconUrl, + }, + parentId: folderId, + }); + } + + browser.menus.refresh(); + }, +}; +reopenIn.init(); diff --git a/src/manifest.json b/src/manifest.json index f3fa049..58fa68e 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -27,6 +27,7 @@ "history", "idle", "management", + "menus", "storage", "tabs", "webRequestBlocking", diff --git a/test/browser.mock.js b/test/browser.mock.js index d6d38dd..0bc16a6 100644 --- a/test/browser.mock.js +++ b/test/browser.mock.js @@ -80,6 +80,17 @@ module.exports = () => { addListener: sinon.stub() } }, + menus: { + create: sinon.stub(), + onClicked: { + addListener: sinon.stub() + }, + onShown: { + addListener: sinon.stub() + }, + refresh: sinon.stub(), + removeAll: sinon.stub() + }, extension: { getURL: sinon.stub().returns("moz-extension://multi-account-containers/confirm-page.html") }