Chromium Code Reviews| 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 fb51c7711602456714e7f61fcceeb49355e810b3..048302adc9281893a1fb891a44931dbeb8dd8a81 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/elements/ClassesPaneWidget.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/elements/ClassesPaneWidget.js |
| @@ -19,44 +19,67 @@ Elements.ClassesPaneWidget = class extends UI.Widget { |
| var proxyElement = this._prompt.attach(this._input); |
| this._prompt.setPlaceholder(Common.UIString('Add new class')); |
| + this._prompt.on(UI.TextPrompt.TextChangedEvent, this._onTextChanged, this); |
| proxyElement.addEventListener('keydown', this._onKeyDown.bind(this), false); |
| SDK.targetManager.addModelListener(SDK.DOMModel, SDK.DOMModel.Events.DOMMutated, this._onDOMMutated, this); |
| /** @type {!Set<!SDK.DOMNode>} */ |
| this._mutatingNodes = new Set(); |
| - UI.context.addFlavorChangeListener(SDK.DOMNode, this._update, this); |
| + this._updateNodeThrottler = new Common.Throttler(0); |
| + /** @type {?SDK.DOMNode} */ |
| + this._previousTarget = null; |
| + UI.context.addFlavorChangeListener(SDK.DOMNode, this._onFlavorChange, this); |
| + } |
| + |
| + /** |
| + * @param {string} text |
| + * @return {!Array.<string>} |
| + */ |
| + _splitTextIntoClasses(text) { |
| + return text.split(/[.,\s]/) |
| + .map(className => className.trim()) |
| + .filter(className => className.length); |
| } |
| /** |
| * @param {!Event} event |
| */ |
| _onKeyDown(event) { |
| + if (!isEnterKey(event) && !isEscKey(event)) |
| + return; |
| + |
| var text = event.target.textContent; |
| if (isEscKey(event)) { |
| - event.target.textContent = ''; |
| if (!text.isWhitespace()) |
| event.consume(true); |
| - return; |
| + text = ''; |
|
lushnikov
2017/03/17 17:41:19
i don't quite follow the logic here. The empty tex
kdzwinel
2017/03/20 09:51:13
Good catch! I've rearranged the code so that textC
|
| } |
| - if (!isEnterKey(event)) |
| - return; |
| + if (isEnterKey(event)) |
| + event.consume(true); |
| + |
| var node = UI.context.flavor(SDK.DOMNode); |
| if (!node) |
| return; |
| this._prompt.clearAutocomplete(); |
| event.target.textContent = ''; |
| - var classNames = text.split(/[.,\s]/); |
| - for (var className of classNames) { |
| - var className = className.trim(); |
| - if (!className.length) |
| - continue; |
| + var classNames = this._splitTextIntoClasses(text); |
| + for (var className of classNames) |
| this._toggleClass(node, className, true); |
| - } |
| this._installNodeClasses(node); |
| this._update(); |
| - event.consume(true); |
| + } |
| + |
| + _onTextChanged() { |
| + var node = UI.context.flavor(SDK.DOMNode); |
| + if (!node) |
| + return; |
| + var text = this._prompt.textWithCurrentSuggestion(); |
| + var classes = this._splitTextIntoClasses(text); |
| + |
| + this._installNodeClasses(node, classes); |
| + this._update(); |
| } |
| /** |
| @@ -71,6 +94,18 @@ Elements.ClassesPaneWidget = class extends UI.Widget { |
| } |
| /** |
| + * @param {!Common.Event} event |
| + */ |
| + _onFlavorChange(event) { |
| + if (this._previousTarget && this._prompt.text()) { |
| + this._input.textContent = ''; |
| + this._installNodeClasses(this._previousTarget); |
|
lushnikov
2017/03/17 17:41:19
you probably want to flush throttler here to guara
kdzwinel
2017/03/20 09:51:12
Updated, PTAL if I read your comment correctly.
|
| + } |
| + this._previousTarget = /** @type {?SDK.DOMNode} */ (event.data); |
| + this._update(); |
| + } |
| + |
| + /** |
| * @override |
| */ |
| wasShown() { |
| @@ -150,8 +185,9 @@ Elements.ClassesPaneWidget = class extends UI.Widget { |
| /** |
| * @param {!SDK.DOMNode} node |
| + * @param {!Array.<string>=} additionalClasses |
| */ |
| - _installNodeClasses(node) { |
| + _installNodeClasses(node, additionalClasses) { |
| var classes = this._nodeClasses(node); |
| var activeClasses = new Set(); |
| for (var className of classes.keys()) { |
| @@ -159,17 +195,32 @@ Elements.ClassesPaneWidget = class extends UI.Widget { |
| activeClasses.add(className); |
| } |
| + if (additionalClasses) { |
| + for (className of additionalClasses) |
| + activeClasses.add(className); |
| + } |
| var newClasses = activeClasses.valuesArray(); |
| newClasses.sort(); |
| + |
| + this._updateNodeThrottler.schedule(this._setClassValue.bind(this, node, newClasses.join(' '))); |
| + } |
| + |
| + _setClassValue(node, value) { |
|
lushnikov
2017/03/17 17:41:19
let's add jsdoc
|
| + var fulfill; |
| + var promise = new Promise(f => fulfill = f); |
| + |
| this._mutatingNodes.add(node); |
| - node.setAttributeValue('class', newClasses.join(' '), onClassNameUpdated.bind(this)); |
| + node.setAttributeValue('class', value, onClassValueUpdated.bind(this)); |
| /** |
| * @this {Elements.ClassesPaneWidget} |
| */ |
| - function onClassNameUpdated() { |
| + function onClassValueUpdated() { |
| this._mutatingNodes.delete(node); |
| + fulfill(); |
| } |
| + |
| + return promise; |
| } |
| }; |