diff options
Diffstat (limited to 'devtools/client/webconsole/utils/object-inspector.js')
-rw-r--r-- | devtools/client/webconsole/utils/object-inspector.js | 158 |
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, +}; |