Source code

Revision control

Copy as Markdown

Other Tools

/* 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";
const {
createFactory,
Component,
} = require("resource://devtools/client/shared/vendor/react.mjs");
const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.mjs");
const {
connect,
} = require("resource://devtools/client/shared/vendor/react-redux.js");
const FluentReact = require("resource://devtools/client/shared/vendor/fluent-react.js");
const Localized = createFactory(FluentReact.Localized);
const Actions = require("resource://devtools/client/netmonitor/src/actions/index.js");
const {
getDisplayedRequestsSummary,
getDisplayedTimingMarker,
} = require("resource://devtools/client/netmonitor/src/selectors/index.js");
const {
getFormattedSize,
getFormattedTime,
} = require("resource://devtools/client/netmonitor/src/utils/format-utils.js");
const {
propertiesEqual,
} = require("resource://devtools/client/netmonitor/src/utils/request-utils.js");
const { button, div } = dom;
const UPDATED_SUMMARY_PROPS = ["count", "contentSize", "transferredSize", "ms"];
const UPDATED_TIMING_PROPS = ["DOMContentLoaded", "load"];
/**
* Status Bar component
* Displays the summary of total size and transferred size by all requests
* Also displays different timing markers
*/
class StatusBar extends Component {
static get propTypes() {
return {
connector: PropTypes.object.isRequired,
openStatistics: PropTypes.func.isRequired,
summary: PropTypes.object.isRequired,
timingMarkers: PropTypes.object.isRequired,
};
}
shouldComponentUpdate(nextProps) {
const { summary, timingMarkers } = this.props;
return (
!propertiesEqual(UPDATED_SUMMARY_PROPS, summary, nextProps.summary) ||
!propertiesEqual(
UPDATED_TIMING_PROPS,
timingMarkers,
nextProps.timingMarkers
)
);
}
render() {
const { openStatistics, summary, timingMarkers, connector } = this.props;
const { count, contentSize, transferredSize, ms } = summary;
const { DOMContentLoaded, load } = timingMarkers;
const { isBrowserToolbox } = connector.getToolbox();
return div(
{ className: "devtools-toolbar devtools-toolbar-bottom" },
!isBrowserToolbox
? Localized(
{
id: "network-menu-summary-tooltip-perf",
attrs: { title: true },
},
button({
className: "devtools-button requests-list-network-summary-button",
onClick: openStatistics,
})
)
: null,
Localized(
{
id: "network-menu-summary-tooltip-requests-count",
attrs: { title: true },
},
div(
{
className: "status-bar-label requests-list-network-summary-count",
},
Localized({
id: "network-menu-summary-requests-count",
$requestCount: count,
})
)
),
count !== 0 &&
Localized(
{
id: "network-menu-summary-tooltip-transferred",
attrs: { title: true },
},
div(
{
className:
"status-bar-label requests-list-network-summary-transfer",
},
Localized({
id: "network-menu-summary-transferred",
$formattedContentSize: getFormattedSize(contentSize),
$formattedTransferredSize: getFormattedSize(transferredSize),
})
)
),
count !== 0 &&
Localized(
{
id: "network-menu-summary-tooltip-finish",
attrs: { title: true },
},
div(
{
className:
"status-bar-label requests-list-network-summary-finish",
},
Localized({
id: "network-menu-summary-finish",
$formattedTime: getFormattedTime(ms),
})
)
),
DOMContentLoaded > -1 &&
Localized(
{
id: "network-menu-summary-tooltip-domcontentloaded",
attrs: { title: true },
},
div(
{
className: "status-bar-label dom-content-loaded",
},
`DOMContentLoaded: ${getFormattedTime(DOMContentLoaded)}`
)
),
load > -1 &&
Localized(
{
id: "network-menu-summary-tooltip-load",
attrs: { title: true },
},
div(
{
className: "status-bar-label load",
},
`load: ${getFormattedTime(load)}`
)
)
);
}
}
module.exports = connect(
state => ({
summary: getDisplayedRequestsSummary(state),
timingMarkers: {
DOMContentLoaded: getDisplayedTimingMarker(
state,
"firstDocumentDOMContentLoadedTimestamp"
),
load: getDisplayedTimingMarker(state, "firstDocumentLoadTimestamp"),
},
}),
(dispatch, props) => ({
openStatistics: () =>
dispatch(Actions.openStatistics(props.connector, true)),
})
)(StatusBar);