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

Unified Diff: third_party/WebKit/Source/devtools/front_end/elements/ClassesPaneWidget.js

Issue 2646283002: ClassesPaneWidget - Add ability to quickly preview autocompleted CSS classes. (Closed)
Patch Set: Add missing jsdoc 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/elements/ClassesPaneWidget.js
diff --git a/third_party/WebKit/Source/devtools/front_end/elements/ClassesPaneWidget.js b/third_party/WebKit/Source/devtools/front_end/elements/ClassesPaneWidget.js
index 6e94cb264d011545036a2b1039fc976e2700d7bf..823feb03db9bc45218a583e251828b9cba169070 100644
--- a/third_party/WebKit/Source/devtools/front_end/elements/ClassesPaneWidget.js
+++ b/third_party/WebKit/Source/devtools/front_end/elements/ClassesPaneWidget.js
@@ -15,7 +15,11 @@ Elements.ClassesPaneWidget = class extends UI.Widget {
this._classesContainer.classList.add('styles-element-classes-container');
this._prompt = new Elements.ClassesPaneWidget.ClassNamePrompt();
this._prompt.setAutocompletionTimeout(0);
+ this._prompt.addEventListener(UI.TextPrompt.Events.ItemApplied, this._applyFreeFlowClassListTextEdit.bind(this), this);
+ this._prompt.addEventListener(UI.TextPrompt.Events.ItemAccepted, this._applyFreeFlowClassListTextEdit.bind(this), this);
this._prompt.renderAsBlock();
+ /** @type {!Set<string>} */
+ this._previewClasses = new Set();
lushnikov 2017/02/07 22:01:37 Why do we need a set? afaiu there's only one sugge
kdzwinel 2017/02/07 23:20:05 One suggestion, but there can be multiple classes
var proxyElement = this._prompt.attach(this._input);
this._prompt.setPlaceholder(Common.UIString('Add new class'));
@@ -31,25 +35,29 @@ Elements.ClassesPaneWidget = class extends UI.Widget {
* @param {!Event} event
*/
_onKeyDown(event) {
- var text = event.target.textContent;
+ const text = event.target.textContent;
lushnikov 2017/02/07 22:01:37 nit: we don't use consts so far, let's use "var"
kdzwinel 2017/02/07 23:20:06 AFAIK `let` is not yet used, but `const` is fine.
+ const node = UI.context.flavor(SDK.DOMNode);
+ if (!node)
+ return;
+
if (isEscKey(event)) {
event.target.textContent = '';
if (!text.isWhitespace())
event.consume(true);
+ this._previewClasses.clear();
+ this._installNodeClasses(node);
return;
}
if (!isEnterKey(event))
return;
- var node = UI.context.flavor(SDK.DOMNode);
- if (!node)
- return;
this._prompt.clearAutocomplete();
+ this._previewClasses.clear();
event.target.textContent = '';
- var classNames = text.split(/[.,\s]/);
+ const classNames = text.split(/[.,\s]/);
for (var className of classNames) {
- var className = className.trim();
+ className = className.trim();
if (!className.length)
continue;
this._toggleClass(node, className, true);
@@ -117,6 +125,40 @@ Elements.ClassesPaneWidget = class extends UI.Widget {
this._installNodeClasses(node);
}
+ _applyFreeFlowClassListTextEdit() {
+ const text = this._prompt.textWithCurrentSuggestion();
+ const node = UI.context.flavor(SDK.DOMNode);
+ if (!node)
+ return;
+
+ this._previewClasses.clear();
+ const classNames = text.split(/[.,\s]/);
lushnikov 2017/02/07 22:01:37 that's unfortunate we had to copy the regex over h
kdzwinel 2017/02/07 23:20:05 Good point! It should probably be extracted to a c
+ for (var className of classNames) {
+ className = className.trim();
+ if (!className.length)
+ continue;
+ this._previewClasses.add(className);
+ }
+ this._installNodeClasses(node);
+ }
+
+ /**
+ * @param {!SDK.DOMNode} node
+ * @return {!Array<string>}
+ */
+ _getActiveClasses(node) {
lushnikov 2017/02/07 22:01:37 why do you need to extract this?
kdzwinel 2017/02/07 23:20:05 No real need, I did it just for the readability of
+ const classes = this._nodeClasses(node);
+ const activeClasses = new Set();
+ for (var className of classes.keys()) {
+ if (classes.get(className))
+ activeClasses.add(className);
+ }
+ for (className of this._previewClasses)
+ activeClasses.add(className);
+
+ return activeClasses.valuesArray().sort();
+ }
+
/**
* @param {!SDK.DOMNode} node
* @return {!Map<string, boolean>}
@@ -152,17 +194,9 @@ Elements.ClassesPaneWidget = class extends UI.Widget {
* @param {!SDK.DOMNode} node
*/
_installNodeClasses(node) {
- var classes = this._nodeClasses(node);
- var activeClasses = new Set();
- for (var className of classes.keys()) {
- if (classes.get(className))
- activeClasses.add(className);
- }
-
- var newClasses = activeClasses.valuesArray();
- newClasses.sort();
+ const activeClasses = this._getActiveClasses(node);
this._mutatingNodes.add(node);
- node.setAttributeValue('class', newClasses.join(' '), onClassNameUpdated.bind(this));
+ node.setAttributeValue('class', activeClasses.join(' '), onClassNameUpdated.bind(this));
/**
* @this {Elements.ClassesPaneWidget}
« 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