summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/xpcshell/test_ext_homepage_overrides_private.js
blob: edf039271282e6417bf35076d33aeaa5c578039d (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
124
125
126
127
128
129
130
131
132
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";

const { AddonTestUtils } = ChromeUtils.importESModule(
  "resource://testing-common/AddonTestUtils.sys.mjs"
);
const { HomePage } = ChromeUtils.import("resource:///modules/HomePage.jsm");
const { ExtensionPermissions } = ChromeUtils.importESModule(
  "resource://gre/modules/ExtensionPermissions.sys.mjs"
);

const { createAppInfo, promiseShutdownManager, promiseStartupManager } =
  AddonTestUtils;

const EXTENSION_ID = "test_overrides@tests.mozilla.org";
const HOMEPAGE_EXTENSION_CONTROLLED =
  "browser.startup.homepage_override.extensionControlled";
const HOMEPAGE_PRIVATE_ALLOWED =
  "browser.startup.homepage_override.privateAllowed";
const HOMEPAGE_URL_PREF = "browser.startup.homepage";
const HOMEPAGE_URI = "webext-homepage-1.html";

Services.prefs.setBoolPref("browser.privatebrowsing.autostart", true);

AddonTestUtils.init(this);
AddonTestUtils.usePrivilegedSignatures = false;
AddonTestUtils.overrideCertDB();

createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42");

function promisePrefChange(pref) {
  return new Promise((resolve, reject) => {
    Services.prefs.addObserver(pref, function observer() {
      Services.prefs.removeObserver(pref, observer);
      resolve(arguments);
    });
  });
}

let defaultHomepageURL;

function verifyPrefSettings(controlled, allowed) {
  equal(
    Services.prefs.getBoolPref(HOMEPAGE_EXTENSION_CONTROLLED, false),
    controlled,
    "homepage extension controlled"
  );
  equal(
    Services.prefs.getBoolPref(HOMEPAGE_PRIVATE_ALLOWED, false),
    allowed,
    "homepage private permission after permission change"
  );

  if (controlled && allowed) {
    ok(
      HomePage.get().endsWith(HOMEPAGE_URI),
      "Home page url is overridden by the extension"
    );
  } else {
    equal(HomePage.get(), defaultHomepageURL, "Home page url is default.");
  }
}

async function promiseUpdatePrivatePermission(allowed, extension) {
  info(`update private allowed permission`);
  await Promise.all([
    promisePrefChange(HOMEPAGE_PRIVATE_ALLOWED),
    ExtensionPermissions[allowed ? "add" : "remove"](
      extension.id,
      { permissions: ["internal:privateBrowsingAllowed"], origins: [] },
      extension
    ),
  ]);

  verifyPrefSettings(true, allowed);
}

add_task(async function test_overrides_private() {
  await promiseStartupManager();

  let extensionInfo = {
    useAddonManager: "permanent",
    manifest: {
      version: "1.0",
      browser_specific_settings: {
        gecko: {
          id: EXTENSION_ID,
        },
      },
      chrome_settings_overrides: {
        homepage: HOMEPAGE_URI,
      },
    },
  };
  let extension = ExtensionTestUtils.loadExtension(extensionInfo);

  defaultHomepageURL = HomePage.get();

  await extension.startup();

  verifyPrefSettings(true, false);

  equal(HomePage.get(), defaultHomepageURL, "Home page url is default.");

  info("add permission to extension");
  await promiseUpdatePrivatePermission(true, extension.extension);
  info("remove permission from extension");
  await promiseUpdatePrivatePermission(false, extension.extension);
  // set back to true to test upgrade removing extension control
  info("add permission back to prepare for upgrade test");
  await promiseUpdatePrivatePermission(true, extension.extension);

  extensionInfo.manifest = {
    version: "2.0",
    browser_specific_settings: {
      gecko: {
        id: EXTENSION_ID,
      },
    },
  };

  await Promise.all([
    promisePrefChange(HOMEPAGE_URL_PREF),
    extension.upgrade(extensionInfo),
  ]);

  verifyPrefSettings(false, false);

  await extension.unload();
  await promiseShutdownManager();
});