Switch to asych/await where useful

This commit is contained in:
kkapsner 2019-12-28 23:23:55 +01:00
parent 372ee755f7
commit 10413a89c3
11 changed files with 269 additions and 349 deletions

View File

@ -83,12 +83,10 @@ async function translate(language){
return data;
}
translate(language).then(function(data){
(async function(){
"use strict";
return saveTranslation(language, data);
}).catch(function(error){
"use strict";
const data = await translate(language);
console.error(error);
});
saveTranslation(language, data);
}());

View File

@ -114,11 +114,10 @@
}
return lists[type];
};
scope.appendTo = function appendToList(type, entry){
scope.appendTo = async function appendToList(type, entry){
const oldValue = settings[type + "List"];
return settings.set(type + "List", oldValue + (oldValue? ",": "") + entry).then(function(){
return updateList(type);
});
await settings.set(type + "List", oldValue + (oldValue? ",": "") + entry);
return updateList(type);
};
scope.update = updateList;
scope.updateAll = function updateAllLists(){

View File

@ -13,10 +13,11 @@
}
let settings = false;
scope.setSettings = function(realSettings){
scope.setSettings = async function(realSettings){
if (!settings){
settings = realSettings;
return settings.loaded.then(scope.clearQueue);
await settings.loaded;
return scope.clearQueue();
}
else {
warning("logging: Settings can only be set once.");

View File

@ -14,7 +14,7 @@
const registerSettingsContentScript = (function(){
let unregisterSettingsContentScript = function(){};
let lastRegistering;
return function registerSettingsContentScript(){
return async function registerSettingsContentScript(){
logging.message("Register content script for the settings.");
logging.verbose("Unregister old content script, if present.");
unregisterSettingsContentScript();
@ -23,7 +23,7 @@
data[def.name] = def.get();
});
lastRegistering = data;
browser.contentScripts.register({
const api = await browser.contentScripts.register({
matches: ["<all_urls>"],
matchAboutBlank: true,
allFrames: true,
@ -52,19 +52,16 @@
}
}(${JSON.stringify(data)}))`
}]
}).then(function(api){
logging.verbose("Content script registered.");
if (data !== lastRegistering){
logging.verbose("Multiple content scripts registered at once. Remove unnecessary one.");
api.unregister();
}
else {
unregisterSettingsContentScript = api.unregister;
}
return;
}).catch(function(error){
logging.warning("Unable to register content script:", error);
});
logging.verbose("Content script registered.");
if (data !== lastRegistering){
logging.verbose("Multiple content scripts registered at once. Remove unnecessary one.");
api.unregister();
}
else {
unregisterSettingsContentScript = api.unregister;
}
};
}());
@ -79,7 +76,7 @@
persistentRndStorage.init();
logging.message("register non port message listener");
browser.runtime.onMessage.addListener(function(data){
browser.runtime.onMessage.addListener(async function(data){
logging.notice("got data without port", data);
const keys = Object.keys(data);
if (data["canvasBlocker-new-domain-rnd"]){
@ -105,13 +102,9 @@
}
}
logging.notice("pass the message to the tabs");
browser.tabs.query({}).then(function(tabs){
tabs.forEach(function(tab){
browser.tabs.sendMessage(tab.id, data);
});
return;
}).catch(function(error){
logging.warning("Unable to get browser tabs:", error);
const tabs = await browser.tabs.query({});
tabs.forEach(function(tab){
browser.tabs.sendMessage(tab.id, data);
});
});
@ -190,10 +183,9 @@
}
// mobile default settings
mobile.ifMobile(function(){
return browser.storage.local.get().then(mobile.applyMobileDefaults).catch(function(error){
logging.error("Unable to set mobile default values:", error);
});
mobile.ifMobile(async function(){
const settings = await browser.storage.local.get();
mobile.applyMobileDefaults(settings);
});
});

View File

@ -15,31 +15,29 @@
const settings = require("./settings");
const settingDefinitions = require("./settingDefinitions");
scope.isMobile = function isMobile(){
scope.isMobile = async function isMobile(){
// todo: proper mobile check (e.g. over browser.runtime.getBrowserInfo()) and no feature check
return Promise.resolve(
!browser.pageAction ||
return !browser.pageAction ||
!browser.pageAction.show ||
!browser.pageAction.openPopup
);
;
};
scope.ifMobile = function ifMobile(ifCallback, elseCallback){
return scope.isMobile().then(function(isMobile){
if (isMobile){
return ifCallback();
}
else if (elseCallback){
return elseCallback();
}
else {
return false;
}
});
scope.ifMobile = async function ifMobile(ifCallback, elseCallback){
const isMobile = await scope.isMobile();
if (isMobile){
return ifCallback();
}
else if (elseCallback){
return elseCallback();
}
else {
return false;
}
};
scope.applyMobileDefaults = function applyMobileDefaults(storage = false){
return Promise.all(settingDefinitions.filter(function(definition){
scope.applyMobileDefaults = async function applyMobileDefaults(storage = false){
await Promise.all(settingDefinitions.filter(function(definition){
return definition.hasOwnProperty("mobileDefaultValue") && (
!storage ||
!storage.hasOwnProperty(definition.name)

View File

@ -163,16 +163,12 @@
});
};
settings.on("showNotifications", function({newValue}){
settings.on("showNotifications", async function({newValue}){
if (!newValue){
logging.message("notifications were disabled -> hide all page actions");
browser.tabs.query({}).then(function(tabs){
tabs.forEach(function(tab){
browser.pageAction.hide(tab.id);
});
return;
}).catch(function(error){
logging.warning("Unable to get browser tabs:", error);
const tabs = await browser.tabs.query({});
tabs.forEach(function(tab){
browser.pageAction.hide(tab.id);
});
}
});
@ -180,20 +176,16 @@
browser.tabs.onRemoved.addListener(function(tabId){
tabsData.delete(tabId);
});
settings.on("displayBadge", function({newValue}){
settings.on("displayBadge", async function({newValue}){
if (!newValue){
logging.message("badge was disabled -> hide all badges");
if (browser.browserAction.setBadgeText){
browser.tabs.query({}).then(function(tabs){
tabs.forEach(function(tab){
browser.browserAction.setBadgeText({
tabId: tab.id,
text: ""
});
const tabs = await browser.tabs.query({});
tabs.forEach(function(tab){
browser.browserAction.setBadgeText({
tabId: tab.id,
text: ""
});
return;
}).catch(function(error){
logging.warning("Unable to get browser tabs:", error);
});
}
}

View File

@ -89,17 +89,13 @@
};
}();
browser.windows.onRemoved.addListener(function(){
browser.windows.getAll().then(function(windows){
if (windows.every(function(window){
return !window.incognito;
})){
clearIncognito();
}
return;
}).catch(function(error){
logging.warning("Unable to get browser windows:", error);
});
browser.windows.onRemoved.addListener(async function(){
const windows = await browser.windows.getAll();
if (windows.every(function(window){
return !window.incognito;
})){
clearIncognito();
}
});
function registerTimeout(){
@ -117,14 +113,10 @@
}
}
}
function broadcast(data){
browser.tabs.query({}).then(function(tabs){
tabs.forEach(function(tab){
browser.tabs.sendMessage(tab.id, data);
});
return;
}).catch(function(error){
logging.warning("Unable to get browser tabs:", error);
async function broadcast(data){
const tabs = await browser.tabs.query({});
tabs.forEach(function(tab){
browser.tabs.sendMessage(tab.id, data);
});
}
function clearIncognito(){

View File

@ -129,24 +129,24 @@
}
return true;
};
const storeValue = function storeValue(newValue){
const storeValue = async function storeValue(newValue){
logging.verbose("Trying to store new value for %s", name, newValue);
settings[name] = newValue;
if (!settingDefinition.transient){
const storeObject = {};
storeObject[name] = newValue;
const promise = browser.storage.local.set(storeObject);
promise.then(function(){
try {
await browser.storage.local.set(storeObject);
logging.verbose("New value stored for %s:", name, newValue);
return;
}).catch(function(error){
}
catch (error){
logging.error("Unable to store new value for %s:", name, newValue, error);
});
return promise;
throw error;
}
}
else {
logging.warning("Transient setting %s cannot be stored.", name);
return Promise.reject("Transient setting " + name + " cannot be stored.");
throw "Transient setting " + name + " cannot be stored.";
}
};

View File

@ -35,23 +35,18 @@
logging.notice("send message to main script");
extension.message.send({"canvasBlocker-clear-domain-rnd": true});
},
clearPersistentRndForContainer: function(){
browser.contextualIdentities.query({}).then(function(identities){
return modal.select(
extension.getTranslation("clearPersistentRndForContainer_title"),
identities.map(function(identity){
return {
name: `${identity.name} (${identity.cookieStoreId})`,
object: identity
};
})
);
}).then(function(identity){
extension.message.send({"canvasBlocker-clear-container-rnd": identity.cookieStoreId});
return;
}).catch(function(error){
logging.warning("Unable to clear persistent rnd for container:", error);
});
clearPersistentRndForContainer: async function(){
const identities = await browser.contextualIdentities.query({});
const identity = await modal.select(
extension.getTranslation("clearPersistentRndForContainer_title"),
identities.map(function(identity){
return {
name: `${identity.name} (${identity.cookieStoreId})`,
object: identity
};
})
);
extension.message.send({"canvasBlocker-clear-container-rnd": identity.cookieStoreId});
},
inspectSettings: function(){
logging.verbose("open settings inspection");
@ -96,9 +91,9 @@
logging.verbose("open whitelist inspection");
window.open("whitelist.html", "_blank");
},
loadSettings: function(){
loadSettings: async function(){
logging.verbose("load settings");
new Promise(function(resolve, reject){
const text = await new Promise(function(resolve, reject){
const input = document.createElement("input");
input.type = "file";
input.addEventListener("change", function(){
@ -114,32 +109,27 @@
}
});
input.click();
}).then(function(text){
return JSON.parse(text);
}).then(function(json){
while (settingsMigration.transitions.hasOwnProperty(json.storageVersion)){
let oldVersion = json.storageVersion;
json = settingsMigration.transitions[json.storageVersion](json);
if (oldVersion === json.storageVersion){
break;
}
});
let json = JSON.parse(text);
while (settingsMigration.transitions.hasOwnProperty(json.storageVersion)){
let oldVersion = json.storageVersion;
json = settingsMigration.transitions[json.storageVersion](json);
if (oldVersion === json.storageVersion){
break;
}
const keys = Object.keys(json);
keys.forEach(function(key){
const setting = settings.getDefinition(key);
if (!settings){
throw new Error("Unknown setting " + key + ".");
}
if (!setting.fixed && setting.invalid(json[key])){
throw new Error("Invalid value " + json[key] + " for " + key + ".");
}
});
keys.forEach(function(key){
settings[key] = json[key];
});
return;
}).catch(function(error){
alert(error);
}
const keys = Object.keys(json);
keys.forEach(function(key){
const setting = settings.getDefinition(key);
if (!settings){
throw new Error("Unknown setting " + key + ".");
}
if (!setting.fixed && setting.invalid(json[key])){
throw new Error("Invalid value " + json[key] + " for " + key + ".");
}
});
keys.forEach(function(key){
settings[key] = json[key];
});
},
resetSettings: async function(){
@ -165,18 +155,7 @@
}
};
new Promise(function(resolve){
const port = browser.runtime.connect();
port.onMessage.addListener(function(data){
if (data.hasOwnProperty("tabId")){
logging.notice("my tab id is", data.tabId);
port.disconnect();
resolve(data.tabId);
}
});
}).then(function(tabId){
return browser.tabs.get(tabId);
}).then(function(tab){
browser.tabs.getCurrent().then(function(tab){
document.querySelector("head title").textContent = extension.getTranslation("options_title");
let head = document.createElement("header");
document.body.insertBefore(head, document.body.firstChild);
@ -236,7 +215,7 @@
linkDiv.appendChild(link);
head.appendChild(linkDiv);
}
return;
return undefined;
}).catch(function(error){
logging.warning("Unable to identify tab:", error);
});
@ -569,7 +548,7 @@
return response.json();
}).then(function(manifest){
version.textContent = "Version " + manifest.version;
return;
return manifest.version;
}).catch(function(error){
version.textContent = "Unable to get version: " + error;
});
@ -578,7 +557,7 @@
settings.onloaded(function(){
const reCaptchaEntry = "^https://www\\.google\\.com/recaptcha/api2/(?:b?frame|anchor).*$";
const {url: urlContainer} = settings.getContainers();
settings.on("protectWindow", function({newValue}){
settings.on("protectWindow", async function({newValue}){
if (newValue){
const urlValue = urlContainer.get();
const matching = urlValue.filter(function(entry){
@ -591,20 +570,16 @@
matching[0].protectWindow
)
){
modal.confirm(
const addException = await modal.confirm(
extension.getTranslation("protectWindow_askReCaptchaException"),
{
node: document.querySelector("[data-storage-name=protectWindow]"),
selector: ".settingRow .content"
}
).then(function(addException){
if (addException){
settings.set("protectWindow", false, reCaptchaEntry);
}
return;
}).catch(function(error){
logging.warning("Error while adding reCaptcha exception:", error);
});
);
if (addException){
settings.set("protectWindow", false, reCaptchaEntry);
}
}
}
});

View File

@ -1,7 +1,7 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
(function(){
(async function(){
"use strict";
const extension = require("../lib/extension");
@ -76,8 +76,8 @@
if (settingsList.childNodes.length){
const button = document.createElement("button");
button.textContent = extension.getTranslation("apply");
button.addEventListener("click", function(){
Promise.all(Object.keys(preset).map(function(settingName){
button.addEventListener("click", async function(){
await Promise.all(Object.keys(preset).map(function(settingName){
const value = preset[settingName];
if ((typeof value) === "object"){
return Promise.all(Object.keys(value).map(function(url){
@ -87,12 +87,9 @@
else {
return settings.set(settingName, value);
}
})).then(function(){
window.location.reload();
return;
}).catch(function(error){
logging.warning("Unable to apply preset:", error);
});
}));
window.location.reload();
});
container.appendChild(button);
}
@ -100,20 +97,7 @@
return container;
}
Promise.all([
settings.loaded,
fetch("presets.json").then(function(data){
return data.json();
})
// eslint-disable-next-line no-unused-vars
]).then(function([settingsLoaded, presets]){
Object.keys(presets).map(function(presetName){
return buildPresetGui(presetName, presets[presetName]);
}).forEach(function(node){
document.body.appendChild(node);
});
// fit content to the window size
function fitContentToWindowSize(){
if (window.innerHeight > document.body.getBoundingClientRect().bottom){
const computedStyle = window.getComputedStyle(document.body);
const availableHeight = window.innerHeight - parseFloat(computedStyle.marginBottom);
@ -141,10 +125,7 @@
document.body.style.fontSize = fontSize + "px";
}
}
return;
}).catch(function(error){
logging.warning("Unable to setup presets:", error);
});
}
document.querySelector("head title").textContent = extension.getTranslation("presets_title");
let head = document.createElement("header");
@ -153,7 +134,7 @@
let heading = document.createElement("h1");
heading.textContent = extension.getTranslation("presets");
head.appendChild(heading);
if (searchParameters.has("notice")){
const noticeName = `presets_${searchParameters.get("notice")}Notice`;
const noticeText = extension.getTranslation(noticeName);
@ -195,4 +176,17 @@
introduction.className = "introduction";
introduction.textContent = extension.getTranslation("presets_introduction");
head.appendChild(introduction);
const [settingsLoaded, presets] = await Promise.all([
settings.loaded,
(await fetch("presets.json")).json()
]);
Object.keys(presets).map(function(presetName){
return buildPresetGui(presetName, presets[presetName]);
}).forEach(function(node){
document.body.appendChild(node);
});
fitContentToWindowSize();
}());

View File

@ -1,7 +1,7 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
(function(){
(async function(){
"use strict";
const extension = require("../lib/extension");
@ -37,12 +37,9 @@
{
name: "disableNotifications",
isIcon: true,
callback: function(){
settings.set("showNotifications", false).then(function(){
return window.close();
}).catch(function(error){
logging.warning("Unable to disable notifications:", error);
});
callback: async function(){
await settings.set("showNotifications", false);
window.close();
}
}
],
@ -55,26 +52,24 @@
{
name: "ignorelist",
isIcon: true,
callback: function({domain, urls}){
return domainOrUrlPicker(
callback: async function({domain, urls}){
const choice = await domainOrUrlPicker(
domain,
urls,
extension.getTranslation("selectIgnore"),
extension.getTranslation("inputIgnoreURL")
).then(function(choice){
if (choice){
return settings.set("showNotifications", false, choice);
}
return false;
}).then(function(){
return window.close();
});
);
if (choice){
await settings.set("showNotifications", false, choice);
}
window.close();
}
},
{
name: "whitelist",
isIcon: true,
callback: function({domain, urls, api}){
callback: async function({domain, urls, api}){
const whitelistingSettings = {
all: {name: "blockMode", value: "allow"},
canvas: {name: "protectedCanvasPart", value: "nothing"},
@ -85,67 +80,56 @@
windows: {name: "protectWindow", value: false},
screen: {name: "protectScreen", value: false},
};
return domainOrUrlPicker(
const choice = await domainOrUrlPicker(
domain,
urls,
extension.getTranslation("selectWhitelist"),
extension.getTranslation("inputWhitelistURL")
).then(function(choice){
if (
api &&
whitelistingSettings[api]
){
// eslint-disable-next-line promise/no-nesting
return modalChoice(
extension.getTranslation("selectWhitelistScope"),
[
{
text: extension.getTranslation("whitelistOnlyAPI")
.replace(
/\{api\}/g,
extension.getTranslation("section_" + api + "-api")
),
value: api
},
{
text: extension.getTranslation("whitelistAllAPIs"),
value: "all"
}
]
).then(function(selection){
return {choice, setting: whitelistingSettings[selection]};
});
}
else {
return {choice, setting: whitelistingSettings.all};
}
}).then(function({choice, setting}){
if (choice){
return settings.set(setting.name, setting.value, choice);
}
return false;
}).then(function(){
return window.close();
});
);
let setting = whitelistingSettings.all;
if (
api &&
whitelistingSettings[api]
){
setting = whitelistingSettings[await modalChoice(
extension.getTranslation("selectWhitelistScope"),
[
{
text: extension.getTranslation("whitelistOnlyAPI")
.replace(
/\{api\}/g,
extension.getTranslation("section_" + api + "-api")
),
value: api
},
{
text: extension.getTranslation("whitelistAllAPIs"),
value: "all"
}
]
)];
}
if (choice){
await settings.set(setting.name, setting.value, choice);
}
window.close();
}
},
{
name: "whitelistTemporarily",
isIcon: true,
callback: function({domain, urls}){
return domainOrUrlPicker(
callback: async function({domain, urls}){
const choice = await domainOrUrlPicker(
domain,
urls,
extension.getTranslation("selectSessionWhitelist"),
extension.getTranslation("inputSessionWhitelistURL")
).then(function(choice){
if (choice){
return lists.appendTo("sessionWhite", choice);
}
return false;
}).then(function(){
return window.close();
});
);
if (choice){
await lists.appendTo("sessionWhite", choice);
}
window.close();
}
},
{
@ -193,7 +177,7 @@
});
}
function domainOrUrlPicker(domain, urls, selectText, urlInputText){
async function domainOrUrlPicker(domain, urls, selectText, urlInputText){
const choices = Array.from(urls).map(function(url){
return {
text: url,
@ -203,99 +187,94 @@
if (domain){
choices.unshift(domain);
}
return modalChoice(
const choice = await modalChoice(
selectText,
choices
).then(function(choice){
if (choice.startsWith("^")){
return modalPrompt(
urlInputText,
choice
);
}
else {
return choice;
}
});
);
if (choice.startsWith("^")){
return modalPrompt(
urlInputText,
choice
);
}
else {
return choice;
}
}
Promise.all([
const values = await Promise.all([
browser.tabs.query({active: true, currentWindow: true}),
settings.loaded
]).then(function(values){
const tabs = values[0];
if (!tabs.length){
throw new Error("noTabsFound");
]);
const tabs = values[0];
if (!tabs.length){
throw new Error("noTabsFound");
}
else if (tabs.length > 1){
logging.error(tabs);
throw new Error("tooManyTabsFound");
}
registerActionButtons();
registerDomainActions();
registerNotificationActions();
const tab = tabs[0];
extension.message.on(function(data){
if (data["canvasBlocker-notificationCounter"]){
const url = new URL(data.url);
Object.keys(data["canvasBlocker-notificationCounter"]).forEach(function(key){
domainNotification(
url,
key,
data["canvasBlocker-notificationCounter"][key].count,
data["canvasBlocker-notificationCounter"][key].api
);
});
}
else if (tabs.length > 1){
logging.error(tabs);
throw new Error("tooManyTabsFound");
}
registerActionButtons();
registerDomainActions();
registerNotificationActions();
const tab = tabs[0];
extension.message.on(function(data){
if (data["canvasBlocker-notificationCounter"]){
const url = new URL(data.url);
Object.keys(data["canvasBlocker-notificationCounter"]).forEach(function(key){
domainNotification(
url,
key,
data["canvasBlocker-notificationCounter"][key].count,
data["canvasBlocker-notificationCounter"][key].api
);
});
}
if (
Array.isArray(data["canvasBlocker-notifications"]) &&
data["canvasBlocker-notifications"].length
){
logging.message("got notifications");
const notifications = data["canvasBlocker-notifications"];
let i = 0;
const length = notifications.length;
const tick = window.setInterval(function(){
if (i >= length){
window.clearInterval(tick);
}
else {
let delta = 0;
for (; delta < 20 && i + delta < length; delta += 1){
let notification = notifications[i + delta];
logging.verbose(notification);
if (settings.ignoredAPIs[notification.api]){
continue;
}
logging.verbose(notification);
notification.url = new URL(notification.url);
domainNotification(
notification.url,
notification.messageId,
0,
notification.api
).addNotification(new Notification(notification));
if (
Array.isArray(data["canvasBlocker-notifications"]) &&
data["canvasBlocker-notifications"].length
){
logging.message("got notifications");
const notifications = data["canvasBlocker-notifications"];
let i = 0;
const length = notifications.length;
const tick = window.setInterval(function(){
if (i >= length){
window.clearInterval(tick);
}
else {
let delta = 0;
for (; delta < 20 && i + delta < length; delta += 1){
let notification = notifications[i + delta];
logging.verbose(notification);
if (settings.ignoredAPIs[notification.api]){
continue;
}
i += delta;
logging.verbose(notification);
notification.url = new URL(notification.url);
domainNotification(
notification.url,
notification.messageId,
0,
notification.api
).addNotification(new Notification(notification));
}
}, 1);
}
});
logging.message("request notifications from tab", tab.id);
browser.tabs.sendMessage(
tab.id,
{
"canvasBlocker-sendNotifications": tab.id
}
);
logging.notice("waiting for notifications");
return;
}).catch(function(error){
error(error);
i += delta;
}
}, 1);
}
});
logging.message("request notifications from tab", tab.id);
browser.tabs.sendMessage(
tab.id,
{
"canvasBlocker-sendNotifications": tab.id
}
);
logging.notice("waiting for notifications");
}());