Source code
Revision control
Copy as Markdown
Other Tools
/* 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
"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);
},
};