summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/src/components/request-details/CachePanel.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/netmonitor/src/components/request-details/CachePanel.js')
-rw-r--r--devtools/client/netmonitor/src/components/request-details/CachePanel.js144
1 files changed, 144 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/src/components/request-details/CachePanel.js b/devtools/client/netmonitor/src/components/request-details/CachePanel.js
new file mode 100644
index 0000000000..5f3db6c501
--- /dev/null
+++ b/devtools/client/netmonitor/src/components/request-details/CachePanel.js
@@ -0,0 +1,144 @@
+/* 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 {
+ Component,
+ createFactory,
+} = require("resource://devtools/client/shared/vendor/react.js");
+const PropTypes = require("resource://devtools/client/shared/vendor/react-prop-types.js");
+const dom = require("resource://devtools/client/shared/vendor/react-dom-factories.js");
+const {
+ L10N,
+} = require("resource://devtools/client/netmonitor/src/utils/l10n.js");
+const {
+ fetchNetworkUpdatePacket,
+} = require("resource://devtools/client/netmonitor/src/utils/request-utils.js");
+
+// Components
+const TreeViewClass = require("resource://devtools/client/shared/components/tree/TreeView.js");
+const PropertiesView = createFactory(
+ require("resource://devtools/client/netmonitor/src/components/request-details/PropertiesView.js")
+);
+
+const { div, input } = dom;
+
+const CACHE = L10N.getStr("netmonitor.cache.cache");
+const DATA_SIZE = L10N.getStr("netmonitor.cache.dataSize");
+const EXPIRES = L10N.getStr("netmonitor.cache.expires");
+const FETCH_COUNT = L10N.getStr("netmonitor.cache.fetchCount");
+const LAST_FETCHED = L10N.getStr("netmonitor.cache.lastFetched");
+const LAST_MODIFIED = L10N.getStr("netmonitor.cache.lastModified");
+const DEVICE = L10N.getStr("netmonitor.cache.device");
+const NOT_AVAILABLE = L10N.getStr("netmonitor.cache.notAvailable");
+const EMPTY = L10N.getStr("netmonitor.cache.empty");
+
+/**
+ * Cache panel component
+ * This tab lists full details of any cache information of the response.
+ */
+class CachePanel extends Component {
+ static get propTypes() {
+ return {
+ connector: PropTypes.object.isRequired,
+ openLink: PropTypes.func,
+ request: PropTypes.object.isRequired,
+ };
+ }
+
+ componentDidMount() {
+ const { connector, request } = this.props;
+ fetchNetworkUpdatePacket(connector.requestData, request, ["responseCache"]);
+ }
+
+ // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507
+ UNSAFE_componentWillReceiveProps(nextProps) {
+ const { connector, request } = nextProps;
+ fetchNetworkUpdatePacket(connector.requestData, request, ["responseCache"]);
+ }
+
+ renderSummary(label, value) {
+ return div(
+ { className: "tabpanel-summary-container cache-summary" },
+ div(
+ {
+ className: "tabpanel-summary-label cache-summary-label",
+ },
+ label + ":"
+ ),
+ input({
+ className: "tabpanel-summary-value textbox-input devtools-monospace",
+ readOnly: true,
+ value,
+ })
+ );
+ }
+
+ getProperties(responseCache) {
+ let responseCacheObj;
+ let cacheObj;
+ try {
+ responseCacheObj = Object.assign({}, responseCache);
+ responseCacheObj = responseCacheObj.cache;
+ } catch (e) {
+ return null;
+ }
+ try {
+ cacheObj = Object.assign({}, responseCacheObj);
+ } catch (e) {
+ return null;
+ }
+ return cacheObj;
+ }
+
+ getDate(timestamp) {
+ if (!timestamp) {
+ return null;
+ }
+ const d = new Date(parseInt(timestamp, 10) * 1000);
+ return d.toLocaleDateString() + " " + d.toLocaleTimeString();
+ }
+
+ render() {
+ const { request } = this.props;
+ const { responseCache } = request;
+
+ let object;
+ const cache = this.getProperties(responseCache);
+
+ if (
+ cache.lastFetched ||
+ cache.fetchCount ||
+ cache.storageDataSize ||
+ cache.lastModified ||
+ cache.expirationTime ||
+ cache.deviceID
+ ) {
+ object = {
+ [CACHE]: {
+ [LAST_FETCHED]: this.getDate(cache.lastFetched) || NOT_AVAILABLE,
+ [FETCH_COUNT]: cache.fetchCount || NOT_AVAILABLE,
+ [DATA_SIZE]: cache.storageDataSize || NOT_AVAILABLE,
+ [LAST_MODIFIED]: this.getDate(cache.lastModified) || NOT_AVAILABLE,
+ [EXPIRES]: this.getDate(cache.expirationTime) || NOT_AVAILABLE,
+ [DEVICE]: cache.deviceID || NOT_AVAILABLE,
+ },
+ };
+ } else {
+ return div({ className: "empty-notice" }, EMPTY);
+ }
+
+ return div(
+ { className: "panel-container security-panel" },
+ PropertiesView({
+ object,
+ enableFilter: false,
+ expandedNodes: TreeViewClass.getExpandedNodes(object),
+ })
+ );
+ }
+}
+
+module.exports = CachePanel;