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
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
loader.lazyRequireGetter(
this,
"CommandsFactory",
"resource://devtools/shared/commands/commands-factory.js",
true
);
// Map of existing Commands objects, keyed by XULTab.
const commandsMap = new WeakMap();
/**
* Functions for creating unique Commands for Local Tabs.
*/
exports.LocalTabCommandsFactory = {
/**
* Create a unique commands object for the given tab.
*
* If a commands was already created by this factory for the provided tab,
* it will be returned and no new commands created.
*
* Otherwise, this will automatically:
* - spawn a DevToolsServer in the parent process,
* - create a DevToolsClient
* - connect the DevToolsClient to the DevToolsServer
* - call RootActor's `getTab` request to retrieve the WindowGlobalTargetActor's form
*
* @param {XULTab} tab
* The tab to use in creating a new commands.
*
* @return {Commands object} The commands object for the provided tab.
*/
async createCommandsForTab(tab) {
let commands = commandsMap.get(tab);
if (commands) {
// Keep in mind that commands can be either a promise
// or a commands object.
return commands;
}
const promise = CommandsFactory.forTab(tab);
// Immediately set the commands's promise in cache to prevent race
commandsMap.set(tab, promise);
commands = await promise;
// Then replace the promise with the commands object
commandsMap.set(tab, commands);
commands.descriptorFront.once("descriptor-destroyed", () => {
commandsMap.delete(tab);
});
return commands;
},
/**
* Retrieve an existing commands created by this factory for the provided
* tab. Returns null if no commands was created yet.
*
* @param {XULTab} tab
* The tab for which the commands should be retrieved
*/
async getCommandsForTab(tab) {
// commandsMap.get(tab) can either return an initialized commands, a promise
// which will resolve a commands, or null if no commands was ever created
// for this tab.
return commandsMap.get(tab);
},
};
|