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

Unified Diff: third_party/WebKit/Source/devtools/front_end/css_tracker/CSSTrackerListView.js

Issue 2698623008: DevTools: extract a list view out of CSSTrackerView (Closed)
Patch Set: review comments + rebase Created 3 years, 10 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
Index: third_party/WebKit/Source/devtools/front_end/css_tracker/CSSTrackerListView.js
diff --git a/third_party/WebKit/Source/devtools/front_end/css_tracker/CSSTrackerView.js b/third_party/WebKit/Source/devtools/front_end/css_tracker/CSSTrackerListView.js
similarity index 39%
copy from third_party/WebKit/Source/devtools/front_end/css_tracker/CSSTrackerView.js
copy to third_party/WebKit/Source/devtools/front_end/css_tracker/CSSTrackerListView.js
index 354ed14157a3bd2316f65531dada472244e3c6b3..2d7d2cb4c06b80649354744ee04dd6f467da3aff 100644
--- a/third_party/WebKit/Source/devtools/front_end/css_tracker/CSSTrackerView.js
+++ b/third_party/WebKit/Source/devtools/front_end/css_tracker/CSSTrackerListView.js
@@ -1,203 +1,20 @@
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
+// Copyright (c) 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-CSSTracker.CSSTrackerView = class extends UI.VBox {
+CSSTracker.CSSTrackerListView = class extends UI.VBox {
constructor() {
super(true);
-
- this.registerRequiredCSS('css_tracker/cssTrackerView.css');
-
- var toolbarContainer = this.contentElement.createChild('div', 'css-tracker-toolbar-container');
- var topToolbar = new UI.Toolbar('css-tracker-toolbar', toolbarContainer);
-
- this._recordButton =
- new UI.ToolbarToggle(Common.UIString('Start recording'), 'largeicon-resume', 'largeicon-pause');
- this._recordButton.addEventListener(UI.ToolbarButton.Events.Click, () => this._toggleRecording(!this._isRecording));
- topToolbar.appendToolbarItem(this._recordButton);
-
- var clearButton = new UI.ToolbarButton(Common.UIString('Clear all'), 'largeicon-clear');
- clearButton.addEventListener(UI.ToolbarButton.Events.Click, this._reset.bind(this));
- topToolbar.appendToolbarItem(clearButton);
-
- this._cssResultsElement = this.contentElement.createChild('div', 'css-results');
- this._progressElement = this._cssResultsElement.createChild('div', 'progress-view');
this._treeOutline = new UI.TreeOutlineInShadow();
this._treeOutline.registerRequiredCSS('css_tracker/unusedRulesTree.css');
-
- this._statusToolbarElement = this.contentElement.createChild('div', 'css-toolbar-summary');
- this._statusMessageElement = this._statusToolbarElement.createChild('div', 'css-message');
-
- this._isRecording = false;
- }
-
- _reset() {
- Workspace.workspace.uiSourceCodes().forEach(
- uiSourceCode => uiSourceCode.removeDecorationsForType(CSSTracker.CSSTrackerView.LineDecorator.type));
-
- this._cssResultsElement.removeChildren();
- this._progressElement.textContent = '';
- this._cssResultsElement.appendChild(this._progressElement);
-
- this._treeOutline.removeChildren();
- this._statusMessageElement.textContent = '';
- }
-
- /**
- * @param {boolean} enable
- */
- _toggleRecording(enable) {
- if (enable === this._isRecording)
- return;
-
- this._isRecording = enable;
- this._recordButton.setToggled(this._isRecording);
-
- if (this._isRecording)
- this._startRecording();
- else
- this._stopRecording();
- }
-
- _startRecording() {
- this._reset();
- var mainTarget = SDK.targetManager.mainTarget();
- if (!mainTarget)
- return;
- var cssModel = mainTarget.model(SDK.CSSModel);
- if (!cssModel)
- return;
- this._recordButton.setTitle(Common.UIString('Stop recording'));
- cssModel.startRuleUsageTracking();
-
- this._progressElement.textContent = Common.UIString('Recording...');
- }
-
- _stopRecording() {
- var mainTarget = SDK.targetManager.mainTarget();
- if (!mainTarget)
- return;
-
- this._recordButton.setTitle(Common.UIString('Start recording'));
- this._progressElement.textContent = Common.UIString('Fetching results...');
-
- var cssModel = mainTarget.model(SDK.CSSModel);
- if (!cssModel)
- return;
-
- cssModel.ruleListPromise().then(processRuleList.bind(this)).then(updateViews.bind(this));
-
- /**
- * @param {!Array<!SDK.CSSModel.RuleUsage>} ruleUsageList
- * @this {!CSSTracker.CSSTrackerView}
- * @return {!Promise<!Array<!CSSTracker.StyleSheetUsage>>}
- */
- function processRuleList(ruleUsageList) {
- /** @type {!Map<?SDK.CSSStyleSheetHeader, !CSSTracker.StyleSheetUsage>} */
- var rulesByStyleSheet = new Map();
- for (var rule of ruleUsageList) {
- var styleSheetHeader = cssModel.styleSheetHeaderForId(rule.styleSheetId);
- var entry = rulesByStyleSheet.get(styleSheetHeader);
- if (!entry) {
- entry = {styleSheetHeader: styleSheetHeader, rules: []};
- rulesByStyleSheet.set(styleSheetHeader, entry);
- }
- entry.rules.push(rule);
- }
- return Promise.all(Array.from(
- rulesByStyleSheet.values(),
- entry => this._populateSourceInfo(/** @type {!CSSTracker.StyleSheetUsage} */ (entry))));
- }
-
- /**
- * @param {!Array<!CSSTracker.StyleSheetUsage>} styleSheetUsages
- * @this {!CSSTracker.CSSTrackerView}
- */
- function updateViews(styleSheetUsages) {
- this._updateStats(styleSheetUsages);
- this._updateGutter(styleSheetUsages);
- this._updateTree(styleSheetUsages);
- }
- }
-
- /**
- * @param {!CSSTracker.StyleSheetUsage} styleSheetUsage
- * @return {!Promise<!CSSTracker.StyleSheetUsage>}
- */
- _populateSourceInfo(styleSheetUsage) {
- if (!styleSheetUsage.styleSheetHeader)
- return Promise.resolve(styleSheetUsage);
- var ruleIndex =
- new Map(styleSheetUsage.rules.map(rule => [`${rule.range.startLine}.${rule.range.startColumn}`, rule]));
-
- return new Promise(fulfill => {
- styleSheetUsage.styleSheetHeader.requestContent().then(
- content => Common.formatterWorkerPool.parseCSS(content || '', onRules));
-
- /**
- * @param {boolean} isLastChunk
- * @param {!Array<!Common.FormatterWorkerPool.CSSStyleRule>} rules
- */
- function onRules(isLastChunk, rules) {
- for (var rule of rules) {
- if (!rule.styleRange)
- continue;
- var entry = ruleIndex.get(`${rule.styleRange.startLine}.${rule.styleRange.startColumn}`);
- if (entry)
- entry.selector = rule.selectorText;
- }
- if (isLastChunk)
- fulfill(styleSheetUsage);
- }
- });
- }
-
- /**
- * @param {!Array<!CSSTracker.StyleSheetUsage>} styleSheetUsage
- */
- _updateStats(styleSheetUsage) {
- var total = 0;
- var unused = 0;
- for (var styleSheet of styleSheetUsage) {
- total += styleSheet.rules.length;
- unused += styleSheet.rules.reduce((count, rule) => rule.wasUsed ? count : count + 1, 0);
- }
- var percentUnused = total ? Math.round(100 * unused / total) : 0;
- if (unused === 1) {
- this._statusMessageElement.textContent =
- Common.UIString('%d CSS rule is not used. (%d%%)', unused, percentUnused);
- } else {
- this._statusMessageElement.textContent =
- Common.UIString('%d CSS rules are not used. (%d%%)', unused, percentUnused);
- }
- }
-
- /**
- * @param {!Array<!CSSTracker.StyleSheetUsage>} styleSheetUsages
- */
- _updateGutter(styleSheetUsages) {
- for (var styleSheet of styleSheetUsages) {
- if (!styleSheet.styleSheetHeader)
- continue;
- var url = styleSheet.styleSheetHeader.sourceURL;
- var uiSourceCode = url && Workspace.workspace.uiSourceCodeForURL(url);
- if (!uiSourceCode)
- continue;
- for (var rule of styleSheet.rules) {
- var gutterRange = Common.TextRange.fromObject(rule.range);
- if (gutterRange.startColumn)
- gutterRange.startColumn--;
- uiSourceCode.addDecoration(gutterRange, CSSTracker.CSSTrackerView.LineDecorator.type, rule.wasUsed);
- }
- }
+ this.contentElement.appendChild(this._treeOutline.element);
}
/**
* @param {!Array<!CSSTracker.StyleSheetUsage>} styleSheetUsages
*/
- _updateTree(styleSheetUsages) {
- this._cssResultsElement.removeChildren();
- this._cssResultsElement.appendChild(this._treeOutline.element);
+ update(styleSheetUsages) {
+ this._treeOutline.removeChildren();
for (var sheet of styleSheetUsages) {
var unusedRuleCount = sheet.rules.reduce((count, rule) => rule.wasUsed ? count : count + 1, 0);
@@ -206,7 +23,7 @@ CSSTracker.CSSTrackerView = class extends UI.VBox {
if (!url)
continue;
- var styleSheetTreeElement = new CSSTracker.CSSTrackerView.StyleSheetTreeElement(url, sheet.rules);
+ var styleSheetTreeElement = new CSSTracker.CSSTrackerListView.StyleSheetTreeElement(url, sheet.rules);
this._treeOutline.appendChild(styleSheetTreeElement);
continue;
}
@@ -228,18 +45,9 @@ CSSTracker.CSSTrackerView = class extends UI.VBox {
}
};
-/** @typedef {{range: !Protocol.CSS.SourceRange,
- * selector: (string|undefined),
- * wasUsed: boolean}}
- */
-CSSTracker.RuleUsage;
-
-/** @typedef {{styleSheetHeader: ?SDK.CSSStyleSheetHeader, rules: !Array<!CSSTracker.RuleUsage>}} */
-CSSTracker.StyleSheetUsage;
-
-CSSTracker.CSSTrackerView._rulesShownAtOnce = 20;
+CSSTracker.CSSTrackerListView._rulesShownAtOnce = 20;
-CSSTracker.CSSTrackerView.StyleSheetTreeElement = class extends UI.TreeElement {
+CSSTracker.CSSTrackerListView.StyleSheetTreeElement = class extends UI.TreeElement {
/**
* @param {string} url
* @param {!Array<!CSSTracker.RuleUsage>} ruleList
@@ -293,7 +101,7 @@ CSSTracker.CSSTrackerView.StyleSheetTreeElement = class extends UI.TreeElement {
* @override
*/
onpopulate() {
- var toIndex = Math.min(this._unusedRules.length, CSSTracker.CSSTrackerView._rulesShownAtOnce);
+ var toIndex = Math.min(this._unusedRules.length, CSSTracker.CSSTrackerListView._rulesShownAtOnce);
this._appendRules(0, toIndex);
if (toIndex < this._unusedRules.length)
this._appendShowAllRulesButton(toIndex);
@@ -357,38 +165,3 @@ CSSTracker.CSSTrackerView.StyleSheetTreeElement = class extends UI.TreeElement {
this._appendRules(startMatchIndex, this._unusedRules.length);
}
};
-
-/**
- * @implements {SourceFrame.UISourceCodeFrame.LineDecorator}
- */
-CSSTracker.CSSTrackerView.LineDecorator = class {
- /**
- * @override
- * @param {!Workspace.UISourceCode} uiSourceCode
- * @param {!TextEditor.CodeMirrorTextEditor} textEditor
- */
- decorate(uiSourceCode, textEditor) {
- var gutterType = 'CodeMirror-gutter-coverage';
-
- var decorations = uiSourceCode.decorationsForType(CSSTracker.CSSTrackerView.LineDecorator.type);
- textEditor.uninstallGutter(gutterType);
- if (!decorations || !decorations.size)
- return;
-
- textEditor.installGutter(gutterType, false);
-
- for (var decoration of decorations) {
- for (var line = decoration.range().startLine; line <= decoration.range().endLine; ++line) {
- var element = createElementWithClass('div');
- if (decoration.data())
- element.className = 'text-editor-css-rule-used-marker';
- else
- element.className = 'text-editor-css-rule-unused-marker';
-
- textEditor.setGutterDecoration(line, gutterType, element);
- }
- }
- }
-};
-
-CSSTracker.CSSTrackerView.LineDecorator.type = 'coverage';

Powered by Google App Engine
This is Rietveld 408576698