summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/xpcshell/test_ext_background_teardown.js
blob: 243bc278676f5866f67131d81b84aa7531d5b39d (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
"use strict";

add_task(async function test_background_reload_and_unload() {
  let events = [];
  {
    const { Management } = ChromeUtils.importESModule(
      "resource://gre/modules/Extension.sys.mjs"
    );
    let record = (type, extensionContext) => {
      let eventType = type == "proxy-context-load" ? "load" : "unload";
      let url = extensionContext.uri.spec;
      let extensionId = extensionContext.extension.id;
      events.push({ eventType, url, extensionId });
    };

    Management.on("proxy-context-load", record);
    Management.on("proxy-context-unload", record);
    registerCleanupFunction(() => {
      Management.off("proxy-context-load", record);
      Management.off("proxy-context-unload", record);
    });
  }

  let extension = ExtensionTestUtils.loadExtension({
    background() {
      browser.test.onMessage.addListener(msg => {
        browser.test.assertEq("reload-background", msg);
        location.reload();
      });
      browser.test.sendMessage("background-url", location.href);
    },
  });

  await extension.startup();
  let backgroundUrl = await extension.awaitMessage("background-url");

  let contextEvents = events.splice(0);
  equal(
    contextEvents.length,
    1,
    "ExtensionContext state change after loading an extension"
  );
  equal(contextEvents[0].eventType, "load");
  equal(
    contextEvents[0].url,
    backgroundUrl,
    "The ExtensionContext should be the background page"
  );

  extension.sendMessage("reload-background");
  await extension.awaitMessage("background-url");

  contextEvents = events.splice(0);
  equal(
    contextEvents.length,
    2,
    "ExtensionContext state changes after reloading the background page"
  );
  equal(
    contextEvents[0].eventType,
    "unload",
    "Unload ExtensionContext of background page"
  );
  equal(
    contextEvents[0].url,
    backgroundUrl,
    "ExtensionContext URL = background"
  );
  equal(
    contextEvents[1].eventType,
    "load",
    "Create new ExtensionContext for background page"
  );
  equal(
    contextEvents[1].url,
    backgroundUrl,
    "ExtensionContext URL = background"
  );

  await extension.unload();

  contextEvents = events.splice(0);
  equal(
    contextEvents.length,
    1,
    "ExtensionContext state change after unloading the extension"
  );
  equal(
    contextEvents[0].eventType,
    "unload",
    "Unload ExtensionContext for background page after extension unloads"
  );
  equal(
    contextEvents[0].url,
    backgroundUrl,
    "ExtensionContext URL = background"
  );
});