aboutsummaryrefslogtreecommitdiff
path: root/modules/firefox.home/chrome/extensionsManager.uc.js
blob: f5f3ed24ac58919a1cce902fe96d4d592bee36ac (plain) (blame)
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
// ==UserScript==
// @name                 Custom New Tab
// @version              1.0
// @description          Load a custom link or local file, instead of the default new tab page
// @startup              UC.extensionsManager.init(win)
// @shutdown             UC.extensionsManager.destroy();
// ==/UserScript==

(() => {
  const ENABLE = false;

  // Managed in about:config
  const EXTENSION_SETTINGS_PREF = 'extensions.uc.userExtensionSettings'

  const getSettings = () => {
    try {
      return JSON.parse(xPref.get(EXTENSION_SETTINGS_PREF) || 'null') ?? {};
    } catch (e) {
      return {};
    }
  }

  const saveSettings = (settings) =>
    xPref.set(EXTENSION_SETTINGS_PREF, JSON.stringify(settings));

  const updateExtensionSetting = (id, update) => {
    const settings = getSettings();
    settings.extensions[id] ??= {};
    settings.extensions[id] = update(settings.extensions[id] ?? {}) ?? {};
    saveSettings(settings);
  }

  const getCurrentTabHost = () => gBrowser.selectedTab.linkedBrowser.currentURI.host.trim() || null;

  const module = {
    disableForHost(id, host = getCurrentTabHost()) {
      updateExtensionSetting(id, s => {
        const urls = new Set(s.disabledHosts || []);
        urls.add(host);
        s.disabledHosts = [...urls];
        return s;
      });
    },

    async onTabChange() {
      const currentHost = getCurrentTabHost();
      if (!currentHost) return;

      const settings = getSettings();
      const addons = await AddonManager.getAllAddons();
      addons.forEach(addon => {
        const disabledHosts = settings?.extensions[addon.id].disabledHosts ?? [];
        const shouldDisable = disabledHosts.includes(currentHost)

        if (addon.isActive && shouldDisable)
          return addon.disable();
        if (!addon.isActive && !shouldDisable)
          return addon.enable();
      })
    },

    init(_win) {
      if (!ENABLE) return;

      Services.obs.addObserver(module.onTabChange, 'TabSelect');
    },
    destroy() {
      Services.obs.removeObserver(module.onTabChange, 'TabSelect');
    },
  };

  UC.extensionsManager = module;
})();