summaryrefslogtreecommitdiffstats
path: root/devtools/client/fronts/webconsole.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/fronts/webconsole.js')
-rw-r--r--devtools/client/fronts/webconsole.js111
1 files changed, 111 insertions, 0 deletions
diff --git a/devtools/client/fronts/webconsole.js b/devtools/client/fronts/webconsole.js
new file mode 100644
index 0000000000..def2cc6a07
--- /dev/null
+++ b/devtools/client/fronts/webconsole.js
@@ -0,0 +1,111 @@
+/* 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 {
+ FrontClassWithSpec,
+ registerFront,
+} = require("resource://devtools/shared/protocol.js");
+const {
+ webconsoleSpec,
+} = require("resource://devtools/shared/specs/webconsole.js");
+const {
+ getAdHocFrontOrPrimitiveGrip,
+} = require("resource://devtools/client/fronts/object.js");
+
+/**
+ * A WebConsoleFront is used as a front end for the WebConsoleActor that is
+ * created on the server, hiding implementation details.
+ *
+ * @param object client
+ * The DevToolsClient instance we live for.
+ */
+class WebConsoleFront extends FrontClassWithSpec(webconsoleSpec) {
+ constructor(client, targetFront, parentFront) {
+ super(client, targetFront, parentFront);
+ this._client = client;
+ this.events = [];
+
+ // Attribute name from which to retrieve the actorID out of the target actor's form
+ this.formAttributeName = "consoleActor";
+
+ this.before("consoleAPICall", this.beforeConsoleAPICall);
+ this.before("pageError", this.beforePageError);
+ }
+
+ get actor() {
+ return this.actorID;
+ }
+
+ beforeConsoleAPICall(packet) {
+ if (packet.message && Array.isArray(packet.message.arguments)) {
+ // We might need to create fronts for each of the message arguments.
+ packet.message.arguments = packet.message.arguments.map(arg =>
+ getAdHocFrontOrPrimitiveGrip(arg, this)
+ );
+ }
+ return packet;
+ }
+
+ beforePageError(packet) {
+ if (packet?.pageError?.errorMessage) {
+ packet.pageError.errorMessage = getAdHocFrontOrPrimitiveGrip(
+ packet.pageError.errorMessage,
+ this
+ );
+ }
+
+ if (packet?.pageError?.exception) {
+ packet.pageError.exception = getAdHocFrontOrPrimitiveGrip(
+ packet.pageError.exception,
+ this
+ );
+ }
+ return packet;
+ }
+
+ async getCachedMessages(messageTypes) {
+ const response = await super.getCachedMessages(messageTypes);
+ if (Array.isArray(response.messages)) {
+ response.messages = response.messages.map(packet => {
+ if (Array.isArray(packet?.message?.arguments)) {
+ // We might need to create fronts for each of the message arguments.
+ packet.message.arguments = packet.message.arguments.map(arg =>
+ getAdHocFrontOrPrimitiveGrip(arg, this)
+ );
+ }
+
+ if (packet.pageError?.exception) {
+ packet.pageError.exception = getAdHocFrontOrPrimitiveGrip(
+ packet.pageError.exception,
+ this
+ );
+ }
+
+ return packet;
+ });
+ }
+ return response;
+ }
+
+ /**
+ * Close the WebConsoleFront.
+ *
+ */
+ destroy() {
+ if (!this._client) {
+ return null;
+ }
+
+ // This will make future calls to this function harmless because of the early return
+ // at the top of the function.
+ this._client = null;
+
+ return super.destroy();
+ }
+}
+
+exports.WebConsoleFront = WebConsoleFront;
+registerFront(WebConsoleFront);