summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/src/utils/filter-predicates.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--devtools/client/netmonitor/src/utils/filter-predicates.js137
1 files changed, 137 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/src/utils/filter-predicates.js b/devtools/client/netmonitor/src/utils/filter-predicates.js
new file mode 100644
index 0000000000..63105dec0c
--- /dev/null
+++ b/devtools/client/netmonitor/src/utils/filter-predicates.js
@@ -0,0 +1,137 @@
+/* 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 {
+ isFreetextMatch,
+} = require("resource://devtools/client/netmonitor/src/utils/filter-text-utils.js");
+
+/**
+ * Predicates used when filtering items.
+ *
+ * @param object item
+ * The filtered item.
+ * @return boolean
+ * True if the item should be visible, false otherwise.
+ */
+function all() {
+ return true;
+}
+
+function isHtml({ mimeType }) {
+ return (
+ mimeType && (mimeType.includes("/html") || mimeType.includes("/xhtml+xml"))
+ );
+}
+
+function isCss({ mimeType }) {
+ return mimeType && mimeType.includes("/css");
+}
+
+function isJs({ mimeType }) {
+ return (
+ mimeType &&
+ (mimeType.includes("/ecmascript") ||
+ mimeType.includes("/javascript") ||
+ mimeType.includes("/x-javascript"))
+ );
+}
+
+function isXHR(item) {
+ // Show the request it is XHR, except if the request is a WS upgrade
+ return item.isXHR && !isWS(item);
+}
+
+function isFont({ url, mimeType }) {
+ // Fonts are a mess.
+ return (
+ (mimeType && (mimeType.includes("font/") || mimeType.includes("/font"))) ||
+ url.includes(".eot") ||
+ url.includes(".ttf") ||
+ url.includes(".otf") ||
+ url.includes(".woff")
+ );
+}
+
+function isImage({ mimeType, cause }) {
+ // We check cause.type so anything loaded via "img", "imageset", "lazy-img", etc. is in the right category
+ // When mimeType is not set to "image/", we still "detect" the image with cause.type (Bug-1654257)
+ return (
+ mimeType?.includes("image/") ||
+ cause?.type.includes("img") ||
+ cause?.type.includes("image")
+ );
+}
+
+function isMedia({ mimeType }) {
+ // Not including images.
+ return (
+ mimeType &&
+ (mimeType.includes("audio/") ||
+ mimeType.includes("video/") ||
+ mimeType.includes("model/") ||
+ mimeType === "application/vnd.apple.mpegurl" ||
+ mimeType === "application/x-mpegurl" ||
+ mimeType === "application/ogg")
+ );
+}
+
+function isWS({ requestHeaders, responseHeaders, cause }) {
+ // For the first call, the requestHeaders is not ready(empty),
+ // so checking for cause.type instead (Bug-1454962)
+ if (typeof cause.type === "string" && cause.type === "websocket") {
+ return true;
+ }
+ // Detect a websocket upgrade if request has an Upgrade header with value 'websocket'
+ if (!requestHeaders || !Array.isArray(requestHeaders.headers)) {
+ return false;
+ }
+
+ // Find the 'upgrade' header.
+ let upgradeHeader = requestHeaders.headers.find(header => {
+ return header.name.toLowerCase() == "upgrade";
+ });
+
+ // If no header found on request, check response - mainly to get
+ // something we can unit test, as it is impossible to set
+ // the Upgrade header on outgoing XHR as per the spec.
+ if (
+ !upgradeHeader &&
+ responseHeaders &&
+ Array.isArray(responseHeaders.headers)
+ ) {
+ upgradeHeader = responseHeaders.headers.find(header => {
+ return header.name.toLowerCase() == "upgrade";
+ });
+ }
+
+ // Return false if there is no such header or if its value isn't 'websocket'.
+ if (!upgradeHeader || upgradeHeader.value != "websocket") {
+ return false;
+ }
+
+ return true;
+}
+
+function isOther(item) {
+ const tests = [isHtml, isCss, isJs, isXHR, isFont, isImage, isMedia, isWS];
+ return tests.every(is => !is(item));
+}
+
+module.exports = {
+ Filters: {
+ all,
+ html: isHtml,
+ css: isCss,
+ js: isJs,
+ xhr: isXHR,
+ fonts: isFont,
+ images: isImage,
+ media: isMedia,
+ ws: isWS,
+ other: isOther,
+ },
+ isFreetextMatch,
+};