Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js |
| index d20da44ca341d4d5cc66a74dc8b64a51baef8064..4e5d47951cd440592363c47f9e19b46376edf850 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/sources/JavaScriptSourceFrame.js |
| @@ -44,9 +44,7 @@ Sources.JavaScriptSourceFrame = class extends SourceFrame.UISourceCodeFrame { |
| if (uiSourceCode.project().type() === Workspace.projectTypes.Debugger) |
| this.element.classList.add('source-frame-debugger-script'); |
| - this._popoverHelper = new UI.PopoverHelper(this._scriptsPanel.element, true); |
| - this._popoverHelper.initializeCallbacks( |
| - this._getPopoverAnchor.bind(this), this._showObjectPopover.bind(this), this._onHidePopover.bind(this)); |
| + this._popoverHelper = new UI.PopoverHelper(this._scriptsPanel.element, true, this._getPopoverContent.bind(this)); |
| this._popoverHelper.setTimeout(250, 250); |
| this._popoverHelper.setHasPadding(true); |
| this._scriptsPanel.element.addEventListener( |
| @@ -376,150 +374,97 @@ Sources.JavaScriptSourceFrame = class extends SourceFrame.UISourceCodeFrame { |
| return tokenType.startsWith('js-variable') || tokenType.startsWith('js-property') || tokenType === 'js-def'; |
| } |
| - _getPopoverAnchor(element, event) { |
| + /** |
| + * @param {!Event} event |
| + * @return {?UI.PopoverContent} |
| + */ |
| + _getPopoverContent(event) { |
| var target = UI.context.flavor(SDK.Target); |
| var debuggerModel = SDK.DebuggerModel.fromTarget(target); |
| if (!debuggerModel || !debuggerModel.isPaused()) |
| - return; |
| + return null; |
| var textPosition = this.textEditor.coordinatesToCursorPosition(event.x, event.y); |
| if (!textPosition) |
| - return; |
| + return null; |
| + |
| var mouseLine = textPosition.startLine; |
| var mouseColumn = textPosition.startColumn; |
| var textSelection = this.textEditor.selection().normalize(); |
| + var anchorBox; |
| + var lineNumber; |
| + var startHighlight; |
| + var endHighlight; |
| + |
| if (textSelection && !textSelection.isEmpty()) { |
| if (textSelection.startLine !== textSelection.endLine || textSelection.startLine !== mouseLine || |
| mouseColumn < textSelection.startColumn || mouseColumn > textSelection.endColumn) |
| - return; |
| + return null; |
| var leftCorner = this.textEditor.cursorPositionToCoordinates(textSelection.startLine, textSelection.startColumn); |
| var rightCorner = this.textEditor.cursorPositionToCoordinates(textSelection.endLine, textSelection.endColumn); |
| - var anchorBox = new AnchorBox(leftCorner.x, leftCorner.y, rightCorner.x - leftCorner.x, leftCorner.height); |
| - anchorBox.highlight = { |
| - lineNumber: textSelection.startLine, |
| - startColumn: textSelection.startColumn, |
| - endColumn: textSelection.endColumn - 1 |
| - }; |
| - anchorBox.forSelection = true; |
| - return anchorBox; |
| - } |
| - |
| - var token = this.textEditor.tokenAtTextPosition(textPosition.startLine, textPosition.startColumn); |
| - if (!token || !token.type) |
| - return; |
| - var lineNumber = textPosition.startLine; |
| - var line = this.textEditor.line(lineNumber); |
| - var tokenContent = line.substring(token.startColumn, token.endColumn); |
| - |
| - var isIdentifier = this._isIdentifier(token.type); |
| - if (!isIdentifier && (token.type !== 'js-keyword' || tokenContent !== 'this')) |
| - return; |
| - |
| - var leftCorner = this.textEditor.cursorPositionToCoordinates(lineNumber, token.startColumn); |
| - var rightCorner = this.textEditor.cursorPositionToCoordinates(lineNumber, token.endColumn - 1); |
| - var anchorBox = new AnchorBox(leftCorner.x, leftCorner.y, rightCorner.x - leftCorner.x, leftCorner.height); |
| - |
| - anchorBox.highlight = {lineNumber: lineNumber, startColumn: token.startColumn, endColumn: token.endColumn - 1}; |
| - |
| - return anchorBox; |
| - } |
| - |
| - /** |
| - * @param {!AnchorBox} anchorBox |
| - * @return {!Promise<?SDK.RemoteObject>} |
| - */ |
| - _resolveObjectForPopover(anchorBox) { |
| - var selectedCallFrame = UI.context.flavor(SDK.DebuggerModel.CallFrame); |
| - if (!selectedCallFrame) |
| - return Promise.resolve(/** @type {?SDK.RemoteObject} */ (null)); |
| - var lineNumber = anchorBox.highlight.lineNumber; |
| - var startHighlight = anchorBox.highlight.startColumn; |
| - var endHighlight = anchorBox.highlight.endColumn; |
| - var line = this.textEditor.line(lineNumber); |
| - if (!anchorBox.forSelection) { |
| + anchorBox = new AnchorBox(leftCorner.x, leftCorner.y, rightCorner.x - leftCorner.x, leftCorner.height); |
| + lineNumber = textSelection.startLine; |
| + startHighlight = textSelection.startColumn; |
| + endHighlight = textSelection.endColumn - 1; |
| + } else { |
| + var token = this.textEditor.tokenAtTextPosition(textPosition.startLine, textPosition.startColumn); |
| + if (!token || !token.type) |
| + return null; |
| + lineNumber = textPosition.startLine; |
| + var line = this.textEditor.line(lineNumber); |
| + var tokenContent = line.substring(token.startColumn, token.endColumn); |
| + |
| + var isIdentifier = this._isIdentifier(token.type); |
| + if (!isIdentifier && (token.type !== 'js-keyword' || tokenContent !== 'this')) |
| + return null; |
| + |
| + var leftCorner = this.textEditor.cursorPositionToCoordinates(lineNumber, token.startColumn); |
| + var rightCorner = this.textEditor.cursorPositionToCoordinates(lineNumber, token.endColumn - 1); |
| + anchorBox = new AnchorBox(leftCorner.x, leftCorner.y, rightCorner.x - leftCorner.x, leftCorner.height); |
| + |
| + startHighlight = token.startColumn; |
| + endHighlight = token.endColumn - 1; |
| while (startHighlight > 1 && line.charAt(startHighlight - 1) === '.') { |
| - var token = this.textEditor.tokenAtTextPosition(lineNumber, startHighlight - 2); |
| - if (!token || !token.type) |
| - return Promise.resolve(/** @type {?SDK.RemoteObject} */ (null)); |
| - startHighlight = token.startColumn; |
| + var tokenBefore = this.textEditor.tokenAtTextPosition(lineNumber, startHighlight - 2); |
| + if (!tokenBefore || !tokenBefore.type) |
| + return null; |
| + startHighlight = tokenBefore.startColumn; |
| } |
| } |
| - var evaluationText = line.substring(startHighlight, endHighlight + 1); |
| - return Sources.SourceMapNamesResolver |
| - .resolveExpression( |
| - selectedCallFrame, evaluationText, this._debuggerSourceCode, lineNumber, startHighlight, endHighlight) |
| - .then(onResolve.bind(this)); |
| - |
| - /** |
| - * @param {?string=} text |
| - * @return {!Promise<?SDK.RemoteObject>} |
| - * @this {Sources.JavaScriptSourceFrame} |
| - */ |
| - function onResolve(text) { |
| - var fulfill; |
| - var promise = new Promise(x => fulfill = x); |
| - selectedCallFrame.evaluate( |
| - text || evaluationText, 'popover', false, true, false, false, showObjectPopover.bind(this, fulfill)); |
| - return promise; |
| - } |
| - /** |
| - * @param {function(?SDK.RemoteObject)} fulfill |
| - * @param {?Protocol.Runtime.RemoteObject} result |
| - * @param {!Protocol.Runtime.ExceptionDetails=} exceptionDetails |
| - * @this {Sources.JavaScriptSourceFrame} |
| - */ |
| - function showObjectPopover(fulfill, result, exceptionDetails) { |
| - var target = UI.context.flavor(SDK.Target); |
| - var potentiallyUpdatedCallFrame = UI.context.flavor(SDK.DebuggerModel.CallFrame); |
| - if (selectedCallFrame !== potentiallyUpdatedCallFrame || !result || exceptionDetails) { |
| - fulfill(null); |
| - return; |
| - } |
| - this._popoverAnchorBox = anchorBox; |
| - this._popoverTarget = target; |
| - var highlightRange = new Common.TextRange(lineNumber, startHighlight, lineNumber, endHighlight); |
| - this._popoverAnchorBox._highlightDescriptor = |
| - this.textEditor.highlightRange(highlightRange, 'source-frame-eval-expression'); |
| - fulfill(target.runtimeModel.createRemoteObject(result)); |
| - } |
| - } |
| + var objectPopoverHelper; |
| + var highlightDescriptor; |
| - /** |
| - * @param {!AnchorBox|!Element} anchorBox |
| - * @param {!UI.GlassPane} popover |
| - * @return {!Promise<boolean>} |
| - */ |
| - _showObjectPopover(anchorBox, popover) { |
| - return this._resolveObjectForPopover(/** @type {!AnchorBox} */ (anchorBox)).then(object => { |
| - if (!object) |
| - return false; |
| - return ObjectUI.ObjectPopoverHelper.buildObjectPopover(object, popover).then(objectPopoverHelper => { |
| - if (!objectPopoverHelper) { |
| - this._onHidePopover(); // Cleanup artifacts from _resolveObjectForPopover. |
| + return { |
| + box: anchorBox, |
| + show: async popover => { |
| + var selectedCallFrame = UI.context.flavor(SDK.DebuggerModel.CallFrame); |
| + if (!selectedCallFrame) |
| + return false; |
| + var evaluationText = this.textEditor.line(lineNumber).substring(startHighlight, endHighlight + 1); |
| + var resolvedText = await Sources.SourceMapNamesResolver.resolveExpression( |
| + selectedCallFrame, evaluationText, this._debuggerSourceCode, lineNumber, startHighlight, endHighlight); |
| + var remoteObject = await selectedCallFrame.evaluatePromise( |
| + resolvedText || evaluationText, 'popover', false, true, false, false); |
| + if (!remoteObject) |
| + return false; |
| + objectPopoverHelper = await ObjectUI.ObjectPopoverHelper.buildObjectPopover(remoteObject, popover); |
| + var potentiallyUpdatedCallFrame = UI.context.flavor(SDK.DebuggerModel.CallFrame); |
| + if (!objectPopoverHelper || selectedCallFrame !== potentiallyUpdatedCallFrame) { |
| + target.runtimeModel.releaseObjectGroup('popover'); |
|
lushnikov
2017/03/14 01:44:04
objectPopoverHelper.dispose();
dgozman
2017/03/14 21:34:01
Done.
|
| return false; |
| } |
| - this._objectPopoverHelper = objectPopoverHelper; |
| + var highlightRange = new Common.TextRange(lineNumber, startHighlight, lineNumber, endHighlight); |
| + highlightDescriptor = this.textEditor.highlightRange(highlightRange, 'source-frame-eval-expression'); |
| return true; |
| - }); |
| - }); |
| - } |
| - |
| - _onHidePopover() { |
| - if (this._objectPopoverHelper) { |
| - this._objectPopoverHelper.dispose(); |
| - delete this._objectPopoverHelper; |
| - } |
| - if (this._popoverTarget) { |
| - this._popoverTarget.runtimeModel.releaseObjectGroup('popover'); |
| - delete this._popoverTarget; |
| - } |
| - if (this._popoverAnchorBox) { |
| - if (this._popoverAnchorBox._highlightDescriptor) |
| - this.textEditor.removeHighlight(this._popoverAnchorBox._highlightDescriptor); |
| - delete this._popoverAnchorBox; |
| - } |
| + }, |
| + hide: () => { |
| + objectPopoverHelper.dispose(); |
| + target.runtimeModel.releaseObjectGroup('popover'); |
| + this.textEditor.removeHighlight(highlightDescriptor); |
| + } |
| + }; |
| } |
| _onKeyDown(event) { |