summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_tabs_newtab_private.js
blob: 19146fbe42f3e9f908ac47e3eee33d503a3a9873 (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
"use strict";

const { ExtensionPermissions } = ChromeUtils.importESModule(
  "resource://gre/modules/ExtensionPermissions.sys.mjs"
);

const NEWTAB_PRIVATE_ALLOWED = "browser.newtab.privateAllowed";
const NEWTAB_EXTENSION_CONTROLLED = "browser.newtab.extensionControlled";
const NEWTAB_URI = "webext-newtab-1.html";

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

function verifyPrefSettings(controlled, allowed) {
  is(
    Services.prefs.getBoolPref(NEWTAB_EXTENSION_CONTROLLED, false),
    controlled,
    "newtab extension controlled"
  );
  is(
    Services.prefs.getBoolPref(NEWTAB_PRIVATE_ALLOWED, false),
    allowed,
    "newtab private permission after permission change"
  );

  if (controlled) {
    ok(
      AboutNewTab.newTabURL.endsWith(NEWTAB_URI),
      "Newtab url is overridden by the extension."
    );
  }
  if (controlled && allowed) {
    ok(
      BROWSER_NEW_TAB_URL.endsWith(NEWTAB_URI),
      "active newtab url is overridden by the extension."
    );
  } else {
    let expectednewTab = controlled ? "about:privatebrowsing" : "about:newtab";
    is(BROWSER_NEW_TAB_URL, expectednewTab, "active newtab url is default.");
  }
}

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

  verifyPrefSettings(true, allowed);
}

add_task(async function test_new_tab_private() {
  let extension = ExtensionTestUtils.loadExtension({
    manifest: {
      browser_specific_settings: {
        gecko: {
          id: "@private-newtab",
        },
      },
      chrome_url_overrides: {
        newtab: NEWTAB_URI,
      },
    },
    files: {
      NEWTAB_URI: `
        <!DOCTYPE html>
        <head>
          <meta charset="utf-8"/></head>
        <html>
          <body>
          </body>
        </html>
      `,
    },
    useAddonManager: "permanent",
  });
  await extension.startup();

  verifyPrefSettings(true, false);

  await promiseUpdatePrivatePermission(true, extension);

  await extension.unload();
});