summaryrefslogtreecommitdiffstats
path: root/devtools/client/framework/local-tab-commands-factory.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/framework/local-tab-commands-factory.js')
-rw-r--r--devtools/client/framework/local-tab-commands-factory.js72
1 files changed, 72 insertions, 0 deletions
diff --git a/devtools/client/framework/local-tab-commands-factory.js b/devtools/client/framework/local-tab-commands-factory.js
new file mode 100644
index 0000000000..e7e32aa343
--- /dev/null
+++ b/devtools/client/framework/local-tab-commands-factory.js
@@ -0,0 +1,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);
+ },
+};