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..54a76d31d8e6474f69eb810f7eb7ebb58d48e099 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) { |
|
luoe
2017/01/13 08:05:22
I don't think this new function is needed. The pl
allada
2017/01/17 19:16:25
line: 245 does.
luoe
2017/01/17 19:40:16
Line 245 is using "domain", the keys of the map, n
allada
2017/01/17 19:50:11
Done.
|
| + var requestMap = Audits.AuditRules.getDomainToResourcesMap(requests, types); |
| + /** @type {!Object<string, !Array<string>>} */ |
| + var output = {}; |
|
alph
2017/01/12 07:54:42
nit: can you plz use Map as assigning arbitrary ke
allada
2017/01/12 23:49:31
I don't want to do this because this patch is not
|
| + 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>} */ |
| 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))); |
| @@ -526,7 +547,7 @@ Audits.AuditRules.StyleSheetProcessor = class { |
| * @this {Audits.AuditRules.StyleSheetProcessor} |
| */ |
| function onRulesParsed(isLastChunk, rules) { |
| - allRules.push(...rules); |
| + allRules.push.apply(allRules, rules); |
|
luoe
2017/01/13 08:05:21
I'm not sure how large the "rules" array gets, but
allada
2017/01/17 19:16:25
Apply is better per kozyatinskiy@
|
| if (isLastChunk) |
| this._onStyleSheetParsed(allRules); |
| } |
| @@ -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>} */ |
|
luoe
2017/01/13 08:05:22
Nit: space after comma
allada
2017/01/17 19:16:25
Done.
|
| 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 { |
|
luoe
2017/01/13 08:05:22
Not related to typing, but it looks like this clas
allada
2017/01/17 19:16:25
I would rather not in this cl, I only want to prot
|
| + /** |
| + * @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,18 @@ 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 |
|
luoe
2017/01/13 08:05:22
@return {number}
allada
2017/01/17 19:16:25
Done.
|
| + */ |
| _average(cookieArray) { |
| var total = 0; |
| for (var i = 0; i < cookieArray.length; ++i) |
| @@ -1353,6 +1464,9 @@ Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBas |
| return cookieArray.length ? Math.round(total / cookieArray.length) : 0; |
| } |
| + /** |
| + * @param {!Array<!SDK.Cookie>} cookieArray |
|
luoe
2017/01/13 08:05:22
ditto
allada
2017/01/17 19:16:25
Done.
|
| + */ |
| _max(cookieArray) { |
| var result = 0; |
| for (var i = 0; i < cookieArray.length; ++i) |
| @@ -1360,17 +1474,35 @@ 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 {!{domain: string, avgCookieSize: number, maxCookieSize: number}} a |
|
luoe
2017/01/13 08:05:23
typedef CookieStats?
@return number
allada
2017/01/17 19:16:25
Done.
|
| + * @param {!{domain: string, avgCookieSize: number, maxCookieSize: number}} b |
| + */ |
| function maxSizeSorter(a, b) { |
| return b.maxCookieSize - a.maxCookieSize; |
| } |
| + /** |
| + * @param {!{domain: string, avgCookieSize: number, maxCookieSize: number}} a |
|
luoe
2017/01/13 08:05:22
ditto
|
| + * @param {!{domain: string, avgCookieSize: number, maxCookieSize: number}} b |
| + */ |
| 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 +1515,10 @@ Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBas |
| if (!allCookies.length) |
| return; |
| + /** @type {!Array<!{domain: string, avgCookieSize: number, maxCookieSize: number}>} */ |
| 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 +1528,7 @@ Audits.AuditRules.CookieSizeRule = class extends Audits.AuditRules.CookieRuleBas |
| } |
| var avgAllCookiesSize = this._average(allCookies); |
| + /** @type {!Array<string>} */ |
| var hugeCookieDomains = []; |
| sortedCookieSizes.sort(maxSizeSorter); |
| @@ -1407,6 +1541,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 +1580,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 +1605,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) { |