|  | /* | 
|  | * Copyright 2018 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. | 
|  | */ | 
|  |  | 
|  | Sources.BreakpointEditDialog = class extends UI.Widget { | 
|  | /** | 
|  | * @param {number} editorLineNumber | 
|  | * @param {string} oldCondition | 
|  | * @param {boolean} preferLogpoint | 
|  | * @param {function({committed: boolean, condition: string})} onFinish | 
|  | */ | 
|  | constructor(editorLineNumber, oldCondition, preferLogpoint, onFinish) { | 
|  | super(true); | 
|  | this.registerRequiredCSS('sources/breakpointEditDialog.css'); | 
|  | this._onFinish = onFinish; | 
|  | this._finished = false; | 
|  | /** @type {?UI.TextEditor} */ | 
|  | this._editor = null; | 
|  | this.element.tabIndex = -1; | 
|  |  | 
|  | const logpointPrefix = Sources.BreakpointEditDialog.LogpointPrefix; | 
|  | const logpointSuffix = Sources.BreakpointEditDialog._LogpointSuffix; | 
|  | this._isLogpoint = oldCondition.startsWith(logpointPrefix) && oldCondition.endsWith(logpointSuffix); | 
|  | if (this._isLogpoint) { | 
|  | oldCondition = oldCondition.substring(logpointPrefix.length, oldCondition.length - logpointSuffix.length); | 
|  | } | 
|  | this._isLogpoint = this._isLogpoint || preferLogpoint; | 
|  |  | 
|  | this.element.classList.add('sources-edit-breakpoint-dialog'); | 
|  | const toolbar = new UI.Toolbar('source-frame-breakpoint-toolbar', this.contentElement); | 
|  | toolbar.appendText(`Line ${editorLineNumber + 1}:`); | 
|  |  | 
|  | this._typeSelector = new UI.ToolbarComboBox(this._onTypeChanged.bind(this), ls`Breakpoint type`); | 
|  | this._typeSelector.createOption(ls`Breakpoint`, Sources.BreakpointEditDialog.BreakpointType.Breakpoint); | 
|  | const conditionalOption = this._typeSelector.createOption( | 
|  | ls`Conditional breakpoint`, Sources.BreakpointEditDialog.BreakpointType.Conditional); | 
|  | const logpointOption = | 
|  | this._typeSelector.createOption(ls`Logpoint`, Sources.BreakpointEditDialog.BreakpointType.Logpoint); | 
|  | this._typeSelector.select(this._isLogpoint ? logpointOption : conditionalOption); | 
|  | toolbar.appendToolbarItem(this._typeSelector); | 
|  |  | 
|  | self.runtime.extension(UI.TextEditorFactory).instance().then(factory => { | 
|  | const editorOptions = {lineNumbers: false, lineWrapping: true, mimeType: 'javascript', autoHeight: true}; | 
|  | this._editor = factory.createEditor(editorOptions); | 
|  | this._updatePlaceholder(); | 
|  | this._editor.widget().element.classList.add('condition-editor'); | 
|  | this._editor.configureAutocomplete(ObjectUI.JavaScriptAutocompleteConfig.createConfigForEditor(this._editor)); | 
|  | if (oldCondition) { | 
|  | this._editor.setText(oldCondition); | 
|  | } | 
|  | this._editor.widget().markAsExternallyManaged(); | 
|  | this._editor.widget().show(this.contentElement); | 
|  | this._editor.setSelection(this._editor.fullRange()); | 
|  | this._editor.widget().focus(); | 
|  | this._editor.widget().element.addEventListener('keydown', this._onKeyDown.bind(this), true); | 
|  | this.contentElement.addEventListener('blur', event => { | 
|  | if (event.relatedTarget && !event.relatedTarget.isSelfOrDescendant(this.element)) { | 
|  | this._finishEditing(true); | 
|  | } | 
|  | }, true); | 
|  | }); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @param {string} condition | 
|  | * @return {string} | 
|  | */ | 
|  | static _conditionForLogpoint(condition) { | 
|  | return `${Sources.BreakpointEditDialog.LogpointPrefix}${condition}${Sources.BreakpointEditDialog._LogpointSuffix}`; | 
|  | } | 
|  |  | 
|  | _onTypeChanged() { | 
|  | const value = this._typeSelector.selectedOption().value; | 
|  | this._isLogpoint = value === Sources.BreakpointEditDialog.BreakpointType.Logpoint; | 
|  | this._updatePlaceholder(); | 
|  | if (value === Sources.BreakpointEditDialog.BreakpointType.Breakpoint) { | 
|  | this._editor.setText(''); | 
|  | this._finishEditing(true); | 
|  | } | 
|  | } | 
|  |  | 
|  | _updatePlaceholder() { | 
|  | const selectedValue = this._typeSelector.selectedOption().value; | 
|  | if (selectedValue === Sources.BreakpointEditDialog.BreakpointType.Conditional) { | 
|  | this._editor.setPlaceholder(ls`Expression to check before pausing, e.g. x > 5`); | 
|  | this._typeSelector.element.title = ls`Pause only when the condition is true`; | 
|  | } else if (selectedValue === Sources.BreakpointEditDialog.BreakpointType.Logpoint) { | 
|  | this._editor.setPlaceholder(ls`Log message, e.g. 'x is', x`); | 
|  | this._typeSelector.element.title = ls`Log a message to Console, do not break`; | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @param {boolean} committed | 
|  | */ | 
|  | _finishEditing(committed) { | 
|  | if (this._finished) { | 
|  | return; | 
|  | } | 
|  | this._finished = true; | 
|  | this._editor.widget().detach(); | 
|  | let condition = this._editor.text(); | 
|  | if (this._isLogpoint) { | 
|  | condition = Sources.BreakpointEditDialog._conditionForLogpoint(condition); | 
|  | } | 
|  | this._onFinish({committed, condition}); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @param {!Event} event | 
|  | */ | 
|  | async _onKeyDown(event) { | 
|  | if (isEnterKey(event) && !event.shiftKey) { | 
|  | event.consume(true); | 
|  | const expression = this._editor.text(); | 
|  | if (event.ctrlKey || await ObjectUI.JavaScriptAutocomplete.isExpressionComplete(expression)) { | 
|  | this._finishEditing(true); | 
|  | } else { | 
|  | this._editor.newlineAndIndent(); | 
|  | } | 
|  | } | 
|  | if (isEscKey(event)) { | 
|  | this._finishEditing(false); | 
|  | } | 
|  | } | 
|  | }; | 
|  |  | 
|  | Sources.BreakpointEditDialog.LogpointPrefix = '/** DEVTOOLS_LOGPOINT */ console.log('; | 
|  | Sources.BreakpointEditDialog._LogpointSuffix = ')'; | 
|  |  | 
|  | Sources.BreakpointEditDialog.BreakpointType = { | 
|  | Breakpoint: 'Breakpoint', | 
|  | Conditional: 'Conditional', | 
|  | Logpoint: 'Logpoint', | 
|  | }; |