summaryrefslogtreecommitdiffstats
path: root/devtools/client/fronts/descriptors/webextension.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/fronts/descriptors/webextension.js')
-rw-r--r--devtools/client/fronts/descriptors/webextension.js173
1 files changed, 173 insertions, 0 deletions
diff --git a/devtools/client/fronts/descriptors/webextension.js b/devtools/client/fronts/descriptors/webextension.js
new file mode 100644
index 0000000000..5db86ee5f8
--- /dev/null
+++ b/devtools/client/fronts/descriptors/webextension.js
@@ -0,0 +1,173 @@
+/* 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";
+
+const {
+ webExtensionDescriptorSpec,
+} = require("resource://devtools/shared/specs/descriptors/webextension.js");
+const {
+ FrontClassWithSpec,
+ registerFront,
+} = require("resource://devtools/shared/protocol.js");
+const {
+ DescriptorMixin,
+} = require("resource://devtools/client/fronts/descriptors/descriptor-mixin.js");
+const DESCRIPTOR_TYPES = require("resource://devtools/client/fronts/descriptors/descriptor-types.js");
+loader.lazyRequireGetter(
+ this,
+ "WindowGlobalTargetFront",
+ "resource://devtools/client/fronts/targets/window-global.js",
+ true
+);
+
+class WebExtensionDescriptorFront extends DescriptorMixin(
+ FrontClassWithSpec(webExtensionDescriptorSpec)
+) {
+ constructor(client, targetFront, parentFront) {
+ super(client, targetFront, parentFront);
+ this.traits = {};
+ }
+
+ descriptorType = DESCRIPTOR_TYPES.EXTENSION;
+
+ form(json) {
+ this.actorID = json.actor;
+
+ // Do not use `form` name to avoid colliding with protocol.js's `form` method
+ this._form = json;
+ this.traits = json.traits || {};
+ }
+
+ get backgroundScriptStatus() {
+ return this._form.backgroundScriptStatus;
+ }
+
+ get debuggable() {
+ return this._form.debuggable;
+ }
+
+ get hidden() {
+ return this._form.hidden;
+ }
+
+ get iconDataURL() {
+ return this._form.iconDataURL;
+ }
+
+ get iconURL() {
+ return this._form.iconURL;
+ }
+
+ get id() {
+ return this._form.id;
+ }
+
+ get isSystem() {
+ return this._form.isSystem;
+ }
+
+ get isWebExtensionDescriptor() {
+ return true;
+ }
+
+ get isWebExtension() {
+ return this._form.isWebExtension;
+ }
+
+ get manifestURL() {
+ return this._form.manifestURL;
+ }
+
+ get name() {
+ return this._form.name;
+ }
+
+ get persistentBackgroundScript() {
+ return this._form.persistentBackgroundScript;
+ }
+
+ get temporarilyInstalled() {
+ return this._form.temporarilyInstalled;
+ }
+
+ get url() {
+ return this._form.url;
+ }
+
+ get warnings() {
+ return this._form.warnings;
+ }
+
+ isServerTargetSwitchingEnabled() {
+ // For now, we don't expose any target out of the WatcherActor.
+ // And the top level target is still manually instantiated by the descriptor.
+ // We most likely need to wait for full enabling of EFT before being able to spawn
+ // the extension target from the server side as doing this would most likely break
+ // the iframe dropdown. It would break it as spawning the targets from the server
+ // would probably mean getting rid of the usage of WindowGlobalTargetActor._setWindow
+ // and instead spawn one target per extension document.
+ // That, instead of having a unique target for all the documents.
+ return false;
+ }
+
+ getWatcher() {
+ return super.getWatcher({
+ isServerTargetSwitchingEnabled: this.isServerTargetSwitchingEnabled(),
+ });
+ }
+
+ _createWebExtensionTarget(form) {
+ const front = new WindowGlobalTargetFront(this.conn, null, this);
+ front.form(form);
+ this.manage(front);
+ return front;
+ }
+
+ /**
+ * Retrieve the WindowGlobalTargetFront representing a
+ * WebExtensionTargetActor if this addon is a webextension.
+ *
+ * WebExtensionDescriptors will be created for any type of addon type
+ * (webextension, search plugin, themes). Only webextensions can be targets.
+ * This method will throw for other addon types.
+ *
+ * TODO: We should filter out non-webextension & non-debuggable addons on the
+ * server to avoid the isWebExtension check here. See Bug 1644355.
+ */
+ async getTarget() {
+ if (!this.isWebExtension) {
+ throw new Error(
+ "Tried to create a target for an addon which is not a webextension: " +
+ this.actorID
+ );
+ }
+
+ if (this._targetFront && !this._targetFront.isDestroyed()) {
+ return this._targetFront;
+ }
+
+ if (this._targetFrontPromise) {
+ return this._targetFrontPromise;
+ }
+
+ this._targetFrontPromise = (async () => {
+ let targetFront = null;
+ try {
+ const targetForm = await super.getTarget();
+ targetFront = this._createWebExtensionTarget(targetForm);
+ } catch (e) {
+ console.log(
+ `Request to connect to WebExtensionDescriptor "${this.id}" failed: ${e}`
+ );
+ }
+ this._targetFront = targetFront;
+ this._targetFrontPromise = null;
+ return targetFront;
+ })();
+ return this._targetFrontPromise;
+ }
+}
+
+exports.WebExtensionDescriptorFront = WebExtensionDescriptorFront;
+registerFront(WebExtensionDescriptorFront);