| 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 7731fac6ece3dbe29b5a60f872fbc2a67fdb342e..5fc71c15c286704792f2e7044c74f53644207276 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/audits/AuditRules.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/audits/AuditRules.js
|
| @@ -373,6 +373,7 @@ WebInspector.AuditRules.UnusedCssRule.prototype = {
|
| */
|
| doRun: function(target, requests, result, callback, progress)
|
| {
|
| + WebInspector.CSSModel.fromTarget(target).startSelectorRecording(true);
|
| var domModel = WebInspector.DOMModel.fromTarget(target);
|
| var cssModel = WebInspector.CSSModel.fromTarget(target);
|
| if (!domModel || !cssModel) {
|
| @@ -412,47 +413,69 @@ WebInspector.AuditRules.UnusedCssRule.prototype = {
|
| return;
|
| }
|
|
|
| - var inlineBlockOrdinal = 0;
|
| - var totalStylesheetSize = 0;
|
| - var totalUnusedStylesheetSize = 0;
|
| - var summary;
|
| -
|
| - for (var i = 0; i < styleSheets.length; ++i) {
|
| - var styleSheet = styleSheets[i];
|
| - var unusedRules = [];
|
| - for (var curRule = 0; curRule < styleSheet.rules.length; ++curRule) {
|
| - var rule = styleSheet.rules[curRule];
|
| - if (!testedSelectors[rule.selectorText] || foundSelectors[rule.selectorText])
|
| - continue;
|
| - unusedRules.push(rule.selectorText);
|
| + WebInspector.CSSModel.fromTarget(target).ruleListPromise().then(ruleListReceived);
|
| +
|
| + function ruleListReceived(usedRulesList) {
|
| +
|
| + var inlineBlockOrdinal = 0;
|
| + var totalStylesheetSize = 0;
|
| + var totalUnusedStylesheetSize = 0;
|
| + var summary;
|
| +
|
| + function getRange(range, URL) {
|
| + return [range.startLine, range.startColumn, URL];
|
| }
|
| - totalStylesheetSize += styleSheet.rules.length;
|
| - totalUnusedStylesheetSize += unusedRules.length;
|
|
|
| - if (!unusedRules.length)
|
| - continue;
|
| + var cssModel = WebInspector.CSSModel.fromTarget(target);
|
|
|
| - var resource = WebInspector.resourceForURL(styleSheet.sourceURL);
|
| - var isInlineBlock = resource && resource.request && resource.request.resourceType() === WebInspector.resourceTypes.Document;
|
| - var url = !isInlineBlock ? WebInspector.AuditRuleResult.linkifyDisplayName(styleSheet.sourceURL) : WebInspector.UIString("Inline block #%d", ++inlineBlockOrdinal);
|
| - var pctUnused = Math.round(100 * unusedRules.length / styleSheet.rules.length);
|
| - if (!summary)
|
| - summary = result.addChild("", true);
|
| - var entry = summary.addFormatted("%s: %d% is not used by the current page.", url, pctUnused);
|
| + var testedRules = {};
|
| + for (var i = 0; i < usedRulesList.length; ++i) {
|
| + if (usedRulesList[i].wasUsed) {
|
| + var styleSheetHeader = cssModel.styleSheetHeaderForId(usedRulesList[i].styleSheetId);
|
| + testedRules[getRange(usedRulesList[i].range, styleSheetHeader.sourceURL)] = 1;
|
| + }
|
| + }
|
|
|
| - for (var j = 0; j < unusedRules.length; ++j)
|
| - entry.addSnippet(unusedRules[j]);
|
| + for (var i = 0; i < styleSheets.length; ++i) {
|
| + var styleSheet = styleSheets[i];
|
| + var unusedRules = [];
|
|
|
| - result.violationCount += unusedRules.length;
|
| - }
|
| + for (var curRule = 0; curRule < styleSheet.rules.length; ++curRule) {
|
| + var rule = styleSheet.rules[curRule];
|
|
|
| - if (!totalUnusedStylesheetSize)
|
| - return callback(null);
|
| + if (testedRules[getRange(rule.styleRange, styleSheet.sourceURL)])
|
| + continue;
|
| + unusedRules.push(rule);
|
| + }
|
|
|
| - var totalUnusedPercent = Math.round(100 * totalUnusedStylesheetSize / totalStylesheetSize);
|
| - summary.value = WebInspector.UIString("%s rules (%d%) of CSS not used by the current page.", totalUnusedStylesheetSize, totalUnusedPercent);
|
| + totalStylesheetSize += styleSheet.rules.length;
|
| + totalUnusedStylesheetSize += unusedRules.length;
|
|
|
| - callback(result);
|
| + if (!unusedRules.length)
|
| + continue;
|
| +
|
| + var resource = WebInspector.resourceForURL(styleSheet.sourceURL);
|
| + var isInlineBlock = resource && resource.request && resource.request.resourceType() === WebInspector.resourceTypes.Document;
|
| + var url = !isInlineBlock ? WebInspector.AuditRuleResult.linkifyDisplayName(styleSheet.sourceURL) : WebInspector.UIString("Inline block #%d", ++inlineBlockOrdinal);
|
| + var pctUnused = Math.round(100 * unusedRules.length / styleSheet.rules.length);
|
| + if (!summary)
|
| + summary = result.addChild("", true);
|
| + var entry = summary.addFormatted("%s: %d% is not used by the current page.", url, pctUnused);
|
| +
|
| + for (var j = 0; j < unusedRules.length; ++j)
|
| + entry.addSnippet(unusedRules[j].selectorText + " Line: " + unusedRules[j].styleRange.startLine);
|
| +
|
| + result.violationCount += unusedRules.length;
|
| + }
|
| +
|
| + if (!totalUnusedStylesheetSize)
|
| + return callback(null);
|
| +
|
| + var totalUnusedPercent = Math.round(100 * totalUnusedStylesheetSize / totalStylesheetSize);
|
| + summary.value = WebInspector.UIString("%s rules (%d%) of CSS not used by the current page.", totalUnusedStylesheetSize, totalUnusedPercent);
|
| +
|
| + callback(result);
|
| + }
|
| }
|
|
|
| /**
|
|
|