Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(323)

Unified Diff: third_party/WebKit/Source/devtools/front_end/audits/AuditRules.js

Issue 2627073003: [Devtools] Fixed url in Audits and added doctypes (Closed)
Patch Set: Merge branch 'master' into AUDITRULES_TYPED Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698