diff options
Diffstat (limited to 'devtools/client/netmonitor/src/utils/filter-predicates.js')
-rw-r--r-- | devtools/client/netmonitor/src/utils/filter-predicates.js | 137 |
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, +}; |