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

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

add_task(async function test_reload_manifest_startupcache() {
  const id = "id@tests.mozilla.org";

  let ext = ExtensionTestUtils.loadExtension({
    manifest: {
      browser_specific_settings: {
        gecko: { id },
      },
      options_ui: {
        open_in_tab: true,
        page: "options.html",
      },
      optional_permissions: ["<all_urls>"],
    },
    useAddonManager: "temporary",
    files: {
      "options.html": `lol`,
    },
    background() {
      browser.runtime.openOptionsPage();
      browser.permissions.onAdded.addListener(() => {
        browser.runtime.openOptionsPage();
      });
    },
  });

  async function waitOptionsTab() {
    let tab = await BrowserTestUtils.waitForNewTab(gBrowser, url =>
      url.endsWith("options.html")
    );
    BrowserTestUtils.removeTab(tab);
  }

  // Open a non-blank tab to force options to open a new tab.
  let tab = await BrowserTestUtils.openNewForegroundTab(
    gBrowser,
    "https://example.com/"
  );
  let optionsTabPromise = waitOptionsTab();

  await ext.startup();
  await optionsTabPromise;

  let disabledPromise = awaitEvent("shutdown", id);
  let enabledPromise = awaitEvent("ready", id);
  optionsTabPromise = waitOptionsTab();

  let addon = await AddonManager.getAddonByID(id);
  await addon.reload();

  await Promise.all([disabledPromise, enabledPromise, optionsTabPromise]);

  optionsTabPromise = waitOptionsTab();
  ExtensionPermissions.add(id, {
    permissions: [],
    origins: ["<all_urls>"],
  });
  await optionsTabPromise;

  let policy = WebExtensionPolicy.getByID(id);
  let optionsUrl = policy.extension.manifest.options_ui.page;
  ok(optionsUrl.includes(policy.mozExtensionHostname), "Normalized manifest.");

  await BrowserTestUtils.removeTab(tab);
  await ext.unload();
});