RequestListColumnTime.js (2811B)
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 const { 8 Component, 9 } = require("resource://devtools/client/shared/vendor/react.mjs"); 10 const dom = require("resource://devtools/client/shared/vendor/react-dom-factories.js"); 11 const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.mjs"); 12 const { 13 getFormattedTime, 14 } = require("resource://devtools/client/netmonitor/src/utils/format-utils.js"); 15 const { 16 fetchNetworkUpdatePacket, 17 getResponseTime, 18 getStartTime, 19 getEndTime, 20 } = require("resource://devtools/client/netmonitor/src/utils/request-utils.js"); 21 22 /** 23 * This component represents a column displaying selected 24 * timing value. There are following possible values this 25 * column can render: 26 * - Start Time 27 * - End Time 28 * - Response Time 29 * - Duration Time 30 * - Latency Time 31 */ 32 class RequestListColumnTime extends Component { 33 static get propTypes() { 34 return { 35 connector: PropTypes.object.isRequired, 36 firstRequestStartedMs: PropTypes.number.isRequired, 37 item: PropTypes.object.isRequired, 38 type: PropTypes.oneOf(["start", "end", "response", "duration", "latency"]) 39 .isRequired, 40 }; 41 } 42 43 componentDidMount() { 44 const { item, connector } = this.props; 45 fetchNetworkUpdatePacket(connector.requestData, item, ["eventTimings"]); 46 } 47 48 // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507 49 UNSAFE_componentWillReceiveProps(nextProps) { 50 const { item, connector } = nextProps; 51 fetchNetworkUpdatePacket(connector.requestData, item, ["eventTimings"]); 52 } 53 54 shouldComponentUpdate(nextProps) { 55 return this.getTime(this.props) !== this.getTime(nextProps); 56 } 57 58 getTime(props) { 59 const { firstRequestStartedMs, item, type } = props; 60 61 switch (type) { 62 case "start": 63 return getStartTime(item, firstRequestStartedMs); 64 case "end": 65 return getEndTime(item, firstRequestStartedMs); 66 case "response": 67 return getResponseTime(item, firstRequestStartedMs); 68 case "duration": 69 return item.totalTime; 70 case "latency": 71 return item.eventTimings ? item.eventTimings.timings.wait : undefined; 72 } 73 74 return 0; 75 } 76 77 render() { 78 const { type } = this.props; 79 const time = this.getTime(this.props); 80 const formattedTime = 81 isNaN(time) || time === undefined ? "" : getFormattedTime(time); 82 return dom.td( 83 { 84 className: 85 "requests-list-column requests-list-number-column requests-list-" + 86 type + 87 "-time", 88 title: formattedTime, 89 }, 90 formattedTime 91 ); 92 } 93 } 94 95 module.exports = RequestListColumnTime;