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.js315
1 files changed, 315 insertions, 0 deletions
diff --git a/devtools/client/fronts/webconsole.js b/devtools/client/fronts/webconsole.js
new file mode 100644
index 0000000000..e71b04841f
--- /dev/null
+++ b/devtools/client/fronts/webconsole.js
@@ -0,0 +1,315 @@
+/* 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._onNetworkEventUpdate = this._onNetworkEventUpdate.bind(this);
+
+ this.before("consoleAPICall", this.beforeConsoleAPICall);
+ this.before("pageError", this.beforePageError);
+ this.before("serverNetworkEvent", this.beforeServerNetworkEvent);
+
+ this._client.on("networkEventUpdate", this._onNetworkEventUpdate);
+ }
+
+ get actor() {
+ return this.actorID;
+ }
+
+ /**
+ * The "networkEventUpdate" message type handler. We redirect any message to
+ * the UI for displaying.
+ *
+ * @private
+ * @param object packet
+ * The message received from the server.
+ */
+ _onNetworkEventUpdate(packet) {
+ this.emit("serverNetworkUpdateEvent", packet);
+ }
+
+ beforeServerNetworkEvent(packet) {
+ // The stacktrace info needs to be sent before
+ // the network event.
+ this.emit("serverNetworkStackTrace", packet);
+ }
+
+ 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;
+ }
+
+ /**
+ * Retrieve the request headers from the given NetworkEventActor.
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the response is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces
+ */
+ getRequestHeaders(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getRequestHeaders",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Retrieve the request cookies from the given NetworkEventActor.
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the response is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces
+ */
+ getRequestCookies(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getRequestCookies",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Retrieve the request post data from the given NetworkEventActor.
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the response is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces
+ */
+ getRequestPostData(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getRequestPostData",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Retrieve the response headers from the given NetworkEventActor.
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the response is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces
+ */
+ getResponseHeaders(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getResponseHeaders",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Retrieve the response cookies from the given NetworkEventActor.
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the response is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces
+ */
+ getResponseCookies(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getResponseCookies",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Retrieve the response content from the given NetworkEventActor.
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the response is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces
+ */
+ getResponseContent(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getResponseContent",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Retrieve the response cache from the given NetworkEventActor
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the response is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces.
+ */
+ getResponseCache(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getResponseCache",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Retrieve the timing information for the given NetworkEventActor.
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the response is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces
+ */
+ getEventTimings(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getEventTimings",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Retrieve the security information for the given NetworkEventActor.
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the response is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces
+ */
+ getSecurityInfo(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getSecurityInfo",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Retrieve the stack-trace information for the given NetworkEventActor.
+ *
+ * @param string actor
+ * The NetworkEventActor ID.
+ * @param function onResponse
+ * The function invoked when the stack-trace is received.
+ * @return request
+ * Request object that implements both Promise and EventEmitter interfaces
+ */
+ getStackTrace(actor, onResponse) {
+ const packet = {
+ to: actor,
+ type: "getStackTrace",
+ };
+ return this._client.request(packet, onResponse);
+ }
+
+ /**
+ * Close the WebConsoleFront.
+ *
+ */
+ destroy() {
+ if (!this._client) {
+ return null;
+ }
+
+ this._client.off("networkEventUpdate", this._onNetworkEventUpdate);
+ // 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);