diff options
Diffstat (limited to 'browser/extensions/screenshots/background/startBackground.js')
-rw-r--r-- | browser/extensions/screenshots/background/startBackground.js | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/browser/extensions/screenshots/background/startBackground.js b/browser/extensions/screenshots/background/startBackground.js new file mode 100644 index 0000000000..b32dc3d6f7 --- /dev/null +++ b/browser/extensions/screenshots/background/startBackground.js @@ -0,0 +1,135 @@ +/* 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/. */ + +/* globals browser, main, communication, manifest */ +/* This file handles: + clicks on the WebExtension page action + browser.contextMenus.onClicked + browser.runtime.onMessage + and loads the rest of the background page in response to those events, forwarding + the events to main.onClicked, main.onClickedContextMenu, or communication.onMessage +*/ +const startTime = Date.now(); + +// Set up to be able to use fluent: +(function() { + let link = document.createElement("link"); + link.setAttribute("rel", "localization"); + link.setAttribute("href", "browser/screenshots.ftl"); + document.head.appendChild(link); + + link = document.createElement("link"); + link.setAttribute("rel", "localization"); + link.setAttribute("href", "browser/branding/brandings.ftl"); + document.head.appendChild(link); +})(); + +this.getStrings = async function(ids) { + if (document.readyState != "complete") { + await new Promise(resolve => window.addEventListener("load", resolve, {once: true})); + } + await document.l10n.ready; + return document.l10n.formatValues(ids); +} + +this.startBackground = (function() { + const exports = {startTime}; + + const backgroundScripts = [ + "log.js", + "makeUuid.js", + "catcher.js", + "blobConverters.js", + "background/selectorLoader.js", + "background/communication.js", + "background/auth.js", + "background/senderror.js", + "build/raven.js", + "build/shot.js", + "build/thumbnailGenerator.js", + "background/analytics.js", + "background/deviceInfo.js", + "background/takeshot.js", + "background/main.js", + ]; + + browser.pageAction.onClicked.addListener(tab => { + loadIfNecessary().then(() => { + main.onClicked(tab); + }).catch(error => { + console.error("Error loading Screenshots:", error); + }); + }); + + this.getStrings([{id: "screenshots-context-menu"}]).then(msgs => { + browser.contextMenus.create({ + id: "create-screenshot", + title: msgs[0], + contexts: ["page", "selection"], + documentUrlPatterns: ["<all_urls>", "about:reader*"], + }); + }); + + browser.contextMenus.onClicked.addListener((info, tab) => { + loadIfNecessary().then(() => { + main.onClickedContextMenu(info, tab); + }).catch((error) => { + console.error("Error loading Screenshots:", error); + }); + }); + + browser.commands.onCommand.addListener((cmd) => { + if (cmd !== "take-screenshot") { + return; + } + loadIfNecessary().then(() => { + browser.tabs.query({currentWindow: true, active: true}).then((tabs) => { + const activeTab = tabs[0]; + main.onCommand(activeTab); + }).catch((error) => { + throw error; + }); + }).catch((error) => { + console.error("Error toggling Screenshots via keyboard shortcut: ", error); + }); + }); + + browser.runtime.onMessage.addListener((req, sender, sendResponse) => { + loadIfNecessary().then(() => { + return communication.onMessage(req, sender, sendResponse); + }).catch((error) => { + console.error("Error loading Screenshots:", error); + }); + return true; + }); + + let loadedPromise; + + function loadIfNecessary() { + if (loadedPromise) { + return loadedPromise; + } + loadedPromise = Promise.resolve(); + backgroundScripts.forEach((script) => { + loadedPromise = loadedPromise.then(() => { + return new Promise((resolve, reject) => { + const tag = document.createElement("script"); + tag.src = browser.extension.getURL(script); + tag.onload = () => { + resolve(); + }; + tag.onerror = (error) => { + const exc = new Error(`Error loading script: ${error.message}`); + exc.scriptName = script; + reject(exc); + }; + document.head.appendChild(tag); + }); + }); + }); + return loadedPromise; + } + + return exports; +})(); |