Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/audits/AuditRules.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/audits/AuditRules.js b/third_party/WebKit/Source/devtools/front_end/audits/AuditRules.js |
| index 592c1df34a68c921ed8568b78376197a02c6bd39..d30a5583610527494838fbdff0b409a6d2b4335d 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/audits/AuditRules.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/audits/AuditRules.js |
| @@ -29,6 +29,7 @@ |
| */ |
| Audits.AuditRules.IPAddressRegexp = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; |
| +/** @type {!Object<number, boolean>} */ |
| Audits.AuditRules.CacheableResponseCodes = { |
| 200: true, |
| 203: true, |
| @@ -41,13 +42,12 @@ Audits.AuditRules.CacheableResponseCodes = { |
| }; |
| /** |
| - * @param {!Array.<!SDK.NetworkRequest>} requests |
| - * @param {?Array.<!Common.ResourceType>} types |
| - * @param {boolean} needFullResources |
| - * @return {!Object.<string, !Array.<!SDK.NetworkRequest|string>>} |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @param {?Array<!Common.ResourceType>} types |
| + * @return {!Object<string, !Array<!SDK.NetworkRequest>>} |
| */ |
| -Audits.AuditRules.getDomainToResourcesMap = function(requests, types, needFullResources) { |
| - /** @type {!Object<string, !Array<!SDK.NetworkRequest|string>>} */ |
| +Audits.AuditRules.getDomainToResourcesMap = function(requests, types) { |
| + /** @type {!Object<string, !Array<!SDK.NetworkRequest>>} */ |
| var domainToResourcesMap = {}; |
| for (var i = 0, size = requests.length; i < size; ++i) { |
| var request = requests[i]; |
| @@ -59,15 +59,29 @@ Audits.AuditRules.getDomainToResourcesMap = function(requests, types, needFullRe |
| var domain = parsedURL.host; |
| var domainResources = domainToResourcesMap[domain]; |
| if (domainResources === undefined) { |
| - domainResources = /** @type {!Array<!SDK.NetworkRequest|string>} */ ([]); |
| + domainResources = /** @type {!Array<!SDK.NetworkRequest>} */ ([]); |
| domainToResourcesMap[domain] = domainResources; |
| } |
| - domainResources.push(needFullResources ? request : request.url()); |
| + domainResources.push(request); |
| } |
| return domainToResourcesMap; |
| }; |
| /** |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @param {?Array<!Common.ResourceType>} types |
| + * @return {!Object<string, !Array<string>>} |
| + */ |
| +Audits.AuditRules.getDomainToResourceUrlMap = function(requests, types) { |
| + var requestMap = Audits.AuditRules.getDomainToResourcesMap(requests, types); |
| + /** @type {!Object<string, !Array<string>>} */ |
| + var output = {}; |
| + for (var domain of Object.keys(requestMap)) |
| + output[domain] = requestMap[domain].map(request => request.url()); |
| + return output; |
| +}; |
| + |
| +/** |
| * @unrestricted |
| */ |
| Audits.AuditRules.GzipRule = class extends Audits.AuditRule { |
| @@ -157,7 +171,7 @@ Audits.AuditRules.CombineExternalResourcesRule = class extends Audits.AuditRule |
| * @param {!Common.Progress} progress |
| */ |
| doRun(target, requests, result, callback, progress) { |
| - var domainToResourcesMap = Audits.AuditRules.getDomainToResourcesMap(requests, [this._type], false); |
| + var domainToResourcesMap = Audits.AuditRules.getDomainToResourceUrlMap(requests, [this._type]); |
| var penalizedResourceCount = 0; |
| // TODO: refactor according to the chosen i18n approach |
| var summary = result.addChild('', true); |
| @@ -224,7 +238,7 @@ Audits.AuditRules.MinimizeDnsLookupsRule = class extends Audits.AuditRule { |
| */ |
| doRun(target, requests, result, callback, progress) { |
| var summary = result.addChild(''); |
| - var domainToResourcesMap = Audits.AuditRules.getDomainToResourcesMap(requests, null, false); |
| + var domainToResourcesMap = Audits.AuditRules.getDomainToResourceUrlMap(requests, null); |
| for (var domain in domainToResourcesMap) { |
| if (domainToResourcesMap[domain].length > 1) |
| continue; |
| @@ -278,8 +292,9 @@ Audits.AuditRules.ParallelizeDownloadRule = class extends Audits.AuditRule { |
| } |
| var domainToResourcesMap = Audits.AuditRules.getDomainToResourcesMap( |
| - requests, [Common.resourceTypes.Stylesheet, Common.resourceTypes.Image], true); |
| + requests, [Common.resourceTypes.Stylesheet, Common.resourceTypes.Image]); |
| + /** @type {!Array<string>} */ |
|
pfeldman
2017/01/17 19:33:55
Let's not enforce annotating inline objects and ar
allada
2017/01/17 19:38:27
Acknowledged.
|
| var hosts = []; |
| for (var url in domainToResourcesMap) |
| hosts.push(url); |
| @@ -366,7 +381,9 @@ Audits.AuditRules.UnusedCssRule = class extends Audits.AuditRule { |
| if (!styleSheets.length) |
| return callback(null); |
| + /** @type {!Array<string>} */ |
| var selectors = []; |
| + /** @type {!Object<string, number>} */ |
| var testedSelectors = {}; |
| for (var i = 0; i < styleSheets.length; ++i) { |
| var styleSheet = styleSheets[i]; |
| @@ -379,6 +396,7 @@ Audits.AuditRules.UnusedCssRule = class extends Audits.AuditRule { |
| } |
| } |
| + /** @type {!Object<string, boolean>} */ |
| var foundSelectors = {}; |
| /** |
| @@ -397,6 +415,7 @@ Audits.AuditRules.UnusedCssRule = class extends Audits.AuditRule { |
| for (var i = 0; i < styleSheets.length; ++i) { |
| var styleSheet = styleSheets[i]; |
| + /** @type {!Array<string>} */ |
| var unusedRules = []; |
| for (var curRule = 0; curRule < styleSheet.rules.length; ++curRule) { |
| var rule = styleSheet.rules[curRule]; |
| @@ -501,6 +520,7 @@ Audits.AuditRules.StyleSheetProcessor = class { |
| constructor(styleSheetHeaders, progress, styleSheetsParsedCallback) { |
| this._styleSheetHeaders = styleSheetHeaders; |
| this._progress = progress; |
| + /** @type {!Array<!Audits.AuditRules.ParsedStyleSheet>} */ |
| this._styleSheets = []; |
| this._styleSheetsParsedCallback = styleSheetsParsedCallback; |
| } |
| @@ -516,6 +536,7 @@ Audits.AuditRules.StyleSheetProcessor = class { |
| } |
| this._currentStyleSheetHeader = this._styleSheetHeaders.shift(); |
| + /** @type {!Array<!Common.FormatterWorkerPool.CSSRule>} */ |
| var allRules = []; |
| this._currentStyleSheetHeader.requestContent().then( |
| content => Common.formatterWorkerPool.parseCSS(content || '', onRulesParsed.bind(this))); |
| @@ -541,6 +562,7 @@ Audits.AuditRules.StyleSheetProcessor = class { |
| return; |
| } |
| + /** @type {!Array<!Common.FormatterWorkerPool.CSSRule>} */ |
| var styleRules = []; |
| for (var i = 0; i < rules.length; ++i) { |
| var rule = rules[i]; |
| @@ -577,10 +599,19 @@ Audits.AuditRules.CacheControlRule = class extends Audits.AuditRule { |
| callback(result); |
| } |
| + /** |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @param {!Audits.AuditRuleResult} result |
| + */ |
| handleNonCacheableResources(requests, result) { |
| } |
| + /** |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @return {!Array<!Array<!SDK.NetworkRequest>>} |
| + */ |
| _cacheableAndNonCacheableResources(requests) { |
| + /** @type {!Array<!Array<!SDK.NetworkRequest>>} */ |
| var processedResources = [[], []]; |
| for (var i = 0; i < requests.length; ++i) { |
| var request = requests[i]; |
| @@ -594,12 +625,19 @@ Audits.AuditRules.CacheControlRule = class extends Audits.AuditRule { |
| return processedResources; |
| } |
| + /** |
| + * @param {string} messageText |
| + * @param {function(!SDK.NetworkRequest):boolean} requestCheckFunction |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @param {!Audits.AuditRuleResult} result |
| + */ |
| execCheck(messageText, requestCheckFunction, requests, result) { |
| var requestCount = requests.length; |
| + /** @type {!Array<string>} */ |
| var urls = []; |
| for (var i = 0; i < requestCount; ++i) { |
| if (requestCheckFunction.call(this, requests[i])) |
| - urls.push(requests[i].url); |
| + urls.push(requests[i].url()); |
| } |
| if (urls.length) { |
| var entry = result.addChild(messageText, true); |
| @@ -734,6 +772,8 @@ Audits.AuditRules.BrowserCacheControlRule = class extends Audits.AuditRules.Cach |
| /** |
| * @override |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @param {!Audits.AuditRuleResult} result |
| */ |
| handleNonCacheableResources(requests, result) { |
| if (requests.length) { |
| @@ -743,11 +783,15 @@ Audits.AuditRules.BrowserCacheControlRule = class extends Audits.AuditRules.Cach |
| true); |
| result.violationCount += requests.length; |
| for (var i = 0; i < requests.length; ++i) |
| - entry.addURL(requests[i].url); |
| + entry.addURL(requests[i].url()); |
| } |
| } |
| - runChecks(requests, result, callback) { |
| + /** |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @param {!Audits.AuditRuleResult} result |
| + */ |
| + runChecks(requests, result) { |
| this.execCheck( |
| Common.UIString( |
| 'The following resources are missing a cache expiration. Resources that do not specify an expiration may not be cached by browsers:'), |
| @@ -767,11 +811,19 @@ Audits.AuditRules.BrowserCacheControlRule = class extends Audits.AuditRules.Cach |
| this._oneYearExpirationCheck, requests, result); |
| } |
| + /** |
| + * @param {!SDK.NetworkRequest} request |
| + * @return {boolean} |
| + */ |
| _missingExpirationCheck(request) { |
| return this.isCacheableResource(request) && !this.hasResponseHeader(request, 'Set-Cookie') && |
| !this.hasExplicitExpiration(request); |
| } |
| + /** |
| + * @param {!SDK.NetworkRequest} request |
| + * @return {boolean} |
| + */ |
| _varyCheck(request) { |
| var varyHeader = this.responseHeader(request, 'Vary'); |
| if (varyHeader) { |
| @@ -779,16 +831,25 @@ Audits.AuditRules.BrowserCacheControlRule = class extends Audits.AuditRules.Cach |
| varyHeader = varyHeader.replace(/Accept-Encoding/gi, ''); |
| varyHeader = varyHeader.replace(/[, ]*/g, ''); |
| } |
| - return varyHeader && varyHeader.length && this.isCacheableResource(request) && |
| - this.freshnessLifetimeGreaterThan(request, 0); |
| + return !!( |
| + varyHeader && varyHeader.length && this.isCacheableResource(request) && |
| + this.freshnessLifetimeGreaterThan(request, 0)); |
| } |
| + /** |
| + * @param {!SDK.NetworkRequest} request |
| + * @return {boolean} |
| + */ |
| _oneMonthExpirationCheck(request) { |
| return this.isCacheableResource(request) && !this.hasResponseHeader(request, 'Set-Cookie') && |
| !this.freshnessLifetimeGreaterThan(request, Audits.AuditRules.CacheControlRule.MillisPerMonth) && |
| this.freshnessLifetimeGreaterThan(request, 0); |
| } |
| + /** |
| + * @param {!SDK.NetworkRequest} request |
| + * @return {boolean} |
| + */ |
| _oneYearExpirationCheck(request) { |
| return this.isCacheableResource(request) && !this.hasResponseHeader(request, 'Set-Cookie') && |
| !this.freshnessLifetimeGreaterThan(request, 11 * Audits.AuditRules.CacheControlRule.MillisPerMonth) && |
| @@ -820,6 +881,7 @@ Audits.AuditRules.ImageDimensionsRule = class extends Audits.AuditRule { |
| return; |
| } |
| + /** @type {!Object<string, number>} */ |
| var urlToNoDimensionCount = {}; |
| function doneCallback() { |
| @@ -838,6 +900,10 @@ Audits.AuditRules.ImageDimensionsRule = class extends Audits.AuditRule { |
| callback(entry ? result : null); |
| } |
| + /** |
| + * @param {number} imageId |
| + * @param {!{nodeStyles: (!Array<!SDK.CSSStyleDeclaration>|undefined), computedStyle: (?Map<string, string>|undefined)}} styles |
| + */ |
| function imageStylesReady(imageId, styles) { |
| if (progress.isCanceled()) { |
| callback(null); |
| @@ -887,6 +953,7 @@ Audits.AuditRules.ImageDimensionsRule = class extends Audits.AuditRule { |
| callback(null); |
| return; |
| } |
| + /** @type {!{nodeStyles: (!Array<!SDK.CSSStyleDeclaration>|undefined), computedStyle: (?Map<string, string>|undefined)}} */ |
| var targetResult = {}; |
| /** |
| @@ -908,8 +975,10 @@ Audits.AuditRules.ImageDimensionsRule = class extends Audits.AuditRule { |
| if (!nodeIds || !nodeIds.length) |
| doneCallback(); |
| + /** @type {!Array<!Promise>} */ |
| var nodePromises = []; |
| for (var i = 0; nodeIds && i < nodeIds.length; ++i) { |
| + /** @type {!Array<!Promise>} */ |
| var stylePromises = [ |
| cssModel.matchedStylesPromise(nodeIds[i]).then(matchedCallback), |
| cssModel.computedStylePromise(nodeIds[i]).then(computedCallback) |
| @@ -920,6 +989,9 @@ Audits.AuditRules.ImageDimensionsRule = class extends Audits.AuditRule { |
| Promise.all(nodePromises).catchException(null).then(doneCallback); |
| } |
| + /** |
| + * @param {!SDK.DOMDocument} root |
| + */ |
| function onDocumentAvailable(root) { |
| if (progress.isCanceled()) { |
| callback(null); |
| @@ -959,6 +1031,9 @@ Audits.AuditRules.CssInHeadRule = class extends Audits.AuditRule { |
| return; |
| } |
| + /** |
| + * @param {?Object<string, !Array<(number|!Array<string>)>>} evalResult |
| + */ |
| function evalCallback(evalResult) { |
| if (progress.isCanceled()) { |
| callback(null); |
| @@ -999,9 +1074,12 @@ Audits.AuditRules.CssInHeadRule = class extends Audits.AuditRule { |
| if (!nodeIds) |
| return; |
| var externalStylesheetNodeIds = nodeIds; |
| + /** @type {?Object<string, !Array<(number|!Array<string>)>>} */ |
| var result = null; |
| if (inlineStyleNodeIds.length || externalStylesheetNodeIds.length) { |
| + /** @type {!Object<string, !Array<(number|!Array<string>)>>} */ |
| var urlToViolationsArray = {}; |
| + /** @type {!Array<string>} */ |
| var externalStylesheetHrefs = []; |
| for (var j = 0; j < externalStylesheetNodeIds.length; ++j) { |
| var linkNode = domModel.nodeForId(externalStylesheetNodeIds[j]); |
| @@ -1070,6 +1148,9 @@ Audits.AuditRules.StylesScriptsOrderRule = class extends Audits.AuditRule { |
| return; |
| } |
| + /** |
| + * @param {?Array<!Array<string>|number>} resultValue |
| + */ |
| function evalCallback(resultValue) { |
| if (progress.isCanceled()) { |
| callback(null); |
| @@ -1087,7 +1168,7 @@ Audits.AuditRules.StylesScriptsOrderRule = class extends Audits.AuditRule { |
| Common.UIString( |
| 'The following external CSS files were included after an external JavaScript file in the document head. To ensure CSS files are downloaded in parallel, always include external CSS before external JavaScript.'), |
| true); |
| - entry.addURLs(lateCssUrls); |
| + entry.addURLs(/** @type {!Array<string>} */ (lateCssUrls)); |
| result.violationCount += lateCssUrls.length; |
| } |
| @@ -1114,8 +1195,10 @@ Audits.AuditRules.StylesScriptsOrderRule = class extends Audits.AuditRule { |
| return; |
| var cssBeforeInlineCount = nodeIds.length; |
| + /** @type {?Array<!Array<string>|number>} */ |
| var result = null; |
| if (lateStyleIds.length || cssBeforeInlineCount) { |
| + /** @type {!Array<string>} */ |
| var lateStyleUrls = []; |
| for (var i = 0; i < lateStyleIds.length; ++i) { |
| var lateStyleNode = domModel.nodeForId(lateStyleIds[i]); |
| @@ -1168,6 +1251,10 @@ Audits.AuditRules.StylesScriptsOrderRule = class extends Audits.AuditRule { |
| * @unrestricted |
| */ |
| Audits.AuditRules.CSSRuleBase = class extends Audits.AuditRule { |
| + /** |
| + * @param {string} id |
| + * @param {string} name |
| + */ |
| constructor(id, name) { |
| super(id, name); |
| } |
| @@ -1192,6 +1279,7 @@ Audits.AuditRules.CSSRuleBase = class extends Audits.AuditRule { |
| callback(null); |
| return; |
| } |
| + /** @type {!Array<!SDK.CSSStyleSheetHeader>} */ |
| var activeHeaders = []; |
| for (var i = 0; i < headers.length; ++i) { |
| if (!headers[i].disabled) |
| @@ -1290,6 +1378,10 @@ Audits.AuditRules.CSSRuleBase = class extends Audits.AuditRule { |
| * @unrestricted |
| */ |
| Audits.AuditRules.CookieRuleBase = class extends Audits.AuditRule { |
| + /** |
| + * @param {string} id |
| + * @param {string} name |
| + */ |
| constructor(id, name) { |
| super(id, name); |
| } |
| @@ -1304,6 +1396,9 @@ Audits.AuditRules.CookieRuleBase = class extends Audits.AuditRule { |
| */ |
| doRun(target, requests, result, callback, progress) { |
| var self = this; |
| + /** |
| + * @param {!Array<!SDK.Cookie>} receivedCookies |
| + */ |
| function resultCallback(receivedCookies) { |
| if (progress.isCanceled()) { |
| callback(result); |
| @@ -1317,6 +1412,11 @@ Audits.AuditRules.CookieRuleBase = class extends Audits.AuditRule { |
| SDK.Cookies.getCookiesAsync(resultCallback); |
| } |
| + /** |
| + * @param {!Object<string, !Array<!SDK.NetworkRequest>>} requestsByDomain |
| + * @param {!Array<!SDK.Cookie>} allCookies |
| + * @param {function(!SDK.NetworkRequest, !SDK.Cookie)} callback |
| + */ |
| mapResourceCookies(requestsByDomain, allCookies, callback) { |
| for (var i = 0; i < allCookies.length; ++i) { |
| for (var requestDomain in requestsByDomain) { |
| @@ -1326,11 +1426,16 @@ Audits.AuditRules.CookieRuleBase = class extends Audits.AuditRule { |
| } |
| } |
| + /** |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @param {!SDK.Cookie} cookie |
| + * @param {function(!SDK.NetworkRequest, !SDK.Cookie)} callback |
| + */ |
| _callbackForResourceCookiePairs(requests, cookie, callback) { |
| if (!requests) |
| return; |
| for (var i = 0; i < requests.length; ++i) { |
| - if (SDK.Cookies.cookieMatchesResourceURL(cookie, requests[i].url)) |
| + if (SDK.Cookies.cookieMatchesResourceURL(cookie, requests[i].url())) |
| callback(requests[i], cookie); |
| } |
| } |
| @@ -1340,12 +1445,19 @@ Audits.AuditRules.CookieRuleBase = class extends Audits.AuditRule { |
| * @unrestricted |
| */ |
| Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBase { |
| + /** |
| + * @param {number} avgBytesThreshold |
| + */ |
| constructor(avgBytesThreshold) { |
| super('http-cookiesize', Common.UIString('Minimize cookie size')); |
| this._avgBytesThreshold = avgBytesThreshold; |
| this._maxBytesThreshold = 1000; |
| } |
| + /** |
| + * @param {!Array<!SDK.Cookie>} cookieArray |
| + * @return {number} |
| + */ |
| _average(cookieArray) { |
| var total = 0; |
| for (var i = 0; i < cookieArray.length; ++i) |
| @@ -1353,6 +1465,10 @@ Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBas |
| return cookieArray.length ? Math.round(total / cookieArray.length) : 0; |
| } |
| + /** |
| + * @param {!Array<!SDK.Cookie>} cookieArray |
| + * @return {number} |
| + */ |
| _max(cookieArray) { |
| var result = 0; |
| for (var i = 0; i < cookieArray.length; ++i) |
| @@ -1360,17 +1476,37 @@ Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBas |
| return result; |
| } |
| + /** |
| + * @param {!Array<!SDK.Cookie>} allCookies |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @param {!Audits.AuditRuleResult} result |
| + */ |
| processCookies(allCookies, requests, result) { |
| + /** |
| + * @param {!Audits.AuditRules._CookieStats} a |
| + * @param {!Audits.AuditRules._CookieStats} b |
| + * @return {number} |
| + */ |
| function maxSizeSorter(a, b) { |
| return b.maxCookieSize - a.maxCookieSize; |
| } |
| + /** |
| + * @param {!Audits.AuditRules._CookieStats} a |
| + * @param {!Audits.AuditRules._CookieStats} b |
| + * @return {number} |
| + */ |
| function avgSizeSorter(a, b) { |
| return b.avgCookieSize - a.avgCookieSize; |
| } |
| + /** @type {!Object<string, !Array<!SDK.Cookie>>} */ |
| var cookiesPerResourceDomain = {}; |
| + /** |
| + * @param {!SDK.NetworkRequest} request |
| + * @param {!SDK.Cookie} cookie |
| + */ |
| function collectorCallback(request, cookie) { |
| var cookies = cookiesPerResourceDomain[request.parsedURL.host]; |
| if (!cookies) { |
| @@ -1383,9 +1519,10 @@ Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBas |
| if (!allCookies.length) |
| return; |
| + /** @type {!Array<!Audits.AuditRules._CookieStats>} */ |
| var sortedCookieSizes = []; |
| - var domainToResourcesMap = Audits.AuditRules.getDomainToResourcesMap(requests, null, true); |
| + var domainToResourcesMap = Audits.AuditRules.getDomainToResourcesMap(requests, null); |
| this.mapResourceCookies(domainToResourcesMap, allCookies, collectorCallback); |
| for (var requestDomain in cookiesPerResourceDomain) { |
| @@ -1395,6 +1532,7 @@ Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBas |
| } |
| var avgAllCookiesSize = this._average(allCookies); |
| + /** @type {!Array<string>} */ |
| var hugeCookieDomains = []; |
| sortedCookieSizes.sort(maxSizeSorter); |
| @@ -1407,6 +1545,7 @@ Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBas |
| } |
| } |
| + /** @type {!Array<string>} */ |
| var bigAvgCookieDomains = []; |
| sortedCookieSizes.sort(avgSizeSorter); |
| for (var i = 0, len = sortedCookieSizes.length; i < len; ++i) { |
| @@ -1445,14 +1584,22 @@ Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBas |
| * @unrestricted |
| */ |
| Audits.AuditRules.StaticCookielessRule = class extends Audits.AuditRules.CookieRuleBase { |
| + /** |
| + * @param {number} minResources |
| + */ |
| constructor(minResources) { |
| super('http-staticcookieless', Common.UIString('Serve static content from a cookieless domain')); |
| this._minResources = minResources; |
| } |
| + /** |
| + * @param {!Array<!SDK.Cookie>} allCookies |
| + * @param {!Array<!SDK.NetworkRequest>} requests |
| + * @param {!Audits.AuditRuleResult} result |
| + */ |
| processCookies(allCookies, requests, result) { |
| var domainToResourcesMap = Audits.AuditRules.getDomainToResourcesMap( |
| - requests, [Common.resourceTypes.Stylesheet, Common.resourceTypes.Image], true); |
| + requests, [Common.resourceTypes.Stylesheet, Common.resourceTypes.Image]); |
| var totalStaticResources = 0; |
| for (var domain in domainToResourcesMap) |
| totalStaticResources += domainToResourcesMap[domain].length; |
| @@ -1462,6 +1609,7 @@ Audits.AuditRules.StaticCookielessRule = class extends Audits.AuditRules.CookieR |
| var matchingResourceData = {}; |
| this.mapResourceCookies(domainToResourcesMap, allCookies, this._collectorCallback.bind(this, matchingResourceData)); |
| + /** @type {!Array<string>} */ |
| var badUrls = []; |
| var cookieBytes = 0; |
| for (var url in matchingResourceData) { |
| @@ -1489,3 +1637,6 @@ Audits.AuditRules.StaticCookielessRule = class extends Audits.AuditRules.CookieR |
| matchingResourceData[request.url()] = (matchingResourceData[request.url()] || 0) + cookie.size(); |
| } |
| }; |
| + |
| +/** @typedef {!{domain: string, avgCookieSize: number, maxCookieSize: number}} */ |
| +Audits.AuditRules._CookieStats; |