This commit is contained in:
Jonathan Kingston 2017-07-14 15:53:13 +00:00 committed by GitHub
commit a2e3a41091
3 changed files with 118 additions and 50 deletions

View file

@ -274,9 +274,19 @@ const ContainerService = {
try { try {
const api = await webExtension.startup(); const api = await webExtension.startup();
api.browser.runtime.onMessage.addListener((message, sender, sendReply) => { api.browser.runtime.onMessage.addListener(async function (message, sender, sendReply) {
if ("method" in message && methods.indexOf(message.method) !== -1) { if ("method" in message && methods.indexOf(message.method) !== -1) {
sendReply(this[message.method](message)); const response = ContainerService[message.method](message.message);
if (response instanceof Promise) {
const responseValue = await response;
ContainerService.triggerBackgroundCallback({
response: responseValue,
method: message.method,
uuid: message.uuid
}, "async-background-response");
} else {
sendReply(response);
}
} }
}); });

View file

@ -419,7 +419,9 @@ const backgroundLogic = {
// Unhide all hidden tabs // Unhide all hidden tabs
browser.runtime.sendMessage({ browser.runtime.sendMessage({
method: "showTabs", method: "showTabs",
userContextId: options.userContextId message: {
userContextId: options.userContextId
}
}); });
return browser.tabs.create({ return browser.tabs.create({
url, url,
@ -456,7 +458,7 @@ const messageHandler = {
init() { init() {
// Handles messages from webextension code // Handles messages from webextension code
browser.runtime.onMessage.addListener((m) => { browser.runtime.onMessage.addListener(async function (m) {
let response; let response;
switch (m.method) { switch (m.method) {
@ -474,7 +476,7 @@ const messageHandler = {
assignManager._neverAsk(m); assignManager._neverAsk(m);
break; break;
case "getAssignment": case "getAssignment":
response = browser.tabs.get(m.tabId).then((tab) => { response = browser.tabs.get(m.message.tabId).then((tab) => {
return assignManager._getAssignment(tab); return assignManager._getAssignment(tab);
}); });
break; break;
@ -485,13 +487,22 @@ const messageHandler = {
// m.tabId is used for where to place the in content message // m.tabId is used for where to place the in content message
// m.url is the assignment to be removed/added // m.url is the assignment to be removed/added
response = browser.tabs.get(m.tabId).then((tab) => { response = browser.tabs.get(m.tabId).then((tab) => {
return assignManager._setOrRemoveAssignment(tab.id, m.url, m.userContextId, m.value); return assignManager._setOrRemoveAssignment(tab.id, m.message.url, m.message.userContextId, m.message.value);
}); });
break; break;
case "exemptContainerAssignment": case "exemptContainerAssignment":
response = assignManager._exemptTab(m); response = assignManager._exemptTab(m);
break; break;
} }
if (response instanceof Promise) {
const resolvedResponse = await response;
browser.runtime.sendMessage({
method: "async-popup-response",
message: resolvedResponse,
uuid: m.uuid
});
return true;
}
return response; return response;
}); });
@ -499,6 +510,13 @@ const messageHandler = {
const port = browser.runtime.connect(); const port = browser.runtime.connect();
port.onMessage.addListener(m => { port.onMessage.addListener(m => {
switch (m.type) { switch (m.type) {
case "async-background-response":
browser.runtime.sendMessage({
method: "async-popup-response",
message: m.message.response,
uuid: m.message.uuid
});
break;
case "lightweight-theme-changed": case "lightweight-theme-changed":
themeManager.update(m.message); themeManager.update(m.message);
break; break;
@ -700,7 +718,9 @@ messageHandler.init();
browser.runtime.sendMessage({ browser.runtime.sendMessage({
method: "getPreference", method: "getPreference",
pref: "browser.privatebrowsing.autostart" message: {
pref: "browser.privatebrowsing.autostart"
}
}).then(pbAutoStart => { }).then(pbAutoStart => {
// We don't want to disable the addon if we are in auto private-browsing. // We don't want to disable the addon if we are in auto private-browsing.

View file

@ -83,6 +83,14 @@ const Logic = {
const identitiesPromise = this.refreshIdentities(); const identitiesPromise = this.refreshIdentities();
// Get the onboarding variation // Get the onboarding variation
const variationPromise = this.getShieldStudyVariation(); const variationPromise = this.getShieldStudyVariation();
browser.runtime.onMessage.addListener((m) => {
if (m.method === "async-popup-response" && m.uuid) {
const uuid = m.uuid;
if (uuid in this.asyncMessageQueue) {
this.asyncMessageQueue[uuid].response = m.message;
}
}
});
try { try {
await Promise.all([identitiesPromise, variationPromise]); await Promise.all([identitiesPromise, variationPromise]);
@ -183,12 +191,58 @@ const Logic = {
return false; return false;
}, },
asyncTimeout: 2000,
asyncRefresh: 20,
asyncMessageQueue: {},
asyncId() {
// UUID SO result, as you do
return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
},
asyncNotResponded: "@@_not_responded_@@",
asyncCreateMessage() {
const guid = this.asyncId();
this.asyncMessageQueue[guid] = {
time: Date.now(),
response: this.asyncNotResponded
};
return guid;
},
awaitMessage(methodName, message) {
return new Promise((resolve, reject) => {
const messageId = this.asyncCreateMessage();
browser.runtime.sendMessage({
method: methodName,
uuid: messageId,
message
});
const checkState = () => {
const messageState = this.asyncMessageQueue[messageId];
if (messageState.response !== this.asyncNotResponded) {
resolve(messageState.response);
delete this.asyncMessageQueue[messageId];
return;
}
if (Date.now() - this.asyncTimeout > messageState.time) {
reject(null);
delete this.asyncMessageQueue[messageId];
return;
} else {
setTimeout(checkState, this.asyncRefresh);
}
};
checkState();
});
},
refreshIdentities() { refreshIdentities() {
return Promise.all([ return Promise.all([
browser.contextualIdentities.query({}), browser.contextualIdentities.query({}),
browser.runtime.sendMessage({ this.awaitMessage("queryIdentitiesState")
method: "queryIdentitiesState"
})
]).then(([identities, state]) => { ]).then(([identities, state]) => {
this._identities = identities.map((identity) => { this._identities = identities.map((identity) => {
const stateObject = state[Logic.userContextId(identity.cookieStoreId)]; const stateObject = state[Logic.userContextId(identity.cookieStoreId)];
@ -278,28 +332,25 @@ const Logic = {
return Promise.reject("removeIdentity must be called with userContextId argument."); return Promise.reject("removeIdentity must be called with userContextId argument.");
} }
return browser.runtime.sendMessage({ return Logic.awaitMessage("deleteContainer", {
method: "deleteContainer", userContextId
message: {userContextId}
}); });
}, },
getAssignment(tab) { getAssignment(tab) {
return browser.runtime.sendMessage({ return Logic.awaitMessage("getAssignment", {
method: "getAssignment",
tabId: tab.id tabId: tab.id
}); });
}, },
getAssignmentObjectByContainer(userContextId) { getAssignmentObjectByContainer(userContextId) {
return browser.runtime.sendMessage({ return Logic.awaitMessage("getAssignmentObjectByContainer", {
method: "getAssignmentObjectByContainer", userContextId
message: {userContextId}
}); });
}, },
setOrRemoveAssignment(tabId, url, userContextId, value) { setOrRemoveAssignment(tabId, url, userContextId, value) {
return browser.runtime.sendMessage({ return Logic.awaitMessage("setOrRemoveAssignment", {
method: "setOrRemoveAssignment", method: "setOrRemoveAssignment",
tabId, tabId,
url, url,
@ -473,9 +524,7 @@ Logic.registerPanel(P_CONTAINERS_LIST, {
}); });
Logic.addEnterHandler(document.querySelector("#sort-containers-link"), () => { Logic.addEnterHandler(document.querySelector("#sort-containers-link"), () => {
browser.runtime.sendMessage({ Logic.awaitMessage("sortTabs").then(() => {
method: "sortTabs"
}).then(() => {
window.close(); window.close();
}).catch(() => { }).catch(() => {
window.close(); window.close();
@ -607,12 +656,9 @@ Logic.registerPanel(P_CONTAINERS_LIST, {
if (e.target.matches(".open-newtab") if (e.target.matches(".open-newtab")
|| e.target.parentNode.matches(".open-newtab") || e.target.parentNode.matches(".open-newtab")
|| e.type === "keydown") { || e.type === "keydown") {
browser.runtime.sendMessage({ Logic.awaitMessage("openTab", {
method: "openTab", userContextId: Logic.userContextId(identity.cookieStoreId),
message: { source: "pop-up"
userContextId: Logic.userContextId(identity.cookieStoreId),
source: "pop-up"
}
}).then(() => { }).then(() => {
window.close(); window.close();
}).catch(() => { }).catch(() => {
@ -659,8 +705,8 @@ Logic.registerPanel(P_CONTAINER_INFO, {
Logic.addEnterHandler(document.querySelector("#container-info-hideorshow"), () => { Logic.addEnterHandler(document.querySelector("#container-info-hideorshow"), () => {
const identity = Logic.currentIdentity(); const identity = Logic.currentIdentity();
browser.runtime.sendMessage({ const method = identity.hasHiddenTabs ? "showTabs" : "hideTabs";
method: identity.hasHiddenTabs ? "showTabs" : "hideTabs", Logic.awaitMessage(method, {
userContextId: Logic.currentUserContextId() userContextId: Logic.currentUserContextId()
}).then(() => { }).then(() => {
window.close(); window.close();
@ -670,9 +716,7 @@ Logic.registerPanel(P_CONTAINER_INFO, {
}); });
// Check if the user has incompatible add-ons installed // Check if the user has incompatible add-ons installed
browser.runtime.sendMessage({ Logic.awaitMessage("checkIncompatibleAddons").then(incompatible => {
method: "checkIncompatibleAddons"
}).then(incompatible => {
const moveTabsEl = document.querySelector("#container-info-movetabs"); const moveTabsEl = document.querySelector("#container-info-movetabs");
if (incompatible) { if (incompatible) {
const fragment = document.createDocumentFragment(); const fragment = document.createDocumentFragment();
@ -689,8 +733,7 @@ Logic.registerPanel(P_CONTAINER_INFO, {
moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling); moveTabsEl.parentNode.insertBefore(fragment, moveTabsEl.nextSibling);
} else { } else {
Logic.addEnterHandler(moveTabsEl, () => { Logic.addEnterHandler(moveTabsEl, () => {
browser.runtime.sendMessage({ Logic.awaitMessage("moveTabsToWindow", {
method: "moveTabsToWindow",
userContextId: Logic.userContextId(Logic.currentIdentity().cookieStoreId), userContextId: Logic.userContextId(Logic.currentIdentity().cookieStoreId),
}).then(() => { }).then(() => {
window.close(); window.close();
@ -731,9 +774,8 @@ Logic.registerPanel(P_CONTAINER_INFO, {
} }
// Let's retrieve the list of tabs. // Let's retrieve the list of tabs.
return browser.runtime.sendMessage({ return Logic.awaitMessage("getTabs", {
method: "getTabs", userContextId: Logic.currentUserContextId()
userContextId: Logic.currentUserContextId(),
}).then(this.buildInfoTable); }).then(this.buildInfoTable);
}, },
@ -753,9 +795,8 @@ Logic.registerPanel(P_CONTAINER_INFO, {
if (tab.active) { if (tab.active) {
tr.classList.add("clickable"); tr.classList.add("clickable");
Logic.addEnterHandler(tr, () => { Logic.addEnterHandler(tr, () => {
browser.runtime.sendMessage({ Logic.awaitMessage("showTab", {
method: "showTab", tabId: tab.id
tabId: tab.id,
}).then(() => { }).then(() => {
window.close(); window.close();
}).catch(() => { }).catch(() => {
@ -873,15 +914,12 @@ Logic.registerPanel(P_CONTAINER_EDIT, {
_submitForm() { _submitForm() {
const formValues = new FormData(this._editForm); const formValues = new FormData(this._editForm);
return browser.runtime.sendMessage({ return Logic.awaitMessage("createOrUpdateContainer", {
method: "createOrUpdateContainer", userContextId: formValues.get("container-id") || NEW_CONTAINER_ID,
message: { params: {
userContextId: formValues.get("container-id") || NEW_CONTAINER_ID, name: document.getElementById("edit-container-panel-name-input").value || Logic.generateIdentityName(),
params: { icon: formValues.get("container-icon") || DEFAULT_ICON,
name: document.getElementById("edit-container-panel-name-input").value || Logic.generateIdentityName(), color: formValues.get("container-color") || DEFAULT_COLOR,
icon: formValues.get("container-icon") || DEFAULT_ICON,
color: formValues.get("container-color") || DEFAULT_COLOR,
}
} }
}).then(() => { }).then(() => {
return Logic.refreshIdentities(); return Logic.refreshIdentities();