1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
/* 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);
};
let zoomFactor = 1;
this.getZoomFactor = function() {
return zoomFactor;
};
this.startBackground = (function() {
const exports = { startTime };
const backgroundScripts = [
"log.js",
"catcher.js",
"blobConverters.js",
"background/selectorLoader.js",
"background/communication.js",
"background/senderror.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 type => {
try {
let [[tab]] = await Promise.all([
browser.tabs.query({ currentWindow: true, active: true }),
loadIfNecessary(),
]);
zoomFactor = await browser.tabs.getZoom(tab.id);
if (type === "contextMenu") {
main.onClickedContextMenu(tab);
} else if (type === "toolbar") {
main.onClicked(tab);
} else if (type === "shortcut") {
main.onShortcut(tab);
}
} catch (error) {
console.error("Error loading Screenshots:", 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.runtime.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;
})();
|