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;