Merge 337dee2061
into 5887f991b3
This commit is contained in:
commit
f8613fbb65
5 changed files with 129 additions and 115 deletions
94
index.js
94
index.js
|
@ -196,12 +196,11 @@ const ContainerService = {
|
||||||
"moveTabsToWindow",
|
"moveTabsToWindow",
|
||||||
"queryIdentities",
|
"queryIdentities",
|
||||||
"getIdentity",
|
"getIdentity",
|
||||||
"createIdentity",
|
|
||||||
"removeIdentity",
|
|
||||||
"updateIdentity",
|
|
||||||
"getPreference",
|
"getPreference",
|
||||||
"sendTelemetryPayload",
|
"sendTelemetryPayload",
|
||||||
"getTheme",
|
"getTheme",
|
||||||
|
"refreshNeeded",
|
||||||
|
"forgetIdentityAndRefresh",
|
||||||
"checkIncompatibleAddons"
|
"checkIncompatibleAddons"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -309,7 +308,7 @@ const ContainerService = {
|
||||||
},
|
},
|
||||||
|
|
||||||
registerBackgroundConnection(api) {
|
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) => {
|
api.browser.runtime.onConnect.addListener((port) => {
|
||||||
this._onBackgroundConnectCallback = (message, topic) => {
|
this._onBackgroundConnectCallback = (message, topic) => {
|
||||||
port.postMessage({
|
port.postMessage({
|
||||||
|
@ -911,86 +910,6 @@ const ContainerService = {
|
||||||
return Promise.resolve(identity ? this._convert(identity) : null);
|
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;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
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
|
// Preferences
|
||||||
|
|
||||||
getPreference(args) {
|
getPreference(args) {
|
||||||
|
@ -1039,7 +958,7 @@ const ContainerService = {
|
||||||
return this._windowMap.get(window);
|
return this._windowMap.get(window);
|
||||||
},
|
},
|
||||||
|
|
||||||
_refreshNeeded() {
|
refreshNeeded() {
|
||||||
return this._configureWindows();
|
return this._configureWindows();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1169,6 +1088,11 @@ const ContainerService = {
|
||||||
// End-Of-Hack
|
// End-Of-Hack
|
||||||
},
|
},
|
||||||
|
|
||||||
|
forgetIdentityAndRefresh(args) {
|
||||||
|
this._forgetIdentity(args.userContextId);
|
||||||
|
return this.refreshNeeded();
|
||||||
|
},
|
||||||
|
|
||||||
_forgetIdentity(userContextId = 0) {
|
_forgetIdentity(userContextId = 0) {
|
||||||
for (let window of windows.browserWindows) { // eslint-disable-line prefer-const
|
for (let window of windows.browserWindows) { // eslint-disable-line prefer-const
|
||||||
window = viewFor(window);
|
window = viewFor(window);
|
||||||
|
|
|
@ -58,19 +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() {
|
init() {
|
||||||
browser.runtime.onMessage.addListener((neverAskMessage) => {
|
browser.runtime.onMessage.addListener((m) => {
|
||||||
const pageUrl = neverAskMessage.pageUrl;
|
switch (m.type) {
|
||||||
if (neverAskMessage.neverAsk === true) {
|
case "delete-container":
|
||||||
// If we have existing data and for some reason it hasn't been deleted etc lets update it
|
assignManager.deleteContainer(m.message.userContextId);
|
||||||
this.storageArea.get(pageUrl).then((siteSettings) => {
|
break;
|
||||||
if (siteSettings) {
|
case "never-ask":
|
||||||
siteSettings.neverAsk = true;
|
this._neverAsk(m);
|
||||||
this.storageArea.set(pageUrl, siteSettings);
|
break;
|
||||||
}
|
|
||||||
}).catch((e) => {
|
|
||||||
throw e;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -254,9 +265,6 @@ const messageHandler = {
|
||||||
case "lightweight-theme-changed":
|
case "lightweight-theme-changed":
|
||||||
themeManager.update(m.message);
|
themeManager.update(m.message);
|
||||||
break;
|
break;
|
||||||
case "delete-container":
|
|
||||||
assignManager.deleteContainer(m.message.userContextId);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
throw new Error(`Unhandled message type: ${m.message}`);
|
throw new Error(`Unhandled message type: ${m.message}`);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
// Sending neverAsk message to background to store for next time we see this process
|
||||||
if (neverAsk) {
|
if (neverAsk) {
|
||||||
browser.runtime.sendMessage({
|
browser.runtime.sendMessage({
|
||||||
|
type: "never-ask",
|
||||||
neverAsk: true,
|
neverAsk: true,
|
||||||
pageUrl: redirectUrl
|
pageUrl: redirectUrl
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
|
|
|
@ -141,6 +141,65 @@ const Logic = {
|
||||||
return this._currentIdentity;
|
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);
|
||||||
|
});
|
||||||
|
}).catch((e) => {throw e;});
|
||||||
|
},
|
||||||
|
|
||||||
|
_containerTabs(userContextId) {
|
||||||
|
return browser.tabs.query({
|
||||||
|
cookieStoreId: Logic.cookieStoreId(userContextId)
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
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.");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.sendTelemetryPayload({
|
||||||
|
event: eventName,
|
||||||
|
userContextId
|
||||||
|
});
|
||||||
|
|
||||||
|
const removeTabsPromise = Logic._containerTabs(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;
|
||||||
|
}).catch((e) => {throw e;});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
generateIdentityName() {
|
generateIdentityName() {
|
||||||
const defaultName = "Container #";
|
const defaultName = "Container #";
|
||||||
const ids = [];
|
const ids = [];
|
||||||
|
@ -240,8 +299,7 @@ Logic.registerPanel(P_CONTAINERS_LIST, {
|
||||||
});
|
});
|
||||||
|
|
||||||
document.querySelector("#edit-containers-link").addEventListener("click", () => {
|
document.querySelector("#edit-containers-link").addEventListener("click", () => {
|
||||||
browser.runtime.sendMessage({
|
Logic.sendTelemetryPayload({
|
||||||
method: "sendTelemetryPayload",
|
|
||||||
event: "edit-containers"
|
event: "edit-containers"
|
||||||
});
|
});
|
||||||
Logic.showPanel(P_CONTAINERS_EDIT);
|
Logic.showPanel(P_CONTAINERS_EDIT);
|
||||||
|
@ -360,12 +418,12 @@ Logic.registerPanel(P_CONTAINER_INFO, {
|
||||||
moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling);
|
moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling);
|
||||||
} else {
|
} else {
|
||||||
moveTabsEl.addEventListener("click", () => {
|
moveTabsEl.addEventListener("click", () => {
|
||||||
return browser.runtime.sendMessage({
|
browser.runtime.sendMessage({
|
||||||
method: "moveTabsToWindow",
|
method: "moveTabsToWindow",
|
||||||
userContextId: Logic.currentIdentity().userContextId,
|
userContextId: Logic.currentIdentity().userContextId,
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
window.close();
|
window.close();
|
||||||
});
|
}).catch((e) => { throw e; });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
|
@ -531,13 +589,14 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
|
||||||
_submitForm() {
|
_submitForm() {
|
||||||
const identity = Logic.currentIdentity();
|
const identity = Logic.currentIdentity();
|
||||||
const formValues = new FormData(this._editForm);
|
const formValues = new FormData(this._editForm);
|
||||||
browser.runtime.sendMessage({
|
this._createOrUpdateIdentity(
|
||||||
method: identity.userContextId ? "updateIdentity" : "createIdentity",
|
{
|
||||||
userContextId: identity.userContextId || 0,
|
name: document.getElementById("edit-container-panel-name-input").value || Logic.generateIdentityName(),
|
||||||
name: document.getElementById("edit-container-panel-name-input").value || Logic.generateIdentityName(),
|
icon: formValues.get("container-icon") || DEFAULT_ICON,
|
||||||
icon: formValues.get("container-icon") || DEFAULT_ICON,
|
color: formValues.get("container-color") || DEFAULT_COLOR,
|
||||||
color: formValues.get("container-color") || DEFAULT_COLOR,
|
},
|
||||||
}).then(() => {
|
identity.userContextId || false
|
||||||
|
).then(() => {
|
||||||
return Logic.refreshIdentities();
|
return Logic.refreshIdentities();
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
Logic.showPreviousPanel();
|
Logic.showPreviousPanel();
|
||||||
|
@ -546,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() {
|
initializeRadioButtons() {
|
||||||
const colorRadioTemplate = (containerColor) => {
|
const colorRadioTemplate = (containerColor) => {
|
||||||
return escaped`<input type="radio" value="${containerColor}" name="container-color" id="edit-container-panel-choose-color-${containerColor}" />
|
return escaped`<input type="radio" value="${containerColor}" name="container-color" id="edit-container-panel-choose-color-${containerColor}" />
|
||||||
|
@ -603,10 +686,7 @@ Logic.registerPanel(P_CONTAINER_DELETE, {
|
||||||
});
|
});
|
||||||
|
|
||||||
document.querySelector("#delete-container-ok-link").addEventListener("click", () => {
|
document.querySelector("#delete-container-ok-link").addEventListener("click", () => {
|
||||||
browser.runtime.sendMessage({
|
Logic.removeIdentity(Logic.currentIdentity().userContextId).then(() => {
|
||||||
method: "removeIdentity",
|
|
||||||
userContextId: Logic.currentIdentity().userContextId,
|
|
||||||
}).then(() => {
|
|
||||||
return Logic.refreshIdentities();
|
return Logic.refreshIdentities();
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
Logic.showPreviousPanel();
|
Logic.showPreviousPanel();
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
"activeTab",
|
"activeTab",
|
||||||
"cookies",
|
"cookies",
|
||||||
"contextMenus",
|
"contextMenus",
|
||||||
|
"contextualIdentities",
|
||||||
"history",
|
"history",
|
||||||
"idle",
|
"idle",
|
||||||
"notifications",
|
"notifications",
|
||||||
|
|
Loading…
Add table
Reference in a new issue