diff --git a/.tools/translate.js b/.tools/translate.js index 64e14f1..2723239 100644 --- a/.tools/translate.js +++ b/.tools/translate.js @@ -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); -}); \ No newline at end of file + saveTranslation(language, data); +}()); \ No newline at end of file diff --git a/lib/lists.js b/lib/lists.js index f633776..29ac9e2 100644 --- a/lib/lists.js +++ b/lib/lists.js @@ -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(){ diff --git a/lib/logging.js b/lib/logging.js index 50c1e9d..3ea4d34 100644 --- a/lib/logging.js +++ b/lib/logging.js @@ -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."); diff --git a/lib/main.js b/lib/main.js index e84561f..4328e27 100644 --- a/lib/main.js +++ b/lib/main.js @@ -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: [""], 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); }); }); diff --git a/lib/mobile.js b/lib/mobile.js index 020fcc4..bb7269a 100644 --- a/lib/mobile.js +++ b/lib/mobile.js @@ -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) diff --git a/lib/notification.js b/lib/notification.js index e68273b..13b7e1b 100644 --- a/lib/notification.js +++ b/lib/notification.js @@ -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); }); } } diff --git a/lib/persistentRndStorage.js b/lib/persistentRndStorage.js index 1434ad8..6c8aa3f 100644 --- a/lib/persistentRndStorage.js +++ b/lib/persistentRndStorage.js @@ -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(){ diff --git a/lib/settings.js b/lib/settings.js index d2e4ded..390a347 100644 --- a/lib/settings.js +++ b/lib/settings.js @@ -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."; } }; diff --git a/options/options.js b/options/options.js index 94c5227..d7734da 100644 --- a/options/options.js +++ b/options/options.js @@ -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); + } } } }); diff --git a/options/presets.js b/options/presets.js index 7cb1f18..092acda 100644 --- a/options/presets.js +++ b/options/presets.js @@ -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(); }()); \ No newline at end of file diff --git a/pageAction/pageAction.js b/pageAction/pageAction.js index 32bfb81..7cbe61b 100644 --- a/pageAction/pageAction.js +++ b/pageAction/pageAction.js @@ -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"); }()); \ No newline at end of file