tor-browser

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

MessageContainer.js (4628B)


      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 // React & Redux
      8 const {
      9  Component,
     10 } = require("resource://devtools/client/shared/vendor/react.mjs");
     11 loader.lazyRequireGetter(
     12  this,
     13  "PropTypes",
     14  "resource://devtools/client/shared/vendor/react-prop-types.js"
     15 );
     16 loader.lazyRequireGetter(
     17  this,
     18  "isWarningGroup",
     19  "resource://devtools/client/webconsole/utils/messages.js",
     20  true
     21 );
     22 
     23 const {
     24  MESSAGE_SOURCE,
     25  MESSAGE_TYPE,
     26 } = require("resource://devtools/client/webconsole/constants.js");
     27 
     28 const ConsoleApiCall = require("resource://devtools/client/webconsole/components/Output/message-types/ConsoleApiCall.js");
     29 const ConsoleCommand = require("resource://devtools/client/webconsole/components/Output/message-types/ConsoleCommand.js");
     30 const CSSWarning = require("resource://devtools/client/webconsole/components/Output/message-types/CSSWarning.js");
     31 const DefaultRenderer = require("resource://devtools/client/webconsole/components/Output/message-types/DefaultRenderer.js");
     32 const EvaluationResult = require("resource://devtools/client/webconsole/components/Output/message-types/EvaluationResult.js");
     33 const NavigationMarker = require("resource://devtools/client/webconsole/components/Output/message-types/NavigationMarker.js");
     34 const NetworkEventMessage = require("resource://devtools/client/webconsole/components/Output/message-types/NetworkEventMessage.js");
     35 const PageError = require("resource://devtools/client/webconsole/components/Output/message-types/PageError.js");
     36 const SimpleTable = require("resource://devtools/client/webconsole/components/Output/message-types/SimpleTable.js");
     37 const JSTracerTrace = require("resource://devtools/client/webconsole/components/Output/message-types/JSTracerTrace.js");
     38 const WarningGroup = require("resource://devtools/client/webconsole/components/Output/message-types/WarningGroup.js");
     39 
     40 class MessageContainer extends Component {
     41  static get propTypes() {
     42    return {
     43      messageId: PropTypes.string.isRequired,
     44      open: PropTypes.bool.isRequired,
     45      serviceContainer: PropTypes.object.isRequired,
     46      cssMatchingElements: PropTypes.object,
     47      timestampsVisible: PropTypes.bool.isRequired,
     48      repeat: PropTypes.number,
     49      badge: PropTypes.number,
     50      indent: PropTypes.number,
     51      networkMessageUpdate: PropTypes.object,
     52      getMessage: PropTypes.func.isRequired,
     53      inWarningGroup: PropTypes.bool,
     54      disabled: PropTypes.bool,
     55    };
     56  }
     57 
     58  shouldComponentUpdate(nextProps) {
     59    const triggeringUpdateProps = [
     60      "repeat",
     61      "open",
     62      "cssMatchingElements",
     63      "timestampsVisible",
     64      "networkMessageUpdate",
     65      "badge",
     66      "inWarningGroup",
     67      "disabled",
     68    ];
     69 
     70    return triggeringUpdateProps.some(
     71      prop => this.props[prop] !== nextProps[prop]
     72    );
     73  }
     74 
     75  render() {
     76    const message = this.props.getMessage();
     77 
     78    const MessageComponent = getMessageComponent(message);
     79    return MessageComponent(Object.assign({ message }, this.props));
     80  }
     81 }
     82 
     83 function getMessageComponent(message) {
     84  if (!message) {
     85    return DefaultRenderer;
     86  }
     87 
     88  switch (message.source) {
     89    case MESSAGE_SOURCE.CONSOLE_API:
     90      return ConsoleApiCall;
     91    case MESSAGE_SOURCE.JSTRACER:
     92      return JSTracerTrace;
     93    case MESSAGE_SOURCE.NETWORK:
     94      return NetworkEventMessage;
     95    case MESSAGE_SOURCE.CSS:
     96      return CSSWarning;
     97    case MESSAGE_SOURCE.JAVASCRIPT:
     98      switch (message.type) {
     99        case MESSAGE_TYPE.COMMAND:
    100          return ConsoleCommand;
    101        case MESSAGE_TYPE.RESULT:
    102          return EvaluationResult;
    103        // @TODO this is probably not the right behavior, but works for now.
    104        // Chrome doesn't distinguish between page errors and log messages. We
    105        // may want to remove the PageError component and just handle errors
    106        // with ConsoleApiCall.
    107        case MESSAGE_TYPE.LOG:
    108          return PageError;
    109        default:
    110          return DefaultRenderer;
    111      }
    112    case MESSAGE_SOURCE.CONSOLE_FRONTEND:
    113      if (isWarningGroup(message)) {
    114        return WarningGroup;
    115      }
    116      if (message.type === MESSAGE_TYPE.SIMPLE_TABLE) {
    117        return SimpleTable;
    118      }
    119      if (message.type === MESSAGE_TYPE.NAVIGATION_MARKER) {
    120        return NavigationMarker;
    121      }
    122      break;
    123  }
    124 
    125  return DefaultRenderer;
    126 }
    127 
    128 module.exports.MessageContainer = MessageContainer;
    129 
    130 // Exported so we can test it with unit tests.
    131 module.exports.getMessageComponent = getMessageComponent;