summaryrefslogtreecommitdiffstats
path: root/browser/extensions/screenshots/background/startBackground.js
blob: 5d35db3638058acd6c2dd1e3e1f0e38c92388ca7 (plain)
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", "toolkit/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" || type === "quickaction") {
          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;
})();