UNPKG

chrome-devtools-frontend

Version:
376 lines (319 loc) • 10.8 kB
/* * Copyright (C) 2012 Google Inc. All rights reserved. * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ import {ls} from '../platform/platform.js'; import {ParsedURL} from './ParsedURL.js'; export class ResourceType { /** * @param {string} name * @param {string} title * @param {!ResourceCategory} category * @param {boolean} isTextType */ constructor(name, title, category, isTextType) { this._name = name; this._title = title; this._category = category; this._isTextType = isTextType; } /** * @param {?string} mimeType * @return {!ResourceType} */ static fromMimeType(mimeType) { if (!mimeType) { return resourceTypes.Other; } if (mimeType.startsWith('text/html')) { return resourceTypes.Document; } if (mimeType.startsWith('text/css')) { return resourceTypes.Stylesheet; } if (mimeType.startsWith('image/')) { return resourceTypes.Image; } if (mimeType.startsWith('text/')) { return resourceTypes.Script; } if (mimeType.includes('font')) { return resourceTypes.Font; } if (mimeType.includes('script')) { return resourceTypes.Script; } if (mimeType.includes('octet')) { return resourceTypes.Other; } if (mimeType.includes('application')) { return resourceTypes.Script; } return resourceTypes.Other; } /** * @param {string} url * @return {?ResourceType} */ static fromURL(url) { return _resourceTypeByExtension.get(ParsedURL.extractExtension(url)) || null; } /** * @param {string} name * @return {?ResourceType} */ static fromName(name) { for (const resourceTypeId in resourceTypes) { const resourceType = /** @type {!Object<string, !ResourceType>} */(resourceTypes)[resourceTypeId]; if (resourceType.name() === name) { return resourceType; } } return null; } /** * @param {string} url * @return {string|undefined} */ static mimeFromURL(url) { const name = ParsedURL.extractName(url); if (_mimeTypeByName.has(name)) { return _mimeTypeByName.get(name); } const ext = ParsedURL.extractExtension(url).toLowerCase(); return _mimeTypeByExtension.get(ext); } /** * @param {string} ext * @return {string|undefined} */ static mimeFromExtension(ext) { return _mimeTypeByExtension.get(ext); } /** * @return {string} */ name() { return this._name; } /** * @return {string} */ title() { return this._title; } /** * @return {!ResourceCategory} */ category() { return this._category; } /** * @return {boolean} */ isTextType() { return this._isTextType; } /** * @return {boolean} */ isScript() { return this._name === 'script' || this._name === 'sm-script'; } /** * @return {boolean} */ hasScripts() { return this.isScript() || this.isDocument(); } /** * @return {boolean} */ isStyleSheet() { return this._name === 'stylesheet' || this._name === 'sm-stylesheet'; } /** * @return {boolean} */ isDocument() { return this._name === 'document'; } /** * @return {boolean} */ isDocumentOrScriptOrStyleSheet() { return this.isDocument() || this.isScript() || this.isStyleSheet(); } /** * @return {boolean} */ isImage() { return this._name === 'image'; } /** * @return {boolean} */ isFromSourceMap() { return this._name.startsWith('sm-'); } /** * @override * @return {string} */ toString() { return this._name; } /** * @return {string} */ canonicalMimeType() { if (this.isDocument()) { return 'text/html'; } if (this.isScript()) { return 'text/javascript'; } if (this.isStyleSheet()) { return 'text/css'; } return ''; } } export class ResourceCategory { /** * @param {string} title * @param {string} shortTitle */ constructor(title, shortTitle) { this.title = title; this.shortTitle = shortTitle; } } /** * @enum {!ResourceCategory} */ export const resourceCategories = { XHR: new ResourceCategory(ls`XHR and Fetch`, ls`XHR`), Script: new ResourceCategory(ls`Scripts`, ls`JS`), Stylesheet: new ResourceCategory(ls`Stylesheets`, ls`CSS`), Image: new ResourceCategory(ls`Images`, ls`Img`), Media: new ResourceCategory(ls`Media`, ls`Media`), Font: new ResourceCategory(ls`Fonts`, ls`Font`), 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`), }; /** * Keep these in sync with WebCore::InspectorPageAgent::resourceTypeJson * @enum {!ResourceType} */ export const resourceTypes = { 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), 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), // TODO(yoichio): Consider creating new category WT or WS/WT with WebSocket. WebTransport: new ResourceType('webtransport', ls`WebTransport`, 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), Preflight: new ResourceType('preflight', ls`Preflight`, resourceCategories.Other, true), SourceMapScript: new ResourceType('sm-script', ls`Script`, resourceCategories.Script, true), SourceMapStyleSheet: new ResourceType('sm-stylesheet', ls`Stylesheet`, resourceCategories.Stylesheet, true), }; export const _mimeTypeByName = new Map([ // CoffeeScript ['Cakefile', 'text/x-coffeescript'] ]); export const _resourceTypeByExtension = new Map([ ['js', resourceTypes.Script], ['mjs', resourceTypes.Script], ['css', resourceTypes.Stylesheet], ['xsl', resourceTypes.Stylesheet], ['jpeg', resourceTypes.Image], ['jpg', resourceTypes.Image], ['svg', resourceTypes.Image], ['gif', resourceTypes.Image], ['png', resourceTypes.Image], ['ico', resourceTypes.Image], ['tiff', resourceTypes.Image], ['tif', resourceTypes.Image], ['bmp', resourceTypes.Image], ['webp', resourceTypes.Media], ['ttf', resourceTypes.Font], ['otf', resourceTypes.Font], ['ttc', resourceTypes.Font], ['woff', resourceTypes.Font] ]); export const _mimeTypeByExtension = new Map([ // Web extensions ['js', 'text/javascript'], ['mjs', 'text/javascript'], ['css', 'text/css'], ['html', 'text/html'], ['htm', 'text/html'], ['xml', 'application/xml'], ['xsl', 'application/xml'], // HTML Embedded Scripts, ASP], JSP ['asp', 'application/x-aspx'], ['aspx', 'application/x-aspx'], ['jsp', 'application/x-jsp'], // C/C++ ['c', 'text/x-c++src'], ['cc', 'text/x-c++src'], ['cpp', 'text/x-c++src'], ['h', 'text/x-c++src'], ['m', 'text/x-c++src'], ['mm', 'text/x-c++src'], // CoffeeScript ['coffee', 'text/x-coffeescript'], // Dart ['dart', 'text/javascript'], // TypeScript ['ts', 'text/typescript'], ['tsx', 'text/typescript-jsx'], // JSON ['json', 'application/json'], ['gyp', 'application/json'], ['gypi', 'application/json'], // C# ['cs', 'text/x-csharp'], // Java ['java', 'text/x-java'], // Less ['less', 'text/x-less'], // PHP ['php', 'text/x-php'], ['phtml', 'application/x-httpd-php'], // Python ['py', 'text/x-python'], // Shell ['sh', 'text/x-sh'], // SCSS ['scss', 'text/x-scss'], // Video Text Tracks. ['vtt', 'text/vtt'], // LiveScript ['ls', 'text/x-livescript'], // Markdown ['md', 'text/markdown'], // ClojureScript ['cljs', 'text/x-clojure'], ['cljc', 'text/x-clojure'], ['cljx', 'text/x-clojure'], // Stylus ['styl', 'text/x-styl'], // JSX ['jsx', 'text/jsx'], // Image ['jpeg', 'image/jpeg'], ['jpg', 'image/jpeg'], ['svg', 'image/svg+xml'], ['gif', 'image/gif'], ['webp', 'image/webp'], ['png', 'image/png'], ['ico', 'image/ico'], ['tiff', 'image/tiff'], ['tif', 'image/tif'], ['bmp', 'image/bmp'], // Font ['ttf', 'font/opentype'], ['otf', 'font/opentype'], ['ttc', 'font/opentype'], ['woff', 'application/font-woff'] ]);