tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 };