forked from mirrors/gecko-dev
The widget is only added if screenshots are enabled (similar behavior to the fxa toolbar button). Button must take into account onLocationChange due to the fact that screenshots extension is not available on about pages. Adds a test for the disabled state, with more screenshot tests intended in the future Differential Revision: https://phabricator.services.mozilla.com/D107727
122 lines
3.7 KiB
JavaScript
122 lines
3.7 KiB
JavaScript
/* 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.experiments.screenshots.onScreenshotCommand.addListener(async (isContextMenuClick) => {
|
|
try {
|
|
let [[tab]] = await Promise.all([
|
|
browser.tabs.query({currentWindow: true, active: true}),
|
|
loadIfNecessary(),
|
|
]);
|
|
isContextMenuClick ? main.onClickedContextMenu(tab) : main.onClicked(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;
|
|
})();
|