diff --git a/front_end/common/ResourceType.js b/front_end/common/ResourceType.js index 3fa8f7ca97..ec4adbf209 100644 --- a/front_end/common/ResourceType.js +++ b/front_end/common/ResourceType.js @@ -251,7 +251,7 @@ export const resourceCategories = { Document: new ResourceCategory(ls`Documents`, ls`Doc`), WebSocket: new ResourceCategory(ls`WebSockets`, ls`WS`), Manifest: new ResourceCategory(ls`Manifest`, ls`Manifest`), - Other: new ResourceCategory(ls`Other`, ls`Other`) + Other: new ResourceCategory(ls`Other`, ls`Other`), }; /** @@ -259,22 +259,24 @@ export const resourceCategories = { * @enum {!ResourceType} */ export const resourceTypes = { - XHR: new ResourceType('xhr', ls`XHR`, resourceCategories.XHR, true), - Fetch: new ResourceType('fetch', ls`Fetch`, resourceCategories.XHR, true), - EventSource: new ResourceType('eventsource', ls`EventSource`, resourceCategories.XHR, true), - Script: new ResourceType('script', ls`Script`, resourceCategories.Script, true), + Document: new ResourceType('document', ls`Document`, resourceCategories.Document, true), Stylesheet: new ResourceType('stylesheet', ls`Stylesheet`, resourceCategories.Stylesheet, true), Image: new ResourceType('image', ls`Image`, resourceCategories.Image, false), Media: new ResourceType('media', ls`Media`, resourceCategories.Media, false), Font: new ResourceType('font', ls`Font`, resourceCategories.Font, false), - Document: new ResourceType('document', ls`Document`, resourceCategories.Document, true), + Script: new ResourceType('script', ls`Script`, resourceCategories.Script, true), TextTrack: new ResourceType('texttrack', ls`TextTrack`, resourceCategories.Other, true), + XHR: new ResourceType('xhr', ls`XHR`, resourceCategories.XHR, true), + Fetch: new ResourceType('fetch', ls`Fetch`, resourceCategories.XHR, true), + EventSource: new ResourceType('eventsource', ls`EventSource`, resourceCategories.XHR, true), WebSocket: new ResourceType('websocket', ls`WebSocket`, resourceCategories.WebSocket, false), + Manifest: new ResourceType('manifest', ls`Manifest`, resourceCategories.Manifest, true), + SignedExchange: new ResourceType('signed-exchange', ls`SignedExchange`, resourceCategories.Other, false), + Ping: new ResourceType('ping', ls`Ping`, resourceCategories.Other, false), + CSPViolationReport: new ResourceType('csp-violation-report', ls`CSPViolationReport`, resourceCategories.Other, false), Other: new ResourceType('other', ls`Other`, resourceCategories.Other, false), SourceMapScript: new ResourceType('sm-script', ls`Script`, resourceCategories.Script, true), SourceMapStyleSheet: new ResourceType('sm-stylesheet', ls`Stylesheet`, resourceCategories.Stylesheet, true), - Manifest: new ResourceType('manifest', ls`Manifest`, resourceCategories.Manifest, true), - SignedExchange: new ResourceType('signed-exchange', ls`SignedExchange`, resourceCategories.Other, false) }; diff --git a/front_end/common/common_strings.grdp b/front_end/common/common_strings.grdp index 8a789daf4b..ca3745566b 100644 --- a/front_end/common/common_strings.grdp +++ b/front_end/common/common_strings.grdp @@ -39,6 +39,9 @@ Scripts + + Ping + SignedExchange @@ -48,6 +51,9 @@ Stylesheet + + CSPViolationReport + Images diff --git a/front_end/har_importer/HARImporter.js b/front_end/har_importer/HARImporter.js index 43842d6076..5679bdb752 100644 --- a/front_end/har_importer/HARImporter.js +++ b/front_end/har_importer/HARImporter.js @@ -85,7 +85,7 @@ export class Importer { // Response data. if (entry.response.content.mimeType && entry.response.content.mimeType !== 'x-unknown') { - request.mimeType = entry.response.content.mimeType; + request.mimeType = /** @type {!SDK.NetworkRequest.MIME_TYPE} */ (entry.response.content.mimeType); } request.responseHeaders = entry.response.headers; request.statusCode = entry.response.status; diff --git a/front_end/resources/ServiceWorkerCacheViews.js b/front_end/resources/ServiceWorkerCacheViews.js index 0bbe56482c..b34509afb4 100644 --- a/front_end/resources/ServiceWorkerCacheViews.js +++ b/front_end/resources/ServiceWorkerCacheViews.js @@ -337,8 +337,8 @@ export class ServiceWorkerCacheView extends UI.View.SimpleView { request.endTime = entry.responseTime; let header = entry.responseHeaders.find(header => header.name.toLowerCase() === 'content-type'); - const contentType = header ? header.value : 'text/plain'; - request.mimeType = contentType; + const contentType = header ? header.value : SDK.NetworkRequest.MIME_TYPE.PLAIN; + request.mimeType = /** @type {!SDK.NetworkRequest.MIME_TYPE} */ (contentType); header = entry.responseHeaders.find(header => header.name.toLowerCase() === 'content-length'); request.resourceSize = (header && header.value) | 0; diff --git a/front_end/sdk/NetworkManager.js b/front_end/sdk/NetworkManager.js index 3e382fdd3c..37ae75e823 100644 --- a/front_end/sdk/NetworkManager.js +++ b/front_end/sdk/NetworkManager.js @@ -38,12 +38,21 @@ import * as ProtocolClient from '../protocol_client/protocol_client.js'; import * as TextUtils from '../text_utils/text_utils.js'; // eslint-disable-line no-unused-vars import {Cookie} from './Cookie.js'; -import {ContentData, Events as NetworkRequestEvents, ExtraRequestInfo, ExtraResponseInfo, NameValue, NetworkRequest} from './NetworkRequest.js'; // eslint-disable-line no-unused-vars +import {ContentData, Events as NetworkRequestEvents, ExtraRequestInfo, ExtraResponseInfo, MIME_TYPE, MIME_TYPE_TO_RESOURCE_TYPE, NameValue, NetworkRequest} from './NetworkRequest.js'; // eslint-disable-line no-unused-vars import {Capability, SDKModel, SDKModelObserver, Target, TargetManager} from './SDKModel.js'; // eslint-disable-line no-unused-vars /** @type {!WeakMap} */ const requestToManagerMap = new WeakMap(); +const CONNECTION_TYPES = new Map([ + ['2g', Protocol.Network.ConnectionType.Cellular2g], + ['3g', Protocol.Network.ConnectionType.Cellular3g], + ['4g', Protocol.Network.ConnectionType.Cellular4g], + ['bluetooth', Protocol.Network.ConnectionType.Bluetooth], + ['wifi', Protocol.Network.ConnectionType.Wifi], + ['wimax', Protocol.Network.ConnectionType.Wimax], +]); + /** * @unrestricted */ @@ -165,30 +174,21 @@ export class NetworkManager extends SDKModel { if (!conditions.download && !conditions.upload) { return Protocol.Network.ConnectionType.None; } - let types = NetworkManager._connectionTypes; - if (!types) { - NetworkManager._connectionTypes = []; - types = NetworkManager._connectionTypes; - types.push(['2g', Protocol.Network.ConnectionType.Cellular2g]); - types.push(['3g', Protocol.Network.ConnectionType.Cellular3g]); - types.push(['4g', Protocol.Network.ConnectionType.Cellular4g]); - types.push(['bluetooth', Protocol.Network.ConnectionType.Bluetooth]); - types.push(['wifi', Protocol.Network.ConnectionType.Wifi]); - types.push(['wimax', Protocol.Network.ConnectionType.Wimax]); - } - for (const type of types) { - if (conditions.title.toLowerCase().indexOf(type[0]) !== -1) { - return type[1]; + const title = conditions.title.toLowerCase(); + for (const [name, protocolType] of CONNECTION_TYPES) { + if (title.includes(name)) { + return protocolType; } } return Protocol.Network.ConnectionType.Other; } /** - * @param {!Object} headers + * @param {!Object} headers * @return {!Object} */ static lowercaseHeaders(headers) { + /** @type {!Object} */ const newHeaders = {}; for (const headerName in headers) { newHeaders[headerName.toLowerCase()] = headers[headerName]; @@ -209,7 +209,7 @@ export class NetworkManager extends SDKModel { */ _cacheDisabledSettingChanged(event) { const enabled = /** @type {boolean} */ (event.data); - this._networkAgent.setCacheDisabled(enabled); + this._networkAgent.invoke_setCacheDisabled({cacheDisabled: enabled}); } /** @@ -222,7 +222,7 @@ export class NetworkManager extends SDKModel { } _bypassServiceWorkerChanged() { - this._networkAgent.setBypassServiceWorker(this._bypassServiceWorkerSetting.get()); + this._networkAgent.invoke_setBypassServiceWorker({bypass: this._bypassServiceWorkerSetting.get()}); } } @@ -238,18 +238,6 @@ export const Events = { LoadingFinished: Symbol('LoadingFinished'), }; -const _MIMETypes = { - 'text/html': {'document': true}, - 'text/xml': {'document': true}, - 'text/plain': {'document': true}, - 'application/xhtml+xml': {'document': true}, - 'image/svg+xml': {'document': true}, - 'text/css': {'stylesheet': true}, - 'text/xsl': {'stylesheet': true}, - 'text/vtt': {'texttrack': true}, - 'application/pdf': {'document': true}, -}; - /** @type {!Conditions} */ export const NoThrottlingConditions = { title: Common.UIString.UIString('Online'), @@ -332,13 +320,13 @@ export class NetworkDispatcher { /** * @param {!NetworkRequest} networkRequest - * @param {!Protocol.Network.Response=} response + * @param {!Protocol.Network.Response} response */ _updateNetworkRequestWithResponse(networkRequest, response) { if (response.url && networkRequest.url() !== response.url) { networkRequest.setUrl(response.url); } - networkRequest.mimeType = response.mimeType; + networkRequest.mimeType = /** @type {!MIME_TYPE} */ (response.mimeType); networkRequest.statusCode = response.status; networkRequest.statusText = response.statusText; if (!networkRequest.hasExtraResponseInfo()) { @@ -421,8 +409,8 @@ export class NetworkDispatcher { return true; } // Might be not known for cached resources with null responses. - if (networkRequest.mimeType in _MIMETypes) { - return resourceType.name() in _MIMETypes[networkRequest.mimeType]; + if (MIME_TYPE_TO_RESOURCE_TYPE.has(networkRequest.mimeType)) { + return resourceType.name() in MIME_TYPE_TO_RESOURCE_TYPE.get(networkRequest.mimeType); } return false; @@ -515,7 +503,7 @@ export class NetworkDispatcher { this._updateNetworkRequestWithRequest(networkRequest, request); networkRequest.setIssueTime(time, wallTime); networkRequest.setResourceType( - resourceType ? Common.ResourceType.resourceTypes[resourceType] : Protocol.Network.ResourceType.Other); + resourceType ? Common.ResourceType.resourceTypes[resourceType] : Common.ResourceType.resourceTypes.Other); this._getExtraInfoBuilder(requestId).addRequest(networkRequest); diff --git a/front_end/sdk/NetworkRequest.js b/front_end/sdk/NetworkRequest.js index 256609a132..648750292e 100644 --- a/front_end/sdk/NetworkRequest.js +++ b/front_end/sdk/NetworkRequest.js @@ -41,6 +41,32 @@ import {NetworkManager} from './NetworkManager.js'; import {Type} from './SDKModel.js'; import {ServerTiming} from './ServerTiming.js'; +/** @enum {string} */ +export const MIME_TYPE = { + HTML: 'text/html', + XML: 'text/xml', + PLAIN: 'text/plain', + XHTML: 'application/xhtml+xml', + SVG: 'image/svg+xml', + CSS: 'text/css', + XSL: 'text/xsl', + VTT: 'text/vtt', + PDF: 'application/pdf', +}; + +/** @type {!Map} */ +export const MIME_TYPE_TO_RESOURCE_TYPE = new Map([ + [MIME_TYPE.HTML, {'document': true}], + [MIME_TYPE.XML, {'document': true}], + [MIME_TYPE.PLAIN, {'document': true}], + [MIME_TYPE.XHTML, {'document': true}], + [MIME_TYPE.SVG, {'document': true}], + [MIME_TYPE.CSS, {'stylesheet': true}], + [MIME_TYPE.XSL, {'stylesheet': true}], + [MIME_TYPE.VTT, {'texttrack': true}], + [MIME_TYPE.PDF, {'document': true}], +]); + /** * @implements {TextUtils.ContentProvider.ContentProvider} * @unrestricted @@ -122,6 +148,10 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper { /** @type {string} */ this.connectionId = '0'; + /** @type {boolean} */ + this.connectionReused = false; + /** @type {boolean} */ + this.hasNetworkData = false; /** @type {?Promise>} */ this._formParametersPromise = null; // Assume no body initially @@ -570,14 +600,14 @@ export class NetworkRequest extends Common.ObjectWrapper.ObjectWrapper { } /** - * @return {string} + * @return {!MIME_TYPE} */ get mimeType() { return this._mimeType; } /** - * @param {string} x + * @param {!MIME_TYPE} x */ set mimeType(x) { this._mimeType = x; diff --git a/test/unittests/front_end/common/ResourceType_test.ts b/test/unittests/front_end/common/ResourceType_test.ts index a21041fc91..8f0bb0e11d 100644 --- a/test/unittests/front_end/common/ResourceType_test.ts +++ b/test/unittests/front_end/common/ResourceType_test.ts @@ -4,7 +4,7 @@ const {assert} = chai; -import {ResourceType, ResourceCategory} from '../../../../front_end/common/ResourceType.js'; +import {ResourceType, ResourceCategory, resourceTypes} from '../../../../front_end/common/ResourceType.js'; describe('ResourceCategory class', () => { it('is able to be instantiated successfully', () => { @@ -322,4 +322,16 @@ describe('ResourceType class', () => { const resourceType = new ResourceType('Type Test Name', 'Type Test Title', testResourceCategory, true); assert.strictEqual(resourceType.canonicalMimeType(), '', 'the canonical mime type was not returned correctly'); }); + + it('treats a Ping as Other', () => { + const resourceType = resourceTypes.Ping; + assert.strictEqual(resourceType.isTextType(), false, 'A ping is not a text type'); + assert.strictEqual(resourceType.canonicalMimeType(), '', 'A ping does not have an associated mime type'); + }); + + it('treats a CSPViolationsReport as Other', () => { + const resourceType = resourceTypes.CSPViolationReport; + assert.strictEqual(resourceType.isTextType(), false, 'A ping is not a text type'); + assert.strictEqual(resourceType.canonicalMimeType(), '', 'A ping does not have an associated mime type'); + }); });