From f4597eae844852ae9f3675b11e1840bb5848819a Mon Sep 17 00:00:00 2001 From: Jonathan Kingston Date: Fri, 28 Apr 2017 14:15:59 +0100 Subject: [PATCH 1/3] Moving bulk of removeIdentity code into popup.js --- index.js | 33 ++++--------------- webextension/background.js | 32 ++++++++++-------- webextension/js/confirm-page.js | 1 + webextension/js/popup.js | 57 ++++++++++++++++++++++++++++++--- webextension/manifest.json | 1 + 5 files changed, 80 insertions(+), 44 deletions(-) diff --git a/index.js b/index.js index ba8dacb..ea50364 100644 --- a/index.js +++ b/index.js @@ -197,11 +197,11 @@ const ContainerService = { "queryIdentities", "getIdentity", "createIdentity", - "removeIdentity", "updateIdentity", "getPreference", "sendTelemetryPayload", "getTheme", + "forgetIdentityAndRefresh", "checkIncompatibleAddons" ]; @@ -309,7 +309,7 @@ const ContainerService = { }, registerBackgroundConnection(api) { - // This is only used for theme and container deletion notifications + // This is only used for theme notifications api.browser.runtime.onConnect.addListener((port) => { this._onBackgroundConnectCallback = (message, topic) => { port.postMessage({ @@ -967,30 +967,6 @@ const ContainerService = { }); }, - removeIdentity(args) { - const eventName = "delete-container"; - if (!("userContextId" in args)) { - return Promise.reject("removeIdentity must be called with userContextId argument."); - } - - this.sendTelemetryPayload({ - "event": eventName, - "userContextId": args.userContextId - }); - - const tabsToClose = []; - this._containerTabIterator(args.userContextId, tab => { - tabsToClose.push(tab); - }); - - return this._closeTabs(tabsToClose).then(() => { - const removed = ContextualIdentityProxy.remove(args.userContextId); - this.triggerBackgroundCallback({userContextId: args.userContextId}, eventName); - this._forgetIdentity(args.userContextId); - return this._refreshNeeded().then(() => removed ); - }); - }, - // Preferences getPreference(args) { @@ -1169,6 +1145,11 @@ const ContainerService = { // End-Of-Hack }, + forgetIdentityAndRefresh(args) { + this._forgetIdentity(args.userContextId); + return this._refreshNeeded(); + }, + _forgetIdentity(userContextId = 0) { for (let window of windows.browserWindows) { // eslint-disable-line prefer-const window = viewFor(window); diff --git a/webextension/background.js b/webextension/background.js index a3eac44..5c541d9 100644 --- a/webextension/background.js +++ b/webextension/background.js @@ -59,18 +59,25 @@ const assignManager = { }, init() { - browser.runtime.onMessage.addListener((neverAskMessage) => { - const pageUrl = neverAskMessage.pageUrl; - if (neverAskMessage.neverAsk === true) { - // If we have existing data and for some reason it hasn't been deleted etc lets update it - this.storageArea.get(pageUrl).then((siteSettings) => { - if (siteSettings) { - siteSettings.neverAsk = true; - this.storageArea.set(pageUrl, siteSettings); + browser.runtime.onMessage.addListener((m) => { + switch (m.type) { + case "delete-container": + assignManager.deleteContainer(m.message.userContextId); + break; + case "never-ask": + const pageUrl = m.pageUrl; + if (m.neverAsk === true) { + // If we have existing data and for some reason it hasn't been deleted etc lets update it + this.storageArea.get(pageUrl).then((siteSettings) => { + if (siteSettings) { + siteSettings.neverAsk = true; + this.storageArea.set(pageUrl, siteSettings); + } + }).catch((e) => { + throw e; + }); } - }).catch((e) => { - throw e; - }); + break; } }); @@ -254,9 +261,6 @@ const messageHandler = { case "lightweight-theme-changed": themeManager.update(m.message); break; - case "delete-container": - assignManager.deleteContainer(m.message.userContextId); - break; default: throw new Error(`Unhandled message type: ${m.message}`); } diff --git a/webextension/js/confirm-page.js b/webextension/js/confirm-page.js index feefba1..319afec 100644 --- a/webextension/js/confirm-page.js +++ b/webextension/js/confirm-page.js @@ -9,6 +9,7 @@ document.getElementById("redirect-form").addEventListener("submit", (e) => { // Sending neverAsk message to background to store for next time we see this process if (neverAsk) { browser.runtime.sendMessage({ + type: "never-ask", neverAsk: true, pageUrl: redirectUrl }).then(() => { diff --git a/webextension/js/popup.js b/webextension/js/popup.js index 7ed2b50..1be3406 100644 --- a/webextension/js/popup.js +++ b/webextension/js/popup.js @@ -141,6 +141,58 @@ const Logic = { return this._currentIdentity; }, + cookieStoreId(userContextId) { + return `firefox-container-${userContextId}`; + }, + + _containerTabIterator(userContextId, cb) { + browser.tabs.query({ + cookieStoreId: Logic.cookieStoreId(userContextId) + }).then((tabs) => { + tabs.forEach((tab) => { + cb(tab); + }); + }); + }, + + _containers(userContextId) { + return browser.tabs.query({ + cookieStoreId: Logic.cookieStoreId(userContextId) + }); + }, + + removeIdentity(userContextId) { + const eventName = "delete-container"; + if (!userContextId) { + return Promise.reject("removeIdentity must be called with userContextId argument."); + } + + browser.runtime.sendMessage({ + method: "sendTelemetryPayload", + event: eventName, + userContextId + }); + + const removeTabsPromise = Logic._containers(userContextId).then((tabs) => { + const tabIds = tabs.map((tab) => tab.id); + return browser.tabs.remove(tabIds); + }); + + return removeTabsPromise.then(() => { + const removed = browser.contextualIdentities.remove(Logic.cookieStoreId(userContextId)); + // Send delete event to webextension/background.js + browser.runtime.sendMessage({ + type: eventName, + message: {userContextId} + }); + browser.runtime.sendMessage({ + method: "forgetIdentityAndRefresh" + }).then(() => { + return removed; + }); + }); + }, + generateIdentityName() { const defaultName = "Container #"; const ids = []; @@ -603,10 +655,7 @@ Logic.registerPanel(P_CONTAINER_DELETE, { }); document.querySelector("#delete-container-ok-link").addEventListener("click", () => { - browser.runtime.sendMessage({ - method: "removeIdentity", - userContextId: Logic.currentIdentity().userContextId, - }).then(() => { + Logic.removeIdentity(Logic.currentIdentity().userContextId).then(() => { return Logic.refreshIdentities(); }).then(() => { Logic.showPreviousPanel(); diff --git a/webextension/manifest.json b/webextension/manifest.json index d8e094a..a9582a7 100644 --- a/webextension/manifest.json +++ b/webextension/manifest.json @@ -23,6 +23,7 @@ "activeTab", "cookies", "contextMenus", + "contextualIdentities", "history", "idle", "notifications", From f2ddc7fd847107854bd5cd876036d8df871fd7f1 Mon Sep 17 00:00:00 2001 From: Jonathan Kingston Date: Fri, 28 Apr 2017 15:39:05 +0100 Subject: [PATCH 2/3] Moving create and update containers into popup.js --- index.js | 63 ++------------------------------------ webextension/background.js | 38 +++++++++++++---------- webextension/js/popup.js | 61 +++++++++++++++++++++++++++--------- 3 files changed, 70 insertions(+), 92 deletions(-) diff --git a/index.js b/index.js index ea50364..2bc59e1 100644 --- a/index.js +++ b/index.js @@ -196,11 +196,10 @@ const ContainerService = { "moveTabsToWindow", "queryIdentities", "getIdentity", - "createIdentity", - "updateIdentity", "getPreference", "sendTelemetryPayload", "getTheme", + "refreshNeeded", "forgetIdentityAndRefresh", "checkIncompatibleAddons" ]; @@ -911,62 +910,6 @@ const ContainerService = { return Promise.resolve(identity ? this._convert(identity) : null); }, - createIdentity(args) { - this.sendTelemetryPayload({ - "event": "add-container", - }); - - for (let arg of [ "name", "color", "icon"]) { // eslint-disable-line prefer-const - if (!(arg in args)) { - return Promise.reject("createIdentity must be called with " + arg + " argument."); - } - } - - const color = this._fromNameToColor(args.color); - const icon = this._fromNameToIcon(args.icon); - - const identity = ContextualIdentityProxy.create(args.name, icon, color); - - this._identitiesState[identity.userContextId] = this._createIdentityState(); - - this._refreshNeeded().then(() => { - return this._convert(identity); - }).catch(() => { - return this._convert(identity); - }); - }, - - updateIdentity(args) { - if (!("userContextId" in args)) { - return Promise.reject("updateIdentity must be called with userContextId argument."); - } - - this.sendTelemetryPayload({ - "event": "edit-container", - "userContextId": args.userContextId - }); - - const identity = ContextualIdentityProxy.getIdentityFromId(args.userContextId); - for (let arg of [ "name", "color", "icon"]) { // eslint-disable-line prefer-const - if ((arg in args)) { - identity[arg] = args[arg]; - } - } - - const color = this._fromNameToColor(identity.color); - const icon = this._fromNameToIcon(identity.icon); - - const updated = ContextualIdentityProxy.update(args.userContextId, - identity.name, - icon, color); - - this._refreshNeeded().then(() => { - return updated; - }).catch(() => { - return updated; - }); - }, - // Preferences getPreference(args) { @@ -1015,7 +958,7 @@ const ContainerService = { return this._windowMap.get(window); }, - _refreshNeeded() { + refreshNeeded() { return this._configureWindows(); }, @@ -1147,7 +1090,7 @@ const ContainerService = { forgetIdentityAndRefresh(args) { this._forgetIdentity(args.userContextId); - return this._refreshNeeded(); + return this.refreshNeeded(); }, _forgetIdentity(userContextId = 0) { diff --git a/webextension/background.js b/webextension/background.js index 5c541d9..6a85cbc 100644 --- a/webextension/background.js +++ b/webextension/background.js @@ -58,26 +58,30 @@ const assignManager = { } }, + _neverAsk(m) { + const pageUrl = m.pageUrl; + if (m.neverAsk === true) { + // If we have existing data and for some reason it hasn't been deleted etc lets update it + this.storageArea.get(pageUrl).then((siteSettings) => { + if (siteSettings) { + siteSettings.neverAsk = true; + this.storageArea.set(pageUrl, siteSettings); + } + }).catch((e) => { + throw e; + }); + } + }, + init() { browser.runtime.onMessage.addListener((m) => { switch (m.type) { - case "delete-container": - assignManager.deleteContainer(m.message.userContextId); - break; - case "never-ask": - const pageUrl = m.pageUrl; - if (m.neverAsk === true) { - // If we have existing data and for some reason it hasn't been deleted etc lets update it - this.storageArea.get(pageUrl).then((siteSettings) => { - if (siteSettings) { - siteSettings.neverAsk = true; - this.storageArea.set(pageUrl, siteSettings); - } - }).catch((e) => { - throw e; - }); - } - break; + case "delete-container": + assignManager.deleteContainer(m.message.userContextId); + break; + case "never-ask": + this._neverAsk(m); + break; } }); diff --git a/webextension/js/popup.js b/webextension/js/popup.js index 1be3406..c3a23c4 100644 --- a/webextension/js/popup.js +++ b/webextension/js/popup.js @@ -152,7 +152,7 @@ const Logic = { tabs.forEach((tab) => { cb(tab); }); - }); + }).catch((e) => {throw e;}); }, _containers(userContextId) { @@ -161,14 +161,21 @@ const Logic = { }); }, + sendTelemetryPayload(message = {}) { + if (!message.event) { + throw new Error("Missing event name for telemetry"); + } + message.method = "sendTelemetryPayload"; + browser.runtime.sendMessage(message); + }, + removeIdentity(userContextId) { const eventName = "delete-container"; if (!userContextId) { return Promise.reject("removeIdentity must be called with userContextId argument."); } - browser.runtime.sendMessage({ - method: "sendTelemetryPayload", + this.sendTelemetryPayload({ event: eventName, userContextId }); @@ -189,7 +196,7 @@ const Logic = { method: "forgetIdentityAndRefresh" }).then(() => { return removed; - }); + }).catch((e) => {throw e;}); }); }, @@ -292,8 +299,7 @@ Logic.registerPanel(P_CONTAINERS_LIST, { }); document.querySelector("#edit-containers-link").addEventListener("click", () => { - browser.runtime.sendMessage({ - method: "sendTelemetryPayload", + Logic.sendTelemetryPayload({ event: "edit-containers" }); Logic.showPanel(P_CONTAINERS_EDIT); @@ -412,12 +418,12 @@ Logic.registerPanel(P_CONTAINER_INFO, { moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling); } else { moveTabsEl.addEventListener("click", () => { - return browser.runtime.sendMessage({ + browser.runtime.sendMessage({ method: "moveTabsToWindow", userContextId: Logic.currentIdentity().userContextId, }).then(() => { window.close(); - }); + }).catch((e) => { throw e; }); }); } }).catch(() => { @@ -583,13 +589,14 @@ Logic.registerPanel(P_CONTAINER_EDIT, { _submitForm() { const identity = Logic.currentIdentity(); const formValues = new FormData(this._editForm); - browser.runtime.sendMessage({ - method: identity.userContextId ? "updateIdentity" : "createIdentity", - userContextId: identity.userContextId || 0, - name: document.getElementById("edit-container-panel-name-input").value || Logic.generateIdentityName(), - icon: formValues.get("container-icon") || DEFAULT_ICON, - color: formValues.get("container-color") || DEFAULT_COLOR, - }).then(() => { + this._createOrUpdateIdentity( + { + name: document.getElementById("edit-container-panel-name-input").value || Logic.generateIdentityName(), + icon: formValues.get("container-icon") || DEFAULT_ICON, + color: formValues.get("container-color") || DEFAULT_COLOR, + }, + identity.userContextId || false + ).then(() => { return Logic.refreshIdentities(); }).then(() => { Logic.showPreviousPanel(); @@ -598,6 +605,30 @@ Logic.registerPanel(P_CONTAINER_EDIT, { }); }, + _createOrUpdateIdentity(params, userContextId) { + let donePromise; + if (userContextId) { + donePromise = browser.contextualIdentities.update( + Logic.cookieStoreId(userContextId), + params + ); + Logic.sendTelemetryPayload({ + event: "edit-container", + userContextId + }); + } else { + donePromise = browser.contextualIdentities.create(params); + Logic.sendTelemetryPayload({ + event: "add-container" + }); + } + return donePromise.then(() => { + browser.runtime.sendMessage({ + method: "refreshNeeded" + }); + }); + }, + initializeRadioButtons() { const colorRadioTemplate = (containerColor) => { return escaped` From 337dee20612eb62e3a17bae1a890c82d33b2c45f Mon Sep 17 00:00:00 2001 From: groovecoder Date: Thu, 4 May 2017 09:31:25 -0500 Subject: [PATCH 3/3] more descriptive _containerTabs method name --- webextension/js/popup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webextension/js/popup.js b/webextension/js/popup.js index c3a23c4..4dbc0c0 100644 --- a/webextension/js/popup.js +++ b/webextension/js/popup.js @@ -155,7 +155,7 @@ const Logic = { }).catch((e) => {throw e;}); }, - _containers(userContextId) { + _containerTabs(userContextId) { return browser.tabs.query({ cookieStoreId: Logic.cookieStoreId(userContextId) }); @@ -180,7 +180,7 @@ const Logic = { userContextId }); - const removeTabsPromise = Logic._containers(userContextId).then((tabs) => { + const removeTabsPromise = Logic._containerTabs(userContextId).then((tabs) => { const tabIds = tabs.map((tab) => tab.id); return browser.tabs.remove(tabIds); });