This commit is contained in:
Jonathan Kingston 2017-05-04 14:24:58 +00:00 committed by GitHub
commit 2f264be065
5 changed files with 129 additions and 115 deletions

View file

@ -196,12 +196,11 @@ const ContainerService = {
"moveTabsToWindow",
"queryIdentities",
"getIdentity",
"createIdentity",
"removeIdentity",
"updateIdentity",
"getPreference",
"sendTelemetryPayload",
"getTheme",
"refreshNeeded",
"forgetIdentityAndRefresh",
"checkIncompatibleAddons"
];
@ -309,7 +308,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({
@ -911,86 +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;
});
},
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) {
@ -1039,7 +958,7 @@ const ContainerService = {
return this._windowMap.get(window);
},
_refreshNeeded() {
refreshNeeded() {
return this._configureWindows();
},
@ -1169,6 +1088,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);

View file

@ -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() {
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);
}
}).catch((e) => {
throw e;
});
browser.runtime.onMessage.addListener((m) => {
switch (m.type) {
case "delete-container":
assignManager.deleteContainer(m.message.userContextId);
break;
case "never-ask":
this._neverAsk(m);
break;
}
});
@ -254,9 +265,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}`);
}

View file

@ -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(() => {

View file

@ -141,6 +141,65 @@ 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);
});
}).catch((e) => {throw e;});
},
_containers(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._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;
}).catch((e) => {throw e;});
});
},
generateIdentityName() {
const defaultName = "Container #";
const ids = [];
@ -240,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);
@ -360,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(() => {
@ -531,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();
@ -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() {
const colorRadioTemplate = (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", () => {
browser.runtime.sendMessage({
method: "removeIdentity",
userContextId: Logic.currentIdentity().userContextId,
}).then(() => {
Logic.removeIdentity(Logic.currentIdentity().userContextId).then(() => {
return Logic.refreshIdentities();
}).then(() => {
Logic.showPreviousPanel();

View file

@ -23,6 +23,7 @@
"activeTab",
"cookies",
"contextMenus",
"contextualIdentities",
"history",
"idle",
"notifications",