ExpressionResultView.js (3341B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 const { 8 createFactory, 9 PureComponent, 10 } = require("resource://devtools/client/shared/vendor/react.mjs"); 11 const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.mjs"); 12 13 const Accordion = createFactory( 14 require("resource://devtools/client/shared/components/Accordion.js") 15 ); 16 17 const Types = require("resource://devtools/client/inspector/extensions/types.js"); 18 19 const { 20 REPS: { Grip }, 21 MODE, 22 } = ChromeUtils.importESModule( 23 "resource://devtools/client/shared/components/reps/index.mjs" 24 ); 25 const { 26 ObjectInspector: ObjectInspectorClass, 27 } = require("resource://devtools/client/shared/components/object-inspector/index.js"); 28 29 loader.lazyRequireGetter( 30 this, 31 "LongStringFront", 32 "resource://devtools/client/fronts/string.js", 33 true 34 ); 35 36 loader.lazyRequireGetter( 37 this, 38 "ObjectFront", 39 "resource://devtools/client/fronts/object.js", 40 true 41 ); 42 43 const ObjectInspector = createFactory(ObjectInspectorClass); 44 45 class ObjectValueGripView extends PureComponent { 46 static get propTypes() { 47 return { 48 rootTitle: PropTypes.string, 49 expressionResult: PropTypes.oneOfType([ 50 PropTypes.string, 51 PropTypes.number, 52 PropTypes.object, 53 ]).isRequired, 54 // Helpers injected as props by extension-sidebar.js. 55 serviceContainer: PropTypes.shape(Types.serviceContainer).isRequired, 56 }; 57 } 58 59 render() { 60 const { expressionResult, serviceContainer, rootTitle } = this.props; 61 62 const isFront = 63 expressionResult instanceof ObjectFront || 64 expressionResult instanceof LongStringFront; 65 const grip = isFront ? expressionResult.getGrip() : expressionResult; 66 67 const objectInspectorProps = { 68 autoExpandDepth: 1, 69 mode: MODE.SHORT, 70 // TODO: we disable focus since it's not currently working well in ObjectInspector. 71 // Let's remove the property below when problem are fixed in OI. 72 disabledFocus: true, 73 roots: [ 74 { 75 path: expressionResult?.actorID || JSON.stringify(expressionResult), 76 contents: { value: grip, front: isFront ? expressionResult : null }, 77 }, 78 ], 79 // TODO: evaluate if there should also be a serviceContainer.openLink. 80 }; 81 82 if (expressionResult?.actorID) { 83 Object.assign(objectInspectorProps, { 84 onDOMNodeMouseOver: serviceContainer.highlightDomElement, 85 onDOMNodeMouseOut: serviceContainer.unHighlightDomElement, 86 onInspectIconClick(object, e) { 87 // Stop the event propagation so we don't trigger ObjectInspector 88 // expand/collapse. 89 e.stopPropagation(); 90 serviceContainer.openNodeInInspector(object); 91 }, 92 defaultRep: Grip, 93 }); 94 } 95 96 if (rootTitle) { 97 return Accordion({ 98 items: [ 99 { 100 component: ObjectInspector, 101 componentProps: objectInspectorProps, 102 header: rootTitle, 103 id: rootTitle.replace(/\s/g, "-"), 104 opened: true, 105 }, 106 ], 107 }); 108 } 109 110 return ObjectInspector(objectInspectorProps); 111 } 112 } 113 114 module.exports = ObjectValueGripView;