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

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

Issue 2455943003: Backend for css rule tracking (Closed)
Patch Set: Backend for css rule tracking Created 4 years, 1 month 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
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);
+ }
}
/**

Powered by Google App Engine
This is Rietveld 408576698