deleted file mode 100644
--- a/devtools/client/netmonitor/shared/components/headers-mdn.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/* 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/. */
-
-/**
- * A mapping of header names to external documentation. Any header included
- * here will show a "Learn More" link alongside it.
- */
-
-"use strict";
-
-var URL_DOMAIN = "https://developer.mozilla.org";
-const URL_PATH = "/en-US/docs/Web/HTTP/Headers/";
-const URL_PARAMS =
- "?utm_source=mozilla&utm_medium=devtools-netmonitor&utm_campaign=default";
-
-var SUPPORTED_HEADERS = [
- "Accept",
- "Accept-Charset",
- "Accept-Encoding",
- "Accept-Language",
- "Accept-Ranges",
- "Access-Control-Allow-Credentials",
- "Access-Control-Allow-Headers",
- "Access-Control-Allow-Methods",
- "Access-Control-Allow-Origin",
- "Access-Control-Expose-Headers",
- "Access-Control-Max-Age",
- "Access-Control-Request-Headers",
- "Access-Control-Request-Method",
- "Age",
- "Cache-Control",
- "Connection",
- "Content-Disposition",
- "Content-Encoding",
- "Content-Language",
- "Content-Length",
- "Content-Location",
- "Content-Security-Policy",
- "Content-Security-Policy-Report-Only",
- "Content-Type",
- "Cookie",
- "Cookie2",
- "DNT",
- "Date",
- "ETag",
- "Expires",
- "From",
- "Host",
- "If-Match",
- "If-Modified-Since",
- "If-None-Match",
- "If-Range",
- "If-Unmodified-Since",
- "Keep-Alive",
- "Last-Modified",
- "Location",
- "Origin",
- "Pragma",
- "Public-Key-Pins",
- "Public-Key-Pins-Report-Only",
- "Referer",
- "Referrer-Policy",
- "Retry-After",
- "Server",
- "Set-Cookie",
- "Set-Cookie2",
- "Strict-Transport-Security",
- "TE",
- "Tk",
- "Trailer",
- "Transfer-Encoding",
- "Upgrade-Insecure-Requests",
- "User-Agent",
- "Vary",
- "Via",
- "Warning",
- "X-Content-Type-Options",
- "X-DNS-Prefetch-Control",
- "X-Frame-Options",
- "X-XSS-Protection"
-];
-
-/**
- * Get the MDN URL for the specified header
- *
- * @param {string} Name of the header
- * The baseURL to use.
- *
- * @return {string}
- * The MDN URL for the header, or null if not available.
- */
-exports.getURL = (header) => {
- const lowerCaseHeader = header.toLowerCase();
-
- let matchingHeader = SUPPORTED_HEADERS.find(supportedHeader => {
- return lowerCaseHeader === supportedHeader.toLowerCase();
- });
-
- if (!matchingHeader) {
- return null;
- }
-
- return URL_DOMAIN + URL_PATH + matchingHeader + URL_PARAMS;
-};
-
-/**
- * Use a different domain for the URLs. Used only for testing.
- *
- * @param {string} domain
- * The domain to use.
- */
-exports.setDomain = (domain) => {
- URL_DOMAIN = domain;
-};
-
-/**
- * Use a different list of supported headers. Used only for testing.
- *
- * @param {array} headers
- * The supported headers to use.
- */
-exports.setSupportedHeaders = (headers) => {
- SUPPORTED_HEADERS = headers;
-};
--- a/devtools/client/netmonitor/shared/components/headers-panel.js
+++ b/devtools/client/netmonitor/shared/components/headers-panel.js
@@ -7,27 +7,27 @@
const {
createClass,
createFactory,
DOM,
PropTypes,
} = require("devtools/client/shared/vendor/react");
const { L10N } = require("../../l10n");
const { writeHeaderText } = require("../../request-utils");
+const { getHeadersURL } = require("../../utils/mdn-utils");
const { getFormattedSize } = require("../../utils/format-utils");
-const Services = require("Services");
-const { gDevTools } = require("devtools/client/framework/devtools");
-const HeadersMDN = require("devtools/client/netmonitor/shared/components/headers-mdn");
const { REPS, MODE } = require("devtools/client/shared/components/reps/load-reps");
const Rep = createFactory(REPS.Rep);
// Components
+const MDNLink = createFactory(require("./mdn-link"));
const PropertiesView = createFactory(require("./properties-view"));
-const { a, button, div, input, textarea } = DOM;
+const { button, div, input, textarea } = DOM;
+
const EDIT_AND_RESEND = L10N.getStr("netmonitor.summary.editAndResend");
const RAW_HEADERS = L10N.getStr("netmonitor.summary.rawHeaders");
const RAW_HEADERS_REQUEST = L10N.getStr("netmonitor.summary.rawHeaders.requestHeaders");
const RAW_HEADERS_RESPONSE = L10N.getStr("netmonitor.summary.rawHeaders.responseHeaders");
const HEADERS_EMPTY_TEXT = L10N.getStr("headersEmptyText");
const HEADERS_FILTER_TEXT = L10N.getStr("headersFilterText");
const REQUEST_HEADERS = L10N.getStr("requestHeaders");
const REQUEST_HEADERS_FROM_UPLOAD = L10N.getStr("requestHeadersFromUpload");
@@ -86,16 +86,42 @@ const HeadersPanel = createClass({
className: "tabpanel-summary-value textbox-input devtools-monospace",
readOnly: true,
value,
}),
)
);
},
+ renderValue(props) {
+ const member = props.member;
+ const value = props.value;
+
+ if (typeof value !== "string") {
+ return null;
+ }
+
+ let headerDocURL = getHeadersURL(member.name);
+
+ return (
+ div({ className: "treeValueCellDivider" },
+ Rep(Object.assign(props, {
+ // FIXME: A workaround for the issue in StringRep
+ // Force StringRep to crop the text everytime
+ member: Object.assign({}, member, { open: false }),
+ mode: MODE.TINY,
+ cropLimit: 60,
+ })),
+ headerDocURL ? MDNLink({
+ url: headerDocURL,
+ }) : null
+ )
+ );
+ },
+
render() {
const {
cloneSelectedRequest,
request: {
fromCache,
fromServiceWorker,
httpVersion,
method,
@@ -208,54 +234,16 @@ const HeadersPanel = createClass({
summaryStatus,
summaryVersion,
summaryRawHeaders,
),
PropertiesView({
object,
filterPlaceHolder: HEADERS_FILTER_TEXT,
sectionNames: Object.keys(object),
- renderValue
+ renderValue: this.renderValue,
}),
)
);
}
});
-function onLearnMoreClick(e, headerDocURL) {
- e.stopPropagation();
- e.preventDefault();
-
- let win = Services.wm.getMostRecentWindow(gDevTools.chromeWindowType);
- win.openUILinkIn(headerDocURL, "tab");
-}
-
-function renderValue(props) {
- const { member, value } = props;
-
- if (typeof value !== "string") {
- return null;
- }
-
- let headerDocURL = HeadersMDN.getURL(member.name);
-
- return (
- div({ className: "treeValueCellDivider" },
- Rep(Object.assign(props, {
- // FIXME: A workaround for the issue in StringRep
- // Force StringRep to crop the text everytime
- member: Object.assign({}, member, { open: false }),
- mode: MODE.TINY,
- cropLimit: 60,
- })),
- headerDocURL ?
- a({
- className: "learn-more-link",
- title: headerDocURL,
- onClick: (e) => onLearnMoreClick(e, headerDocURL),
- }, `[${L10N.getStr("netmonitor.headers.learnMore")}]`)
- :
- null
- )
- );
-}
-
module.exports = HeadersPanel;
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/shared/components/mdn-link.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 Services = require("Services");
+const {
+ DOM,
+ PropTypes,
+} = require("devtools/client/shared/vendor/react");
+const { gDevTools } = require("devtools/client/framework/devtools");
+const { L10N } = require("../../l10n");
+
+const { a } = DOM;
+
+const LEARN_MORE = L10N.getStr("netmonitor.headers.learnMore");
+
+function MDNLink({ url }) {
+ return (
+ a({
+ className: "learn-more-link",
+ title: url,
+ onClick: (e) => onLearnMoreClick(e, url),
+ }, `[${LEARN_MORE}]`)
+ );
+}
+
+MDNLink.displayName = "MDNLink";
+
+MDNLink.propTypes = {
+ url: PropTypes.string.isRequired,
+};
+
+function onLearnMoreClick(e, url) {
+ e.stopPropagation();
+ e.preventDefault();
+
+ let win = Services.wm.getMostRecentWindow(gDevTools.chromeWindowType);
+ win.openUILinkIn(url, "tab");
+}
+
+module.exports = MDNLink;
--- a/devtools/client/netmonitor/shared/components/moz.build
+++ b/devtools/client/netmonitor/shared/components/moz.build
@@ -1,18 +1,18 @@
# 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/.
DevToolsModules(
'cookies-panel.js',
'custom-request-panel.js',
'editor.js',
- 'headers-mdn.js',
'headers-panel.js',
+ 'mdn-link.js',
'network-details-panel.js',
'params-panel.js',
'preview-panel.js',
'properties-view.js',
'response-panel.js',
'security-panel.js',
'tabbox-panel.js',
'timings-panel.js',
--- a/devtools/client/netmonitor/test/browser_net_header-docs.js
+++ b/devtools/client/netmonitor/test/browser_net_header-docs.js
@@ -1,14 +1,14 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
-const HeadersMDN = require("devtools/client/netmonitor/shared/components/headers-mdn");
+const { getHeadersURL } = require("devtools/client/netmonitor/utils/mdn-utils");
/**
* Tests if "Learn More" links are correctly displayed
* next to headers.
*/
add_task(function* () {
let { tab, monitor } = yield initNetMonitor(POST_DATA_URL);
info("Starting test... ");
@@ -37,17 +37,17 @@ add_task(function* () {
/*
* Tests that a "Learn More" button is only shown if
* and only if a header is documented in MDN.
*/
function testShowLearnMore(data) {
document.querySelectorAll(".properties-view .treeRow.stringRow").forEach((rowEl, index) => {
let headerName = rowEl.querySelectorAll(".treeLabelCell .treeLabel")[0].textContent;
- let headerDocURL = HeadersMDN.getURL(headerName);
+ let headerDocURL = getHeadersURL(headerName);
let learnMoreEl = rowEl.querySelectorAll(".treeValueCell .learn-more-link");
if (headerDocURL === null) {
ok(learnMoreEl.length === 0,
"undocumented header does not include a \"Learn More\" button");
} else {
ok(learnMoreEl[0].getAttribute("title") === headerDocURL,
"documented header includes a \"Learn More\" button with a link to MDN");
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/utils/mdn-utils.js
@@ -0,0 +1,95 @@
+/* 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";
+
+/**
+ * A mapping of header names to external documentation. Any header included
+ * here will show a MDN link alongside it.
+ */
+const SUPPORTED_HEADERS = [
+ "Accept",
+ "Accept-Charset",
+ "Accept-Encoding",
+ "Accept-Language",
+ "Accept-Ranges",
+ "Access-Control-Allow-Credentials",
+ "Access-Control-Allow-Headers",
+ "Access-Control-Allow-Methods",
+ "Access-Control-Allow-Origin",
+ "Access-Control-Expose-Headers",
+ "Access-Control-Max-Age",
+ "Access-Control-Request-Headers",
+ "Access-Control-Request-Method",
+ "Age",
+ "Cache-Control",
+ "Connection",
+ "Content-Disposition",
+ "Content-Encoding",
+ "Content-Language",
+ "Content-Length",
+ "Content-Location",
+ "Content-Security-Policy",
+ "Content-Security-Policy-Report-Only",
+ "Content-Type",
+ "Cookie",
+ "Cookie2",
+ "DNT",
+ "Date",
+ "ETag",
+ "Expires",
+ "From",
+ "Host",
+ "If-Match",
+ "If-Modified-Since",
+ "If-None-Match",
+ "If-Range",
+ "If-Unmodified-Since",
+ "Keep-Alive",
+ "Last-Modified",
+ "Location",
+ "Origin",
+ "Pragma",
+ "Public-Key-Pins",
+ "Public-Key-Pins-Report-Only",
+ "Referer",
+ "Referrer-Policy",
+ "Retry-After",
+ "Server",
+ "Set-Cookie",
+ "Set-Cookie2",
+ "Strict-Transport-Security",
+ "TE",
+ "Tk",
+ "Trailer",
+ "Transfer-Encoding",
+ "Upgrade-Insecure-Requests",
+ "User-Agent",
+ "Vary",
+ "Via",
+ "Warning",
+ "X-Content-Type-Options",
+ "X-DNS-Prefetch-Control",
+ "X-Frame-Options",
+ "X-XSS-Protection"
+];
+
+/**
+ * Get the MDN URL for the specified header.
+ *
+ * @param {string} header Name of the header for the baseURL to use.
+ *
+ * @return {string} The MDN URL for the header, or null if not available.
+ */
+function getHeadersURL(header) {
+ const lowerCaseHeader = header.toLowerCase();
+ let idx = SUPPORTED_HEADERS.findIndex(item =>
+ item.toLowerCase() === lowerCaseHeader);
+ return idx > -1 ?
+ `https://developer.mozilla.org/docs/Web/HTTP/Headers/${SUPPORTED_HEADERS[idx]}?utm_source=mozilla&utm_medium=devtools-netmonitor&utm_campaign=default` : null;
+}
+
+module.exports = {
+ getHeadersURL,
+};
--- a/devtools/client/netmonitor/utils/moz.build
+++ b/devtools/client/netmonitor/utils/moz.build
@@ -1,8 +1,9 @@
# vim: set filetype=python:
# 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/.
DevToolsModules(
- 'format-utils.js'
+ 'format-utils.js',
+ 'mdn-utils.js',
)