summaryrefslogtreecommitdiffstats
path: root/devtools/client/webconsole/components/Output/MessageContainer.js
blob: f1140e80c37ea4435e2fa72d81c1ac88202d44a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* 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";

// React & Redux
const {
  Component,
} = require("resource://devtools/client/shared/vendor/react.js");
loader.lazyRequireGetter(
  this,
  "PropTypes",
  "resource://devtools/client/shared/vendor/react-prop-types.js"
);
loader.lazyRequireGetter(
  this,
  "isWarningGroup",
  "resource://devtools/client/webconsole/utils/messages.js",
  true
);

const {
  MESSAGE_SOURCE,
  MESSAGE_TYPE,
} = require("resource://devtools/client/webconsole/constants.js");

const ConsoleApiCall = require("resource://devtools/client/webconsole/components/Output/message-types/ConsoleApiCall.js");
const ConsoleCommand = require("resource://devtools/client/webconsole/components/Output/message-types/ConsoleCommand.js");
const CSSWarning = require("resource://devtools/client/webconsole/components/Output/message-types/CSSWarning.js");
const DefaultRenderer = require("resource://devtools/client/webconsole/components/Output/message-types/DefaultRenderer.js");
const EvaluationResult = require("resource://devtools/client/webconsole/components/Output/message-types/EvaluationResult.js");
const NavigationMarker = require("resource://devtools/client/webconsole/components/Output/message-types/NavigationMarker.js");
const NetworkEventMessage = require("resource://devtools/client/webconsole/components/Output/message-types/NetworkEventMessage.js");
const PageError = require("resource://devtools/client/webconsole/components/Output/message-types/PageError.js");
const SimpleTable = require("resource://devtools/client/webconsole/components/Output/message-types/SimpleTable.js");
const JSTracerTrace = require("resource://devtools/client/webconsole/components/Output/message-types/JSTracerTrace.js");
const WarningGroup = require("resource://devtools/client/webconsole/components/Output/message-types/WarningGroup.js");

class MessageContainer extends Component {
  static get propTypes() {
    return {
      messageId: PropTypes.string.isRequired,
      open: PropTypes.bool.isRequired,
      serviceContainer: PropTypes.object.isRequired,
      cssMatchingElements: PropTypes.object,
      timestampsVisible: PropTypes.bool.isRequired,
      repeat: PropTypes.number,
      badge: PropTypes.number,
      indent: PropTypes.number,
      networkMessageUpdate: PropTypes.object,
      getMessage: PropTypes.func.isRequired,
      inWarningGroup: PropTypes.bool,
      disabled: PropTypes.bool,
    };
  }

  shouldComponentUpdate(nextProps) {
    const triggeringUpdateProps = [
      "repeat",
      "open",
      "cssMatchingElements",
      "timestampsVisible",
      "networkMessageUpdate",
      "badge",
      "inWarningGroup",
      "disabled",
    ];

    return triggeringUpdateProps.some(
      prop => this.props[prop] !== nextProps[prop]
    );
  }

  render() {
    const message = this.props.getMessage();

    const MessageComponent = getMessageComponent(message);
    return MessageComponent(Object.assign({ message }, this.props));
  }
}

function getMessageComponent(message) {
  if (!message) {
    return DefaultRenderer;
  }

  switch (message.source) {
    case MESSAGE_SOURCE.CONSOLE_API:
      return ConsoleApiCall;
    case MESSAGE_SOURCE.JSTRACER:
      return JSTracerTrace;
    case MESSAGE_SOURCE.NETWORK:
      return NetworkEventMessage;
    case MESSAGE_SOURCE.CSS:
      return CSSWarning;
    case MESSAGE_SOURCE.JAVASCRIPT:
      switch (message.type) {
        case MESSAGE_TYPE.COMMAND:
          return ConsoleCommand;
        case MESSAGE_TYPE.RESULT:
          return EvaluationResult;
        // @TODO this is probably not the right behavior, but works for now.
        // Chrome doesn't distinguish between page errors and log messages. We
        // may want to remove the PageError component and just handle errors
        // with ConsoleApiCall.
        case MESSAGE_TYPE.LOG:
          return PageError;
        default:
          return DefaultRenderer;
      }
    case MESSAGE_SOURCE.CONSOLE_FRONTEND:
      if (isWarningGroup(message)) {
        return WarningGroup;
      }
      if (message.type === MESSAGE_TYPE.SIMPLE_TABLE) {
        return SimpleTable;
      }
      if (message.type === MESSAGE_TYPE.NAVIGATION_MARKER) {
        return NavigationMarker;
      }
      break;
  }

  return DefaultRenderer;
}

module.exports.MessageContainer = MessageContainer;

// Exported so we can test it with unit tests.
module.exports.getMessageComponent = getMessageComponent;