promise.mjs (2637B)
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 import PropTypes from "resource://devtools/client/shared/vendor/react-prop-types.mjs"; 6 import { span } from "resource://devtools/client/shared/vendor/react-dom-factories.mjs"; 7 8 import { getGripType, wrapRender } from "./rep-utils.mjs"; 9 import * as Grip from "./grip.mjs"; 10 import { MODE } from "./constants.mjs"; 11 12 /** 13 * Renders a DOM Promise object. 14 */ 15 16 PromiseRep.propTypes = { 17 object: PropTypes.object.isRequired, 18 mode: PropTypes.oneOf(Object.values(MODE)), 19 onDOMNodeMouseOver: PropTypes.func, 20 onDOMNodeMouseOut: PropTypes.func, 21 onInspectIconClick: PropTypes.func, 22 shouldRenderTooltip: PropTypes.bool, 23 }; 24 25 function PromiseRep(props) { 26 const object = props.object; 27 28 // @backward-compat { version 85 } On older servers, the preview of a promise was 29 // useless and didn't include the internal promise state, which was directly exposed 30 // in the grip. 31 if (object.promiseState) { 32 const { state, value, reason } = object.promiseState; 33 const ownProperties = Object.create(null); 34 ownProperties["<state>"] = { value: state }; 35 let ownPropertiesLength = 1; 36 if (state == "fulfilled") { 37 ownProperties["<value>"] = { value }; 38 ++ownPropertiesLength; 39 } else if (state == "rejected") { 40 ownProperties["<reason>"] = { value: reason }; 41 ++ownPropertiesLength; 42 } 43 object.preview = { 44 kind: "Object", 45 ownProperties, 46 ownPropertiesLength, 47 }; 48 } 49 50 if (props.mode !== MODE.TINY && props.mode !== MODE.HEADER) { 51 return Grip.rep(props); 52 } 53 54 const shouldRenderTooltip = props.shouldRenderTooltip; 55 const config = { 56 "data-link-actor-id": object.actor, 57 className: "objectBox objectBox-object", 58 title: shouldRenderTooltip ? "Promise" : null, 59 }; 60 61 if (props.mode === MODE.HEADER) { 62 return span(config, getTitle(object)); 63 } 64 65 return span( 66 config, 67 getTitle(object), 68 span({ className: "objectLeftBrace" }, " { "), 69 props.Rep({ object: object.preview.ownProperties["<state>"].value }), 70 span({ className: "objectRightBrace" }, " }") 71 ); 72 } 73 74 function getTitle(object) { 75 return span({ className: "objectTitle" }, object.class); 76 } 77 78 // Registration 79 function supportsObject(object, noGrip = false) { 80 if (!Grip.supportsObject(object, noGrip)) { 81 return false; 82 } 83 return getGripType(object, noGrip) == "Promise"; 84 } 85 86 const rep = wrapRender(PromiseRep); 87 88 // Exports from this module 89 export { rep, supportsObject };