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
"use strict";
const {
Component,
createFactory,
} = require("resource://devtools/client/shared/vendor/react.js");
const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.js");
const {
L10N,
} = require("resource://devtools/client/netmonitor/src/utils/l10n.js");
const {
PANELS,
} = require("resource://devtools/client/netmonitor/src/constants.js");
// Components
const Tabbar = createFactory(
require("resource://devtools/client/shared/components/tabs/TabBar.js")
);
const TabPanel = createFactory(
require("resource://devtools/client/shared/components/tabs/Tabs.js").TabPanel
);
const CookiesPanel = createFactory(
require("resource://devtools/client/netmonitor/src/components/request-details/CookiesPanel.js")
);
const HeadersPanel = createFactory(
require("resource://devtools/client/netmonitor/src/components/request-details/HeadersPanel.js")
);
const RequestPanel = createFactory(
require("resource://devtools/client/netmonitor/src/components/request-details/RequestPanel.js")
);
const CachePanel = createFactory(
require("resource://devtools/client/netmonitor/src/components/request-details/CachePanel.js")
);
const ResponsePanel = createFactory(
require("resource://devtools/client/netmonitor/src/components/request-details/ResponsePanel.js")
);
const SecurityPanel = createFactory(
require("resource://devtools/client/netmonitor/src/components/request-details/SecurityPanel.js")
);
const StackTracePanel = createFactory(
require("resource://devtools/client/netmonitor/src/components/request-details/StackTracePanel.js")
);
const TimingsPanel = createFactory(
require("resource://devtools/client/netmonitor/src/components/request-details/TimingsPanel.js")
);
const COLLAPSE_DETAILS_PANE = L10N.getStr("collapseDetailsPane");
const ALL_TABS_MENU_BUTTON_TOOLTIP = L10N.getStr("allTabsMenuButton.tooltip");
const CACHE_TITLE = L10N.getStr("netmonitor.tab.cache");
const COOKIES_TITLE = L10N.getStr("netmonitor.tab.cookies");
const HEADERS_TITLE = L10N.getStr("netmonitor.tab.headers");
const REQUEST_TITLE = L10N.getStr("netmonitor.tab.request");
const RESPONSE_TITLE = L10N.getStr("netmonitor.tab.response");
const SECURITY_TITLE = L10N.getStr("netmonitor.tab.security");
const STACK_TRACE_TITLE = L10N.getStr("netmonitor.tab.stackTrace");
const TIMINGS_TITLE = L10N.getStr("netmonitor.tab.timings");
/**
* Tabbox panel component
* Display the network request details
*/
class TabboxPanel extends Component {
static get propTypes() {
return {
activeTabId: PropTypes.string,
cloneSelectedRequest: PropTypes.func,
connector: PropTypes.object.isRequired,
openLink: PropTypes.func,
request: PropTypes.object,
selectTab: PropTypes.func.isRequired,
sourceMapURLService: PropTypes.object,
hideToggleButton: PropTypes.bool,
toggleNetworkDetails: PropTypes.func,
openNetworkDetails: PropTypes.func.isRequired,
showMessagesView: PropTypes.bool,
targetSearchResult: PropTypes.object,
};
}
static get defaultProps() {
return {
showMessagesView: true,
};
}
componentDidMount() {
this.closeOnEscRef = this.closeOnEsc.bind(this);
window.addEventListener("keydown", this.closeOnEscRef);
}
componentWillUnmount() {
window.removeEventListener("keydown", this.closeOnEscRef);
}
closeOnEsc(event) {
if (event.key == "Escape") {
event.preventDefault();
this.props.openNetworkDetails(false);
}
}
render() {
const {
activeTabId,
cloneSelectedRequest = () => {},
connector,
hideToggleButton,
openLink,
request,
selectTab,
sourceMapURLService,
toggleNetworkDetails,
targetSearchResult,
} = this.props;
if (!request) {
return null;
}
const isWs = request.cause.type === "websocket";
const isSse = request.isEventStream;
const showMessagesView = (isWs || isSse) && this.props.showMessagesView;
return Tabbar(
{
activeTabId,
menuDocument: window.parent.document,
onSelect: selectTab,
renderOnlySelected: true,
showAllTabsMenu: true,
allTabsMenuButtonTooltip: ALL_TABS_MENU_BUTTON_TOOLTIP,
sidebarToggleButton: hideToggleButton
? null
: {
collapsed: false,
collapsePaneTitle: COLLAPSE_DETAILS_PANE,
expandPaneTitle: "",
onClick: toggleNetworkDetails,
},
},
TabPanel(
{
id: PANELS.HEADERS,
title: HEADERS_TITLE,
className: "panel-with-code",
},
HeadersPanel({
cloneSelectedRequest,
connector,
openLink,
request,
targetSearchResult,
})
),
TabPanel(
{
id: PANELS.COOKIES,
title: COOKIES_TITLE,
className: "panel-with-code",
},
CookiesPanel({
connector,
openLink,
request,
targetSearchResult,
})
),
TabPanel(
{
id: PANELS.REQUEST,
title: REQUEST_TITLE,
className: "panel-with-code",
},
RequestPanel({
connector,
openLink,
request,
targetSearchResult,
})
),
TabPanel(
{
id: PANELS.RESPONSE,
title: RESPONSE_TITLE,
className: "panel-with-code",
},
ResponsePanel({
request,
openLink,
connector,
showMessagesView,
targetSearchResult,
})
),
(request.fromCache || request.status == "304") &&
TabPanel(
{
id: PANELS.CACHE,
title: CACHE_TITLE,
},
CachePanel({ request, openLink, connector })
),
TabPanel(
{
id: PANELS.TIMINGS,
title: TIMINGS_TITLE,
},
TimingsPanel({
connector,
request,
})
),
request.cause?.stacktraceAvailable &&
TabPanel(
{
id: PANELS.STACK_TRACE,
title: STACK_TRACE_TITLE,
className: "panel-with-code",
},
StackTracePanel({ connector, openLink, request, sourceMapURLService })
),
request.securityState &&
request.securityState !== "insecure" &&
TabPanel(
{
id: PANELS.SECURITY,
title: SECURITY_TITLE,
},
SecurityPanel({
connector,
openLink,
request,
})
)
);
}
}
module.exports = TabboxPanel;