summaryrefslogtreecommitdiffstats
path: root/devtools/client/shared/test/browser_dbg_listaddons.js
blob: d6d302db34542b38794fda09ec283c7ab9c0dda7 (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
133
134
135
136
137
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

var {
  DevToolsServer,
} = require("resource://devtools/server/devtools-server.js");
var {
  DevToolsClient,
} = require("resource://devtools/client/devtools-client.js");

/**
 * Make sure the listAddons request works as specified.
 */
const ADDON1_ID = "test-addon-1@mozilla.org";
const ADDON1_PATH = "addons/test-addon-1/";
const ADDON2_ID = "test-addon-2@mozilla.org";
const ADDON2_PATH = "addons/test-addon-2/";

add_task(async function () {
  DevToolsServer.init();
  DevToolsServer.registerAllActors();

  const transport = DevToolsServer.connectPipe();
  const client = new DevToolsClient(transport);

  const [type] = await client.connect();
  is(type, "browser", "Root actor should identify itself as a browser.");

  let addonListChangedEvents = 0;
  client.mainRoot.on("addonListChanged", () => addonListChangedEvents++);
  const addons = await client.mainRoot.getFront("addons");

  const addon1 = await addTemporaryAddon({
    addons,
    path: ADDON1_PATH,
    openDevTools: false,
  });
  const addonFront1 = await client.mainRoot.getAddon({ id: ADDON1_ID });
  is(addonListChangedEvents, 0, "Should not receive addonListChanged yet.");
  ok(addonFront1, "Should find an addon actor for addon1.");

  const addon2 = await addTemporaryAddon({
    addons,
    path: ADDON2_PATH,
    openDevTools: true,
  });
  const front1AfterAddingAddon2 = await client.mainRoot.getAddon({
    id: ADDON1_ID,
  });
  const addonFront2 = await client.mainRoot.getAddon({ id: ADDON2_ID });

  is(
    addonListChangedEvents,
    1,
    "Should have received an addonListChanged event."
  );
  ok(addonFront2, "Should find an addon actor for addon2.");
  is(
    addonFront1,
    front1AfterAddingAddon2,
    "Front for addon1 should be the same"
  );

  await removeAddon(addon1);
  const front1AfterRemove = await client.mainRoot.getAddon({ id: ADDON1_ID });
  is(
    addonListChangedEvents,
    2,
    "Should have received an addonListChanged event."
  );
  ok(!front1AfterRemove, "Should no longer get a front for addon1");

  await removeAddon(addon2);
  const front2AfterRemove = await client.mainRoot.getAddon({ id: ADDON2_ID });
  is(
    addonListChangedEvents,
    3,
    "Should have received an addonListChanged event."
  );
  ok(!front2AfterRemove, "Should no longer get a front for addon1");

  // Check behavior when openDevTools is not passed:
  const addon2again = await addTemporaryAddon({
    addons,
    path: ADDON2_PATH,
    // openDevTools: null,
  });
  const addonFront2again = await client.mainRoot.getAddon({ id: ADDON2_ID });
  ok(addonFront2again, "Should find an addon actor for addon2.");
  is(addonListChangedEvents, 4, "Should have seen addonListChanged.");
  await removeAddon(addon2again);
  is(addonListChangedEvents, 5, "Should have seen addonListChanged.");

  await client.close();
});

async function addTemporaryAddon({ addons, path, openDevTools }) {
  const addonFilePath = getTestFilePath(path);
  info("Installing addon: " + addonFilePath);

  const onToolboxReady = gDevTools.once("toolbox-ready");
  const { id } = await addons.installTemporaryAddon(
    addonFilePath,
    openDevTools
  );

  if (openDevTools) {
    info("Wait for toolbox to be opened");
    const toolbox = await onToolboxReady;
    ok(true, "Toolbox was opened when openDevTools option was true");
    info("Destroying this toolbox");
    await toolbox.destroy();
  }

  return AddonManager.getAddonByID(id);
}

function removeAddon(addon) {
  return new Promise(resolve => {
    info("Removing addon.");

    const listener = {
      onUninstalled(uninstalledAddon) {
        if (uninstalledAddon != addon) {
          return;
        }
        AddonManager.removeAddonListener(listener);
        resolve();
      },
    };

    AddonManager.addAddonListener(listener);
    addon.uninstall();
  });
}