--- a/devtools/client/locales/en-US/netmonitor.properties
+++ b/devtools/client/locales/en-US/netmonitor.properties
@@ -429,16 +429,24 @@ netmonitor.toolbar.remoteip=Remote IP
# LOCALIZATION NOTE (netmonitor.toolbar.cause): This is the label displayed
# in the network table toolbar, above the "cause" column.
netmonitor.toolbar.cause=Cause
# LOCALIZATION NOTE (netmonitor.toolbar.type): This is the label displayed
# in the network table toolbar, above the "type" column.
netmonitor.toolbar.type=Type
+# LOCALIZATION NOTE (netmonitor.toolbar.cookies): This is the label displayed
+# in the network table toolbar, above the "cookies" column.
+netmonitor.toolbar.cookies=Cookies
+
+# LOCALIZATION NOTE (netmonitor.toolbar.setCookies): This is the label displayed
+# in the network table toolbar, above the "set cookies" column.
+netmonitor.toolbar.setCookies=Set Cookies
+
# LOCALIZATION NOTE (netmonitor.toolbar.transferred): This is the label displayed
# in the network table toolbar, above the "transferred" column, which is the
# compressed / encoded size.
netmonitor.toolbar.transferred=Transferred
# LOCALIZATION NOTE (netmonitor.toolbar.contentSize): This is the label displayed
# in the network table toolbar, above the "size" column, which is the
# uncompressed / decoded size.
--- a/devtools/client/netmonitor/index.js
+++ b/devtools/client/netmonitor/index.js
@@ -18,17 +18,18 @@ const { Services: { appinfo, pref }} = r
const { configureStore } = require("./src/utils/create-store");
require("./src/assets/styles/netmonitor.css");
EventEmitter.decorate(window);
pref("devtools.netmonitor.enabled", true);
pref("devtools.netmonitor.filters", "[\"all\"]");
-pref("devtools.netmonitor.hiddenColumns", "[]");
+pref("devtools.netmonitor.hiddenColumns",
+ "[\"cookies\",\"protocol\",\"remoteip\",\"setCookies\"]");
pref("devtools.netmonitor.panes-network-details-width", 550);
pref("devtools.netmonitor.panes-network-details-height", 450);
pref("devtools.netmonitor.har.defaultLogDir", "");
pref("devtools.netmonitor.har.defaultFileName", "Archive %date");
pref("devtools.netmonitor.har.jsonp", false);
pref("devtools.netmonitor.har.jsonpCallback", "");
pref("devtools.netmonitor.har.includeResponseBodies", true);
pref("devtools.netmonitor.har.compress", false);
--- a/devtools/client/netmonitor/src/assets/styles/netmonitor.css
+++ b/devtools/client/netmonitor/src/assets/styles/netmonitor.css
@@ -430,16 +430,28 @@ body,
}
/* Protocol column */
.requests-list-protocol {
width: 8%;
}
+/* Cookies column */
+
+.requests-list-cookies {
+ width: 6%;
+}
+
+/* Set Cookies column */
+
+.requests-list-set-cookies {
+ width: 8%;
+}
+
/* Domain column */
.requests-list-domain {
width: 13%;
}
.requests-list-domain.requests-list-column {
text-align: start;
--- a/devtools/client/netmonitor/src/components/moz.build
+++ b/devtools/client/netmonitor/src/components/moz.build
@@ -9,21 +9,23 @@ DevToolsModules(
'headers-panel.js',
'mdn-link.js',
'monitor-panel.js',
'network-details-panel.js',
'params-panel.js',
'properties-view.js',
'request-list-column-cause.js',
'request-list-column-content-size.js',
+ 'request-list-column-cookies.js',
'request-list-column-domain.js',
'request-list-column-file.js',
'request-list-column-method.js',
'request-list-column-protocol.js',
'request-list-column-remote-ip.js',
+ 'request-list-column-set-cookies.js',
'request-list-column-status.js',
'request-list-column-transferred-size.js',
'request-list-column-type.js',
'request-list-column-waterfall.js',
'request-list-content.js',
'request-list-empty-notice.js',
'request-list-header.js',
'request-list-item.js',
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/src/components/request-list-column-cookies.js
@@ -0,0 +1,43 @@
+/* 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 {
+ createClass,
+ DOM,
+ PropTypes,
+} = require("devtools/client/shared/vendor/react");
+
+const { div } = DOM;
+
+const RequestListColumnCookies = createClass({
+ displayName: "RequestListColumnCookies",
+
+ propTypes: {
+ item: PropTypes.object.isRequired,
+ },
+
+ shouldComponentUpdate(nextProps) {
+ let { requestCookies: currRequestCookies = { cookies: [] } } = this.props.item;
+ let { requestCookies: nextRequestCookies = { cookies: [] } } = nextProps.item;
+ currRequestCookies = currRequestCookies.cookies || currRequestCookies;
+ nextRequestCookies = nextRequestCookies.cookies || nextRequestCookies;
+ return currRequestCookies !== nextRequestCookies;
+ },
+
+ render() {
+ let { requestCookies = { cookies: [] } } = this.props.item;
+ requestCookies = requestCookies.cookies || requestCookies;
+ let requestCookiesLength = requestCookies.length > 0 ? requestCookies.length : "";
+ return (
+ div({
+ className: "requests-list-column requests-list-cookies",
+ title: requestCookiesLength
+ }, requestCookiesLength)
+ );
+ }
+});
+
+module.exports = RequestListColumnCookies;
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/src/components/request-list-column-set-cookies.js
@@ -0,0 +1,43 @@
+/* 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 {
+ createClass,
+ DOM,
+ PropTypes,
+} = require("devtools/client/shared/vendor/react");
+
+const { div } = DOM;
+
+const RequestListColumnSetCookies = createClass({
+ displayName: "RequestListColumnSetCookies",
+
+ propTypes: {
+ item: PropTypes.object.isRequired,
+ },
+
+ shouldComponentUpdate(nextProps) {
+ let { responseCookies: currResponseCookies = { cookies: [] } } = this.props.item;
+ let { responseCookies: nextResponseCookies = { cookies: [] } } = nextProps.item;
+ currResponseCookies = currResponseCookies.cookies || currResponseCookies;
+ nextResponseCookies = nextResponseCookies.cookies || nextResponseCookies;
+ return currResponseCookies !== nextResponseCookies;
+ },
+
+ render() {
+ let { responseCookies = { cookies: [] } } = this.props.item;
+ responseCookies = responseCookies.cookies || responseCookies;
+ let responseCookiesLength = responseCookies.length > 0 ? responseCookies.length : "";
+ return (
+ div({
+ className: "requests-list-column requests-list-set-cookies",
+ title: responseCookiesLength
+ }, responseCookiesLength)
+ );
+ }
+});
+
+module.exports = RequestListColumnSetCookies;
--- a/devtools/client/netmonitor/src/components/request-list-item.js
+++ b/devtools/client/netmonitor/src/components/request-list-item.js
@@ -11,21 +11,23 @@ const {
PropTypes,
} = require("devtools/client/shared/vendor/react");
const I = require("devtools/client/shared/vendor/immutable");
const { propertiesEqual } = require("../utils/request-utils");
// Components
const RequestListColumnCause = createFactory(require("./request-list-column-cause"));
const RequestListColumnContentSize = createFactory(require("./request-list-column-content-size"));
+const RequestListColumnCookies = createFactory(require("./request-list-column-cookies"));
const RequestListColumnDomain = createFactory(require("./request-list-column-domain"));
const RequestListColumnFile = createFactory(require("./request-list-column-file"));
const RequestListColumnMethod = createFactory(require("./request-list-column-method"));
const RequestListColumnProtocol = createFactory(require("./request-list-column-protocol"));
const RequestListColumnRemoteIP = createFactory(require("./request-list-column-remote-ip"));
+const RequestListColumnSetCookies = createFactory(require("./request-list-column-set-cookies"));
const RequestListColumnStatus = createFactory(require("./request-list-column-status"));
const RequestListColumnTransferredSize = createFactory(require("./request-list-column-transferred-size"));
const RequestListColumnType = createFactory(require("./request-list-column-type"));
const RequestListColumnWaterfall = createFactory(require("./request-list-column-waterfall"));
const { div } = DOM;
/**
@@ -132,16 +134,18 @@ const RequestListItem = createClass({
columns.get("status") && RequestListColumnStatus({ item }),
columns.get("method") && RequestListColumnMethod({ item }),
columns.get("file") && RequestListColumnFile({ item }),
columns.get("protocol") && RequestListColumnProtocol({ item }),
columns.get("domain") && RequestListColumnDomain({ item, onSecurityIconClick }),
columns.get("remoteip") && RequestListColumnRemoteIP({ item }),
columns.get("cause") && RequestListColumnCause({ item, onCauseBadgeClick }),
columns.get("type") && RequestListColumnType({ item }),
+ columns.get("cookies") && RequestListColumnCookies({ item }),
+ columns.get("setCookies") && RequestListColumnSetCookies({ item }),
columns.get("transferred") && RequestListColumnTransferredSize({ item }),
columns.get("contentSize") && RequestListColumnContentSize({ item }),
columns.get("waterfall") &&
RequestListColumnWaterfall({ item, firstRequestStartedMillis }),
)
);
}
});
--- a/devtools/client/netmonitor/src/constants.js
+++ b/devtools/client/netmonitor/src/constants.js
@@ -130,16 +130,25 @@ const HEADERS = [
name: "cause",
canFilter: true,
},
{
name: "type",
canFilter: false,
},
{
+ name: "cookies",
+ canFilter: false,
+ },
+ {
+ name: "setCookies",
+ boxName: "set-cookies",
+ canFilter: false,
+ },
+ {
name: "transferred",
canFilter: true,
},
{
name: "contentSize",
boxName: "size",
filterKey: "size",
canFilter: true,
--- a/devtools/client/netmonitor/src/reducers/ui.js
+++ b/devtools/client/netmonitor/src/reducers/ui.js
@@ -22,16 +22,18 @@ const Columns = I.Record({
status: true,
method: true,
file: true,
protocol: false,
domain: true,
remoteip: false,
cause: true,
type: true,
+ cookies: false,
+ setCookies: false,
transferred: true,
contentSize: true,
waterfall: true,
});
const UI = I.Record({
columns: new Columns(),
detailsPanelSelectedTab: "headers",
--- a/devtools/client/netmonitor/src/utils/sort-predicates.js
+++ b/devtools/client/netmonitor/src/utils/sort-predicates.js
@@ -72,16 +72,36 @@ function remoteip(first, second) {
function cause(first, second) {
const firstCause = first.cause.type;
const secondCause = second.cause.type;
const result = compareValues(firstCause, secondCause);
return result || waterfall(first, second);
}
+function setCookies(first, second) {
+ let { responseCookies: firstResponseCookies = { cookies: [] } } = first;
+ let { responseCookies: secondResponseCookies = { cookies: [] } } = second;
+ firstResponseCookies = firstResponseCookies.cookies || firstResponseCookies;
+ secondResponseCookies = secondResponseCookies.cookies || secondResponseCookies;
+ const result =
+ compareValues(firstResponseCookies.length, secondResponseCookies.length);
+ return result || waterfall(first, second);
+}
+
+function cookies(first, second) {
+ let { requestCookies: firstRequestCookies = { cookies: [] } } = first;
+ let { requestCookies: secondRequestCookies = { cookies: [] } } = second;
+ firstRequestCookies = firstRequestCookies.cookies || firstRequestCookies;
+ secondRequestCookies = secondRequestCookies.cookies || secondRequestCookies;
+ const result =
+ compareValues(firstRequestCookies.length, secondRequestCookies.length);
+ return result || waterfall(first, second);
+}
+
function type(first, second) {
const firstType = getAbbreviatedMimeType(first.mimeType).toLowerCase();
const secondType = getAbbreviatedMimeType(second.mimeType).toLowerCase();
const result = compareValues(firstType, secondType);
return result || waterfall(first, second);
}
function transferred(first, second) {
@@ -94,16 +114,18 @@ function contentSize(first, second) {
return result || waterfall(first, second);
}
exports.Sorters = {
status,
method,
file,
protocol,
+ cookies,
+ setCookies,
domain,
remoteip,
cause,
type,
transferred,
contentSize,
waterfall,
};
--- a/devtools/client/preferences/devtools.js
+++ b/devtools/client/preferences/devtools.js
@@ -145,17 +145,17 @@ pref("devtools.serviceWorkers.testing.en
// Enable the Network Monitor
pref("devtools.netmonitor.enabled", true);
// The default Network Monitor UI settings
pref("devtools.netmonitor.panes-network-details-width", 550);
pref("devtools.netmonitor.panes-network-details-height", 450);
pref("devtools.netmonitor.filters", "[\"all\"]");
-pref("devtools.netmonitor.hiddenColumns", "[\"remoteip\",\"protocol\"]");
+pref("devtools.netmonitor.hiddenColumns", "[\"cookies\",\"protocol\",\"remoteip\",\"setCookies\"]");
// The default Network monitor HAR export setting
pref("devtools.netmonitor.har.defaultLogDir", "");
pref("devtools.netmonitor.har.defaultFileName", "Archive %date");
pref("devtools.netmonitor.har.jsonp", false);
pref("devtools.netmonitor.har.jsonpCallback", "");
pref("devtools.netmonitor.har.includeResponseBodies", true);
pref("devtools.netmonitor.har.compress", false);