summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/utils/object-inspector.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/webconsole/utils/object-inspector.js')
-rw-r--r--devtools/client/webconsole/utils/object-inspector.js158
1 files changed, 158 insertions, 0 deletions
diff --git a/devtools/client/webconsole/utils/object-inspector.js b/devtools/client/webconsole/utils/object-inspector.js
new file mode 100644
index 0000000000..8001828b51
--- /dev/null
+++ b/devtools/client/webconsole/utils/object-inspector.js
@@ -0,0 +1,158 @@
+/* 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 {
+ createFactory,
+ createElement,
+} = require("resource://devtools/client/shared/vendor/react.js");
+
+loader.lazyGetter(this, "REPS", function () {
+ return require("resource://devtools/client/shared/components/reps/index.js")
+ .REPS;
+});
+loader.lazyGetter(this, "MODE", function () {
+ return require("resource://devtools/client/shared/components/reps/index.js")
+ .MODE;
+});
+loader.lazyGetter(this, "ObjectInspector", function () {
+ const reps = require("resource://devtools/client/shared/components/reps/index.js");
+ return createFactory(reps.objectInspector.ObjectInspector);
+});
+
+loader.lazyRequireGetter(
+ this,
+ "SmartTrace",
+ "resource://devtools/client/shared/components/SmartTrace.js"
+);
+
+loader.lazyRequireGetter(
+ this,
+ "LongStringFront",
+ "resource://devtools/client/fronts/string.js",
+ true
+);
+
+loader.lazyRequireGetter(
+ this,
+ "ObjectFront",
+ "resource://devtools/client/fronts/object.js",
+ true
+);
+
+/**
+ * Create and return an ObjectInspector for the given front.
+ *
+ * @param {Object} grip
+ * The object grip to create an ObjectInspector for.
+ * @param {Object} serviceContainer
+ * Object containing various utility functions
+ * @param {Object} override
+ * Object containing props that should override the default props passed to
+ * ObjectInspector.
+ * @returns {ObjectInspector}
+ * An ObjectInspector for the given grip.
+ */
+function getObjectInspector(
+ frontOrPrimitiveGrip,
+ serviceContainer,
+ override = {}
+) {
+ let onDOMNodeMouseOver;
+ let onDOMNodeMouseOut;
+ let onInspectIconClick;
+
+ if (serviceContainer) {
+ onDOMNodeMouseOver = serviceContainer.highlightDomElement
+ ? object => serviceContainer.highlightDomElement(object)
+ : null;
+ onDOMNodeMouseOut = serviceContainer.unHighlightDomElement
+ ? object => serviceContainer.unHighlightDomElement(object)
+ : null;
+ onInspectIconClick = serviceContainer.openNodeInInspector
+ ? (object, e) => {
+ // Stop the event propagation so we don't trigger ObjectInspector expand/collapse.
+ e.stopPropagation();
+ serviceContainer.openNodeInInspector(object);
+ }
+ : null;
+ }
+
+ const roots = createRoots(frontOrPrimitiveGrip, override.pathPrefix);
+
+ const objectInspectorProps = {
+ autoExpandDepth: 0,
+ mode: MODE.LONG,
+ standalone: true,
+ roots,
+ onViewSourceInDebugger: serviceContainer.onViewSourceInDebugger,
+ recordTelemetryEvent: serviceContainer.recordTelemetryEvent,
+ openLink: serviceContainer.openLink,
+ sourceMapURLService: serviceContainer.sourceMapURLService,
+ customFormat: override.customFormat !== false,
+ setExpanded: override.setExpanded,
+ initiallyExpanded: override.initiallyExpanded,
+ queueActorsForCleanup: override.queueActorsForCleanup,
+ cachedNodes: override.cachedNodes,
+ urlCropLimit: 120,
+ renderStacktrace: stacktrace => {
+ const attrs = {
+ key: "stacktrace",
+ stacktrace,
+ onViewSourceInDebugger: serviceContainer
+ ? serviceContainer.onViewSourceInDebugger ||
+ serviceContainer.onViewSource
+ : null,
+ onViewSource: serviceContainer.onViewSource,
+ onReady: override.maybeScrollToBottom,
+ sourceMapURLService: serviceContainer
+ ? serviceContainer.sourceMapURLService
+ : null,
+ };
+
+ if (serviceContainer?.preventStacktraceInitialRenderDelay) {
+ attrs.initialRenderDelay = 0;
+ }
+ return createElement(SmartTrace, attrs);
+ },
+ onDOMNodeMouseOver,
+ onDOMNodeMouseOut,
+ onInspectIconClick,
+ defaultRep: REPS.Grip,
+ createElement: serviceContainer?.createElement,
+ mayUseCustomFormatter: true,
+ ...override,
+ };
+
+ if (override.autoFocusRoot) {
+ Object.assign(objectInspectorProps, {
+ focusedItem: objectInspectorProps.roots[0],
+ });
+ }
+
+ return ObjectInspector(objectInspectorProps);
+}
+
+function createRoots(frontOrPrimitiveGrip, pathPrefix = "") {
+ const isFront =
+ frontOrPrimitiveGrip instanceof ObjectFront ||
+ frontOrPrimitiveGrip instanceof LongStringFront;
+ const grip = isFront ? frontOrPrimitiveGrip.getGrip() : frontOrPrimitiveGrip;
+
+ return [
+ {
+ path: `${pathPrefix}${
+ frontOrPrimitiveGrip
+ ? frontOrPrimitiveGrip.actorID || frontOrPrimitiveGrip.actor
+ : null
+ }`,
+ contents: { value: grip, front: isFront ? frontOrPrimitiveGrip : null },
+ },
+ ];
+}
+
+module.exports = {
+ getObjectInspector,
+};