| Index: third_party/WebKit/Source/devtools/front_end/ui/InplaceEditor.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/ui/InplaceEditor.js b/third_party/WebKit/Source/devtools/front_end/ui/InplaceEditor.js
|
| index 0ef59c46781da1653dd0e61210ce9863cde1bcc6..3f925100c6b4fd91da05151d4e1d8916e084b002 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/ui/InplaceEditor.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/ui/InplaceEditor.js
|
| @@ -1,253 +1,230 @@
|
| // Copyright 2014 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.
|
| -
|
| -/**
|
| - * @constructor
|
| - */
|
| -WebInspector.InplaceEditor = function()
|
| -{
|
| -};
|
| -
|
| /**
|
| - * @typedef {{cancel: function(), commit: function(), setWidth: function(number)}}
|
| + * @unrestricted
|
| */
|
| -WebInspector.InplaceEditor.Controller;
|
| -
|
| -/**
|
| - * @param {!Element} element
|
| - * @param {!WebInspector.InplaceEditor.Config=} config
|
| - * @return {?WebInspector.InplaceEditor.Controller}
|
| - */
|
| -WebInspector.InplaceEditor.startEditing = function(element, config)
|
| -{
|
| +WebInspector.InplaceEditor = class {
|
| + /**
|
| + * @param {!Element} element
|
| + * @param {!WebInspector.InplaceEditor.Config=} config
|
| + * @return {?WebInspector.InplaceEditor.Controller}
|
| + */
|
| + static startEditing(element, config) {
|
| if (!WebInspector.InplaceEditor._defaultInstance)
|
| - WebInspector.InplaceEditor._defaultInstance = new WebInspector.InplaceEditor();
|
| + WebInspector.InplaceEditor._defaultInstance = new WebInspector.InplaceEditor();
|
| return WebInspector.InplaceEditor._defaultInstance.startEditing(element, config);
|
| -};
|
| -
|
| -/**
|
| - * @param {!Element} element
|
| - * @param {!WebInspector.InplaceEditor.Config=} config
|
| - * @return {!Promise.<!WebInspector.InplaceEditor.Controller>}
|
| - */
|
| -WebInspector.InplaceEditor.startMultilineEditing = function(element, config)
|
| -{
|
| + }
|
| +
|
| + /**
|
| + * @param {!Element} element
|
| + * @param {!WebInspector.InplaceEditor.Config=} config
|
| + * @return {!Promise.<!WebInspector.InplaceEditor.Controller>}
|
| + */
|
| + static startMultilineEditing(element, config) {
|
| return self.runtime.extension(WebInspector.InplaceEditor).instance().then(startEditing);
|
|
|
| /**
|
| * @param {!Object} inplaceEditor
|
| * @return {!WebInspector.InplaceEditor.Controller|!Promise.<!WebInspector.InplaceEditor.Controller>}
|
| */
|
| - function startEditing(inplaceEditor)
|
| - {
|
| - var controller = /** @type {!WebInspector.InplaceEditor} */ (inplaceEditor).startEditing(element, config);
|
| - if (!controller)
|
| - return Promise.reject(new Error("Editing is already in progress"));
|
| - return controller;
|
| + function startEditing(inplaceEditor) {
|
| + var controller = /** @type {!WebInspector.InplaceEditor} */ (inplaceEditor).startEditing(element, config);
|
| + if (!controller)
|
| + return Promise.reject(new Error('Editing is already in progress'));
|
| + return controller;
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @return {string}
|
| + */
|
| + editorContent(editingContext) {
|
| + var element = editingContext.element;
|
| + if (element.tagName === 'INPUT' && element.type === 'text')
|
| + return element.value;
|
| +
|
| + return element.textContent;
|
| + }
|
| +
|
| + setUpEditor(editingContext) {
|
| + var element = editingContext.element;
|
| + element.classList.add('editing');
|
| +
|
| + var oldTabIndex = element.getAttribute('tabIndex');
|
| + if (typeof oldTabIndex !== 'number' || oldTabIndex < 0)
|
| + element.tabIndex = 0;
|
| + this._focusRestorer = new WebInspector.ElementFocusRestorer(element);
|
| + editingContext.oldTabIndex = oldTabIndex;
|
| + }
|
| +
|
| + closeEditor(editingContext) {
|
| + var element = editingContext.element;
|
| + element.classList.remove('editing');
|
| +
|
| + if (typeof editingContext.oldTabIndex !== 'number')
|
| + element.removeAttribute('tabIndex');
|
| + else
|
| + element.tabIndex = editingContext.oldTabIndex;
|
| + element.scrollTop = 0;
|
| + element.scrollLeft = 0;
|
| + }
|
| +
|
| + cancelEditing(editingContext) {
|
| + var element = editingContext.element;
|
| + if (element.tagName === 'INPUT' && element.type === 'text')
|
| + element.value = editingContext.oldText;
|
| + else
|
| + element.textContent = editingContext.oldText;
|
| + }
|
| +
|
| + augmentEditingHandle(editingContext, handle) {
|
| + }
|
| +
|
| + /**
|
| + * @param {!Element} element
|
| + * @param {!WebInspector.InplaceEditor.Config=} config
|
| + * @return {?WebInspector.InplaceEditor.Controller}
|
| + */
|
| + startEditing(element, config) {
|
| + if (!WebInspector.markBeingEdited(element, true))
|
| + return null;
|
| +
|
| + config = config || new WebInspector.InplaceEditor.Config(function() {}, function() {});
|
| + var editingContext = {element: element, config: config};
|
| + var committedCallback = config.commitHandler;
|
| + var cancelledCallback = config.cancelHandler;
|
| + var pasteCallback = config.pasteHandler;
|
| + var context = config.context;
|
| + var isMultiline = config.multiline || false;
|
| + var moveDirection = '';
|
| + var self = this;
|
| +
|
| + /**
|
| + * @param {!Event} e
|
| + */
|
| + function consumeCopy(e) {
|
| + e.consume();
|
| + }
|
| +
|
| + this.setUpEditor(editingContext);
|
| +
|
| + editingContext.oldText = isMultiline ? config.initialValue : this.editorContent(editingContext);
|
| +
|
| + /**
|
| + * @param {!Event=} e
|
| + */
|
| + function blurEventListener(e) {
|
| + if (config.blurHandler && !config.blurHandler(element, e))
|
| + return;
|
| + if (!isMultiline || !e || !e.relatedTarget || !e.relatedTarget.isSelfOrDescendant(element))
|
| + editingCommitted.call(element);
|
| + }
|
| +
|
| + function cleanUpAfterEditing() {
|
| + WebInspector.markBeingEdited(element, false);
|
| +
|
| + element.removeEventListener('blur', blurEventListener, isMultiline);
|
| + element.removeEventListener('keydown', keyDownEventListener, true);
|
| + if (pasteCallback)
|
| + element.removeEventListener('paste', pasteEventListener, true);
|
| +
|
| + if (self._focusRestorer)
|
| + self._focusRestorer.restore();
|
| + self.closeEditor(editingContext);
|
| + }
|
| +
|
| + /** @this {Element} */
|
| + function editingCancelled() {
|
| + self.cancelEditing(editingContext);
|
| + cleanUpAfterEditing();
|
| + cancelledCallback(this, context);
|
| + }
|
| +
|
| + /** @this {Element} */
|
| + function editingCommitted() {
|
| + cleanUpAfterEditing();
|
| +
|
| + committedCallback(this, self.editorContent(editingContext), editingContext.oldText, context, moveDirection);
|
| }
|
| -};
|
|
|
| -WebInspector.InplaceEditor.prototype = {
|
| /**
|
| + * @param {!Event} event
|
| * @return {string}
|
| */
|
| - editorContent: function(editingContext) {
|
| - var element = editingContext.element;
|
| - if (element.tagName === "INPUT" && element.type === "text")
|
| - return element.value;
|
| -
|
| - return element.textContent;
|
| - },
|
| -
|
| - setUpEditor: function(editingContext)
|
| - {
|
| - var element = editingContext.element;
|
| - element.classList.add("editing");
|
| -
|
| - var oldTabIndex = element.getAttribute("tabIndex");
|
| - if (typeof oldTabIndex !== "number" || oldTabIndex < 0)
|
| - element.tabIndex = 0;
|
| - this._focusRestorer = new WebInspector.ElementFocusRestorer(element);
|
| - editingContext.oldTabIndex = oldTabIndex;
|
| - },
|
| -
|
| - closeEditor: function(editingContext)
|
| - {
|
| - var element = editingContext.element;
|
| - element.classList.remove("editing");
|
| -
|
| - if (typeof editingContext.oldTabIndex !== "number")
|
| - element.removeAttribute("tabIndex");
|
| - else
|
| - element.tabIndex = editingContext.oldTabIndex;
|
| - element.scrollTop = 0;
|
| - element.scrollLeft = 0;
|
| - },
|
| -
|
| - cancelEditing: function(editingContext)
|
| - {
|
| - var element = editingContext.element;
|
| - if (element.tagName === "INPUT" && element.type === "text")
|
| - element.value = editingContext.oldText;
|
| - else
|
| - element.textContent = editingContext.oldText;
|
| - },
|
| -
|
| - augmentEditingHandle: function(editingContext, handle)
|
| - {
|
| - },
|
| + function defaultFinishHandler(event) {
|
| + var isMetaOrCtrl = WebInspector.isMac() ? event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey :
|
| + event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
|
| + if (isEnterKey(event) && (event.isMetaOrCtrlForTest || !isMultiline || isMetaOrCtrl))
|
| + return 'commit';
|
| + else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code || event.key === 'Escape')
|
| + return 'cancel';
|
| + else if (!isMultiline && event.key === 'Tab')
|
| + return 'move-' + (event.shiftKey ? 'backward' : 'forward');
|
| + return '';
|
| + }
|
| +
|
| + function handleEditingResult(result, event) {
|
| + if (result === 'commit') {
|
| + editingCommitted.call(element);
|
| + event.consume(true);
|
| + } else if (result === 'cancel') {
|
| + editingCancelled.call(element);
|
| + event.consume(true);
|
| + } else if (result && result.startsWith('move-')) {
|
| + moveDirection = result.substring(5);
|
| + if (event.key !== 'Tab')
|
| + blurEventListener();
|
| + }
|
| + }
|
|
|
| /**
|
| - * @param {!Element} element
|
| - * @param {!WebInspector.InplaceEditor.Config=} config
|
| - * @return {?WebInspector.InplaceEditor.Controller}
|
| + * @param {!Event} event
|
| */
|
| - startEditing: function(element, config)
|
| - {
|
| - if (!WebInspector.markBeingEdited(element, true))
|
| - return null;
|
| -
|
| - config = config || new WebInspector.InplaceEditor.Config(function() {}, function() {});
|
| - var editingContext = { element: element, config: config };
|
| - var committedCallback = config.commitHandler;
|
| - var cancelledCallback = config.cancelHandler;
|
| - var pasteCallback = config.pasteHandler;
|
| - var context = config.context;
|
| - var isMultiline = config.multiline || false;
|
| - var moveDirection = "";
|
| - var self = this;
|
| -
|
| - /**
|
| - * @param {!Event} e
|
| - */
|
| - function consumeCopy(e)
|
| - {
|
| - e.consume();
|
| - }
|
| -
|
| - this.setUpEditor(editingContext);
|
| -
|
| - editingContext.oldText = isMultiline ? config.initialValue : this.editorContent(editingContext);
|
| -
|
| - /**
|
| - * @param {!Event=} e
|
| - */
|
| - function blurEventListener(e) {
|
| - if (config.blurHandler && !config.blurHandler(element, e))
|
| - return;
|
| - if (!isMultiline || !e || !e.relatedTarget || !e.relatedTarget.isSelfOrDescendant(element))
|
| - editingCommitted.call(element);
|
| - }
|
| -
|
| - function cleanUpAfterEditing()
|
| - {
|
| - WebInspector.markBeingEdited(element, false);
|
| -
|
| - element.removeEventListener("blur", blurEventListener, isMultiline);
|
| - element.removeEventListener("keydown", keyDownEventListener, true);
|
| - if (pasteCallback)
|
| - element.removeEventListener("paste", pasteEventListener, true);
|
| -
|
| - if (self._focusRestorer)
|
| - self._focusRestorer.restore();
|
| - self.closeEditor(editingContext);
|
| - }
|
| -
|
| - /** @this {Element} */
|
| - function editingCancelled()
|
| - {
|
| - self.cancelEditing(editingContext);
|
| - cleanUpAfterEditing();
|
| - cancelledCallback(this, context);
|
| - }
|
| -
|
| - /** @this {Element} */
|
| - function editingCommitted()
|
| - {
|
| - cleanUpAfterEditing();
|
| -
|
| - committedCallback(this, self.editorContent(editingContext), editingContext.oldText, context, moveDirection);
|
| - }
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - * @return {string}
|
| - */
|
| - function defaultFinishHandler(event)
|
| - {
|
| - var isMetaOrCtrl = WebInspector.isMac() ?
|
| - event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey :
|
| - event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
|
| - if (isEnterKey(event) && (event.isMetaOrCtrlForTest || !isMultiline || isMetaOrCtrl))
|
| - return "commit";
|
| - else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code || event.key === "Escape")
|
| - return "cancel";
|
| - else if (!isMultiline && event.key === "Tab")
|
| - return "move-" + (event.shiftKey ? "backward" : "forward");
|
| - return "";
|
| - }
|
| -
|
| - function handleEditingResult(result, event)
|
| - {
|
| - if (result === "commit") {
|
| - editingCommitted.call(element);
|
| - event.consume(true);
|
| - } else if (result === "cancel") {
|
| - editingCancelled.call(element);
|
| - event.consume(true);
|
| - } else if (result && result.startsWith("move-")) {
|
| - moveDirection = result.substring(5);
|
| - if (event.key !== "Tab")
|
| - blurEventListener();
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - function pasteEventListener(event)
|
| - {
|
| - var result = pasteCallback(event);
|
| - handleEditingResult(result, event);
|
| - }
|
| -
|
| - /**
|
| - * @param {!Event} event
|
| - */
|
| - function keyDownEventListener(event)
|
| - {
|
| - var result = defaultFinishHandler(event);
|
| - if (!result && config.postKeydownFinishHandler)
|
| - result = config.postKeydownFinishHandler(event);
|
| - handleEditingResult(result, event);
|
| - }
|
| -
|
| - element.addEventListener("blur", blurEventListener, isMultiline);
|
| - element.addEventListener("keydown", keyDownEventListener, true);
|
| - if (pasteCallback)
|
| - element.addEventListener("paste", pasteEventListener, true);
|
| -
|
| - var handle = {
|
| - cancel: editingCancelled.bind(element),
|
| - commit: editingCommitted.bind(element),
|
| - setWidth: function() {}
|
| - };
|
| - this.augmentEditingHandle(editingContext, handle);
|
| - return handle;
|
| + function pasteEventListener(event) {
|
| + var result = pasteCallback(event);
|
| + handleEditingResult(result, event);
|
| }
|
| +
|
| + /**
|
| + * @param {!Event} event
|
| + */
|
| + function keyDownEventListener(event) {
|
| + var result = defaultFinishHandler(event);
|
| + if (!result && config.postKeydownFinishHandler)
|
| + result = config.postKeydownFinishHandler(event);
|
| + handleEditingResult(result, event);
|
| + }
|
| +
|
| + element.addEventListener('blur', blurEventListener, isMultiline);
|
| + element.addEventListener('keydown', keyDownEventListener, true);
|
| + if (pasteCallback)
|
| + element.addEventListener('paste', pasteEventListener, true);
|
| +
|
| + var handle = {cancel: editingCancelled.bind(element), commit: editingCommitted.bind(element), setWidth() {}};
|
| + this.augmentEditingHandle(editingContext, handle);
|
| + return handle;
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {function(!Element,string,string,T,string)} commitHandler
|
| - * @param {function(!Element,T)} cancelHandler
|
| - * @param {T=} context
|
| - * @param {function(!Element,!Event):boolean=} blurHandler
|
| + * @typedef {{cancel: function(), commit: function(), setWidth: function(number)}}
|
| + */
|
| +WebInspector.InplaceEditor.Controller;
|
| +
|
| +
|
| +/**
|
| * @template T
|
| + * @unrestricted
|
| */
|
| -WebInspector.InplaceEditor.Config = function(commitHandler, cancelHandler, context, blurHandler)
|
| -{
|
| +WebInspector.InplaceEditor.Config = class {
|
| + /**
|
| + * @param {function(!Element,string,string,T,string)} commitHandler
|
| + * @param {function(!Element,T)} cancelHandler
|
| + * @param {T=} context
|
| + * @param {function(!Element,!Event):boolean=} blurHandler
|
| + */
|
| + constructor(commitHandler, cancelHandler, context, blurHandler) {
|
| this.commitHandler = commitHandler;
|
| this.cancelHandler = cancelHandler;
|
| this.context = context;
|
| @@ -267,36 +244,32 @@ WebInspector.InplaceEditor.Config = function(commitHandler, cancelHandler, conte
|
| * @type {function(!Event):string|undefined}
|
| */
|
| this.postKeydownFinishHandler;
|
| -};
|
| -
|
| -WebInspector.InplaceEditor.Config.prototype = {
|
| - setPasteHandler: function(pasteHandler)
|
| - {
|
| - this.pasteHandler = pasteHandler;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} initialValue
|
| - * @param {!Object} mode
|
| - * @param {string} theme
|
| - * @param {boolean=} lineWrapping
|
| - * @param {boolean=} smartIndent
|
| - */
|
| - setMultilineOptions: function(initialValue, mode, theme, lineWrapping, smartIndent)
|
| - {
|
| - this.multiline = true;
|
| - this.initialValue = initialValue;
|
| - this.mode = mode;
|
| - this.theme = theme;
|
| - this.lineWrapping = lineWrapping;
|
| - this.smartIndent = smartIndent;
|
| - },
|
| -
|
| - /**
|
| - * @param {function(!Event):string} postKeydownFinishHandler
|
| - */
|
| - setPostKeydownFinishHandler: function(postKeydownFinishHandler)
|
| - {
|
| - this.postKeydownFinishHandler = postKeydownFinishHandler;
|
| - }
|
| + }
|
| +
|
| + setPasteHandler(pasteHandler) {
|
| + this.pasteHandler = pasteHandler;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} initialValue
|
| + * @param {!Object} mode
|
| + * @param {string} theme
|
| + * @param {boolean=} lineWrapping
|
| + * @param {boolean=} smartIndent
|
| + */
|
| + setMultilineOptions(initialValue, mode, theme, lineWrapping, smartIndent) {
|
| + this.multiline = true;
|
| + this.initialValue = initialValue;
|
| + this.mode = mode;
|
| + this.theme = theme;
|
| + this.lineWrapping = lineWrapping;
|
| + this.smartIndent = smartIndent;
|
| + }
|
| +
|
| + /**
|
| + * @param {function(!Event):string} postKeydownFinishHandler
|
| + */
|
| + setPostKeydownFinishHandler(postKeydownFinishHandler) {
|
| + this.postKeydownFinishHandler = postKeydownFinishHandler;
|
| + }
|
| };
|
|
|