Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 47 this._popoverHelper = new UI.PopoverHelper(this._scriptsPanel.element, this. _getPopoverRequest.bind(this)); | 47 this._popoverHelper = new UI.PopoverHelper(this._scriptsPanel.element, this. _getPopoverRequest.bind(this)); |
| 48 this._popoverHelper.setDisableOnClick(true); | 48 this._popoverHelper.setDisableOnClick(true); |
| 49 this._popoverHelper.setTimeout(250, 250); | 49 this._popoverHelper.setTimeout(250, 250); |
| 50 this._popoverHelper.setHasPadding(true); | 50 this._popoverHelper.setHasPadding(true); |
| 51 this._scriptsPanel.element.addEventListener( | 51 this._scriptsPanel.element.addEventListener( |
| 52 'scroll', this._popoverHelper.hidePopover.bind(this._popoverHelper), tru e); | 52 'scroll', this._popoverHelper.hidePopover.bind(this._popoverHelper), tru e); |
| 53 | 53 |
| 54 this.textEditor.element.addEventListener('keydown', this._onKeyDown.bind(thi s), true); | 54 this.textEditor.element.addEventListener('keydown', this._onKeyDown.bind(thi s), true); |
| 55 this.textEditor.element.addEventListener('keyup', this._onKeyUp.bind(this), true); | 55 this.textEditor.element.addEventListener('keyup', this._onKeyUp.bind(this), true); |
| 56 this.textEditor.element.addEventListener('mousemove', this._onMouseMove.bind (this), false); | 56 this.textEditor.element.addEventListener('mousemove', this._onMouseMove.bind (this), false); |
| 57 this.textEditor.element.addEventListener('mousedown', this._onMouseDown.bind (this), true); | |
| 57 if (Runtime.experiments.isEnabled('continueToLocationMarkers')) { | 58 if (Runtime.experiments.isEnabled('continueToLocationMarkers')) { |
| 58 this.textEditor.element.addEventListener('wheel', event => { | 59 this.textEditor.element.addEventListener('wheel', event => { |
| 59 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event)) | 60 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event)) |
| 60 event.preventDefault(); | 61 event.preventDefault(); |
| 61 }, true); | 62 }, true); |
| 62 } | 63 } |
| 63 | 64 |
| 64 this.textEditor.addEventListener( | 65 this.textEditor.addEventListener( |
| 65 SourceFrame.SourcesTextEditor.Events.GutterClick, this._handleGutterClic k.bind(this), this); | 66 SourceFrame.SourcesTextEditor.Events.GutterClick, this._handleGutterClic k.bind(this), this); |
| 66 | 67 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 85 this._scriptFileForDebuggerModel = new Map(); | 86 this._scriptFileForDebuggerModel = new Map(); |
| 86 | 87 |
| 87 Common.moduleSetting('skipStackFramesPattern').addChangeListener(this._showB lackboxInfobarIfNeeded, this); | 88 Common.moduleSetting('skipStackFramesPattern').addChangeListener(this._showB lackboxInfobarIfNeeded, this); |
| 88 Common.moduleSetting('skipContentScripts').addChangeListener(this._showBlack boxInfobarIfNeeded, this); | 89 Common.moduleSetting('skipContentScripts').addChangeListener(this._showBlack boxInfobarIfNeeded, this); |
| 89 | 90 |
| 90 /** @type {!Map.<number, !Element>} */ | 91 /** @type {!Map.<number, !Element>} */ |
| 91 this._valueWidgets = new Map(); | 92 this._valueWidgets = new Map(); |
| 92 this.onBindingChanged(); | 93 this.onBindingChanged(); |
| 93 Bindings.debuggerWorkspaceBinding.addEventListener( | 94 Bindings.debuggerWorkspaceBinding.addEventListener( |
| 94 Bindings.DebuggerWorkspaceBinding.Events.SourceMappingChanged, this._onS ourceMappingChanged, this); | 95 Bindings.DebuggerWorkspaceBinding.Events.SourceMappingChanged, this._onS ourceMappingChanged, this); |
| 96 /** @type {?Map<!Object, !Function>} */ | |
| 97 this._continueToLocationDecorations = null; | |
| 95 } | 98 } |
| 96 | 99 |
| 97 /** | 100 /** |
| 98 * @override | 101 * @override |
| 99 * @return {!Array<!UI.ToolbarItem>} | 102 * @return {!Array<!UI.ToolbarItem>} |
| 100 */ | 103 */ |
| 101 syncToolbarItems() { | 104 syncToolbarItems() { |
| 102 var result = super.syncToolbarItems(); | 105 var result = super.syncToolbarItems(); |
| 103 var originURL = Bindings.CompilerScriptMapping.uiSourceCodeOrigin(this._debu ggerSourceCode); | 106 var originURL = Bindings.CompilerScriptMapping.uiSourceCodeOrigin(this._debu ggerSourceCode); |
| 104 if (originURL) { | 107 if (originURL) { |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 375 | 378 |
| 376 /** | 379 /** |
| 377 * @param {string} tokenType | 380 * @param {string} tokenType |
| 378 * @return {boolean} | 381 * @return {boolean} |
| 379 */ | 382 */ |
| 380 _isIdentifier(tokenType) { | 383 _isIdentifier(tokenType) { |
| 381 return tokenType.startsWith('js-variable') || tokenType.startsWith('js-prope rty') || tokenType === 'js-def'; | 384 return tokenType.startsWith('js-variable') || tokenType.startsWith('js-prope rty') || tokenType === 'js-def'; |
| 382 } | 385 } |
| 383 | 386 |
| 384 /** | 387 /** |
| 385 * @param {!Event} event | 388 * @param {!MouseEvent} event |
| 386 * @return {?UI.PopoverRequest} | 389 * @return {?UI.PopoverRequest} |
| 387 */ | 390 */ |
| 388 _getPopoverRequest(event) { | 391 _getPopoverRequest(event) { |
| 392 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event)) | |
| 393 return null; | |
| 389 var target = UI.context.flavor(SDK.Target); | 394 var target = UI.context.flavor(SDK.Target); |
| 390 var debuggerModel = target ? target.model(SDK.DebuggerModel) : null; | 395 var debuggerModel = target ? target.model(SDK.DebuggerModel) : null; |
| 391 if (!debuggerModel || !debuggerModel.isPaused()) | 396 if (!debuggerModel || !debuggerModel.isPaused()) |
| 392 return null; | 397 return null; |
| 393 | 398 |
| 394 var textPosition = this.textEditor.coordinatesToCursorPosition(event.x, even t.y); | 399 var textPosition = this.textEditor.coordinatesToCursorPosition(event.x, even t.y); |
| 395 if (!textPosition) | 400 if (!textPosition) |
| 396 return null; | 401 return null; |
| 397 | 402 |
| 398 var mouseLine = textPosition.startLine; | 403 var mouseLine = textPosition.startLine; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 481 */ | 486 */ |
| 482 _onKeyDown(event) { | 487 _onKeyDown(event) { |
| 483 if (event.key === 'Escape') { | 488 if (event.key === 'Escape') { |
| 484 if (this._popoverHelper.isPopoverVisible()) { | 489 if (this._popoverHelper.isPopoverVisible()) { |
| 485 this._popoverHelper.hidePopover(); | 490 this._popoverHelper.hidePopover(); |
| 486 event.consume(); | 491 event.consume(); |
| 487 } | 492 } |
| 488 return; | 493 return; |
| 489 } | 494 } |
| 490 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event) && this._executionLocation ) { | 495 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event) && this._executionLocation ) { |
| 491 if (!this._continueToLocationShown) { | 496 if (!this._continueToLocationDecorations) |
| 492 this._showContinueToLocations(); | 497 this._showContinueToLocations(); |
| 493 this._continueToLocationShown = true; | |
| 494 } | |
| 495 } | 498 } |
| 496 } | 499 } |
| 497 | 500 |
| 498 /** | 501 /** |
| 499 * @param {!MouseEvent} event | 502 * @param {!MouseEvent} event |
| 500 */ | 503 */ |
| 501 _onMouseMove(event) { | 504 _onMouseMove(event) { |
| 502 if (this._executionLocation && UI.KeyboardShortcut.eventHasCtrlOrMeta(event) ) { | 505 if (this._executionLocation && UI.KeyboardShortcut.eventHasCtrlOrMeta(event) ) { |
| 503 if (!this._continueToLocationShown) { | 506 if (!this._continueToLocationDecorations) |
| 504 this._showContinueToLocations(); | 507 this._showContinueToLocations(); |
| 505 this._continueToLocationShown = true; | |
| 506 } | |
| 507 return; | |
| 508 } | 508 } |
| 509 } | 509 } |
| 510 | 510 |
| 511 /** | |
| 512 * @param {!MouseEvent} event | |
| 513 */ | |
| 514 _onMouseDown(event) { | |
| 515 if (!this._executionLocation || !UI.KeyboardShortcut.eventHasCtrlOrMeta(even t)) | |
| 516 return; | |
| 517 if (!this._continueToLocationDecorations) | |
| 518 return; | |
| 519 event.consume(); | |
| 520 var textPosition = this.textEditor.coordinatesToCursorPosition(event.x, even t.y); | |
| 521 if (!textPosition) | |
| 522 return; | |
| 523 for (var decoration of this._continueToLocationDecorations.keys()) { | |
| 524 var range = decoration.find(); | |
| 525 if (range.from.line !== textPosition.startLine || range.to.line !== textPo sition.startLine) | |
| 526 continue; | |
| 527 if (range.from.ch <= textPosition.startColumn && textPosition.startColumn <= range.to.ch) { | |
| 528 this._continueToLocationDecorations.get(decoration)(); | |
| 529 break; | |
| 530 } | |
| 531 } | |
| 532 } | |
| 533 | |
| 511 /** | 534 /** |
| 512 * @param {!KeyboardEvent} event | 535 * @param {!KeyboardEvent} event |
| 513 */ | 536 */ |
| 514 _onKeyUp(event) { | 537 _onKeyUp(event) { |
| 515 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event)) | 538 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event)) |
| 516 return; | 539 return; |
| 517 if (!this._continueToLocationShown) | |
| 518 return; | |
| 519 this._clearContinueToLocations(); | 540 this._clearContinueToLocations(); |
| 520 this._continueToLocationShown = false; | |
| 521 } | 541 } |
| 522 | 542 |
| 523 /** | 543 /** |
| 524 * @param {number} lineNumber | 544 * @param {number} lineNumber |
| 525 * @param {?Bindings.BreakpointManager.Breakpoint} breakpoint | 545 * @param {?Bindings.BreakpointManager.Breakpoint} breakpoint |
| 526 * @param {?{lineNumber: number, columnNumber: number}} location | 546 * @param {?{lineNumber: number, columnNumber: number}} location |
| 527 */ | 547 */ |
| 528 _editBreakpointCondition(lineNumber, breakpoint, location) { | 548 _editBreakpointCondition(lineNumber, breakpoint, location) { |
| 529 this._conditionElement = this._createConditionElement(lineNumber); | 549 this._conditionElement = this._createConditionElement(lineNumber); |
| 530 this.textEditor.addDecoration(this._conditionElement, lineNumber); | 550 this.textEditor.addDecoration(this._conditionElement, lineNumber); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 576 this._executionLocation = uiLocation; | 596 this._executionLocation = uiLocation; |
| 577 if (!this.loaded) | 597 if (!this.loaded) |
| 578 return; | 598 return; |
| 579 | 599 |
| 580 this.textEditor.setExecutionLocation(uiLocation.lineNumber, uiLocation.colum nNumber); | 600 this.textEditor.setExecutionLocation(uiLocation.lineNumber, uiLocation.colum nNumber); |
| 581 if (this.isShowing()) { | 601 if (this.isShowing()) { |
| 582 // We need SourcesTextEditor to be initialized prior to this call. @see cr bug.com/506566 | 602 // We need SourcesTextEditor to be initialized prior to this call. @see cr bug.com/506566 |
| 583 setImmediate(() => { | 603 setImmediate(() => { |
| 584 this._generateValuesInSource(); | 604 this._generateValuesInSource(); |
| 585 if (Runtime.experiments.isEnabled('continueToLocationMarkers')) { | 605 if (Runtime.experiments.isEnabled('continueToLocationMarkers')) { |
| 586 if (this._continueToLocationShown) | 606 if (this._continueToLocationDecorations) |
| 587 this._showContinueToLocations(); | 607 this._showContinueToLocations(); |
| 588 } | 608 } |
| 589 }); | 609 }); |
| 590 } | 610 } |
| 591 } | 611 } |
| 592 | 612 |
| 593 _generateValuesInSource() { | 613 _generateValuesInSource() { |
| 594 if (!Common.moduleSetting('inlineVariableValues').get()) | 614 if (!Common.moduleSetting('inlineVariableValues').get()) |
| 595 return; | 615 return; |
| 596 var executionContext = UI.context.flavor(SDK.ExecutionContext); | 616 var executionContext = UI.context.flavor(SDK.ExecutionContext); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 609 | 629 |
| 610 if (this._clearValueWidgetsTimer) { | 630 if (this._clearValueWidgetsTimer) { |
| 611 clearTimeout(this._clearValueWidgetsTimer); | 631 clearTimeout(this._clearValueWidgetsTimer); |
| 612 delete this._clearValueWidgetsTimer; | 632 delete this._clearValueWidgetsTimer; |
| 613 } | 633 } |
| 614 } | 634 } |
| 615 | 635 |
| 616 _showContinueToLocations() { | 636 _showContinueToLocations() { |
| 617 if (!Runtime.experiments.isEnabled('continueToLocationMarkers')) | 637 if (!Runtime.experiments.isEnabled('continueToLocationMarkers')) |
| 618 return; | 638 return; |
| 639 this._popoverHelper.hidePopover(); | |
| 619 var executionContext = UI.context.flavor(SDK.ExecutionContext); | 640 var executionContext = UI.context.flavor(SDK.ExecutionContext); |
| 620 if (!executionContext) | 641 if (!executionContext) |
| 621 return; | 642 return; |
| 622 var callFrame = UI.context.flavor(SDK.DebuggerModel.CallFrame); | 643 var callFrame = UI.context.flavor(SDK.DebuggerModel.CallFrame); |
| 623 if (!callFrame) | 644 if (!callFrame) |
| 624 return; | 645 return; |
| 625 if (this._clearContinueToLocationsTimer) { | |
| 626 clearTimeout(this._clearContinueToLocationsTimer); | |
| 627 delete this._clearContinueToLocationsTimer; | |
| 628 } | |
| 629 var localScope = callFrame.localScope(); | 646 var localScope = callFrame.localScope(); |
| 630 if (!localScope) { | 647 if (!localScope) { |
| 631 this.textEditor.operation(clearExistingLocations.bind(this)); | 648 this._clearContinueToLocations(); |
| 632 return; | 649 return; |
| 633 } | 650 } |
| 634 var start = localScope.startLocation(); | 651 var start = localScope.startLocation(); |
| 635 var end = localScope.endLocation(); | 652 var end = localScope.endLocation(); |
| 636 var debuggerModel = callFrame.debuggerModel; | 653 var debuggerModel = callFrame.debuggerModel; |
| 637 var executionLocation = callFrame.location(); | |
| 638 debuggerModel.getPossibleBreakpoints(start, end, true) | 654 debuggerModel.getPossibleBreakpoints(start, end, true) |
| 639 .then(locations => this.textEditor.operation(renderLocations.bind(this, locations))); | 655 .then(locations => this.textEditor.operation(renderLocations.bind(this, locations))); |
| 656 | |
| 640 /** | 657 /** |
| 641 * @param {!Array<!SDK.DebuggerModel.BreakLocation>} locations | 658 * @param {!Array<!SDK.DebuggerModel.BreakLocation>} locations |
| 642 * @this {Sources.JavaScriptSourceFrame} | 659 * @this {Sources.JavaScriptSourceFrame} |
| 643 */ | 660 */ |
| 644 function renderLocations(locations) { | 661 function renderLocations(locations) { |
| 645 clearExistingLocations.call(this); | 662 this._clearContinueToLocations(); |
| 663 this._continueToLocationDecorations = new Map(); | |
| 646 for (var location of locations) { | 664 for (var location of locations) { |
| 647 var icon; | 665 var lineNumber = location.lineNumber; |
| 648 var isCurrent = location.lineNumber === executionLocation.lineNumber && | 666 var token = this.textEditor.tokenAtTextPosition(lineNumber, location.col umnNumber); |
| 649 location.columnNumber === executionLocation.columnNumber; | 667 if (!token || !token.type) |
| 650 if (!isCurrent || (location.type !== SDK.DebuggerModel.BreakLocationType .Call && | 668 continue; |
| 651 location.type !== SDK.DebuggerModel.BreakLocationType .Return)) { | 669 var line = this.textEditor.line(lineNumber); |
| 652 icon = UI.Icon.create('smallicon-green-arrow'); | 670 var tokenContent = line.substring(token.startColumn, token.endColumn); |
| 653 icon.addEventListener('click', location.continueToLocation.bind(locati on)); | 671 if (!this._isIdentifier(token.type) && (token.type !== 'js-keyword' || t okenContent !== 'this')) |
| 654 } else if (location.type === SDK.DebuggerModel.BreakLocationType.Call) { | 672 continue; |
| 655 icon = UI.Icon.create('smallicon-step-in'); | 673 |
| 656 icon.addEventListener('click', () => { | 674 var highlightRange = new TextUtils.TextRange(lineNumber, token.startColu mn, lineNumber, token.endColumn - 1); |
| 657 debuggerModel.scheduleStepIntoAsync(); | 675 var decoration = this.textEditor.highlightRange(highlightRange, 'source- frame-continue-to-location'); |
| 658 debuggerModel.stepInto(); | 676 this._continueToLocationDecorations.set(decoration, location.continueToL ocation.bind(location)); |
| 659 }); | |
| 660 } else if (location.type === SDK.DebuggerModel.BreakLocationType.Return) { | |
| 661 icon = UI.Icon.create('smallicon-step-out'); | |
| 662 icon.addEventListener('click', () => { | |
| 663 debuggerModel.stepOut(); | |
| 664 }); | |
| 665 } | |
| 666 icon.classList.add('cm-continue-to-location'); | |
| 667 icon.addEventListener('mousemove', hidePopoverAndConsumeEvent.bind(this) ); | |
| 668 this.textEditor.addBookmark( | |
| 669 location.lineNumber, location.columnNumber, icon, | |
| 670 Sources.JavaScriptSourceFrame.continueToLocationDecorationSymbol); | |
| 671 } | 677 } |
| 672 } | 678 } |
| 673 | |
| 674 /** | |
| 675 * @this {Sources.JavaScriptSourceFrame} | |
| 676 */ | |
| 677 function clearExistingLocations() { | |
| 678 var bookmarks = this.textEditor.bookmarks( | |
| 679 this.textEditor.fullRange(), Sources.JavaScriptSourceFrame.continueToL ocationDecorationSymbol); | |
| 680 bookmarks.map(bookmark => bookmark.clear()); | |
| 681 } | |
| 682 | |
| 683 /** | |
| 684 * @param {!Event} event | |
| 685 * @this {Sources.JavaScriptSourceFrame} | |
| 686 */ | |
| 687 function hidePopoverAndConsumeEvent(event) { | |
| 688 event.consume(true); | |
| 689 this._popoverHelper.hidePopover(); | |
| 690 } | |
| 691 } | 679 } |
| 692 | 680 |
| 693 /** | 681 /** |
| 694 * @param {!SDK.DebuggerModel.CallFrame} callFrame | 682 * @param {!SDK.DebuggerModel.CallFrame} callFrame |
| 695 * @param {?Array.<!SDK.RemoteObjectProperty>} properties | 683 * @param {?Array.<!SDK.RemoteObjectProperty>} properties |
| 696 * @param {?Array.<!SDK.RemoteObjectProperty>} internalProperties | 684 * @param {?Array.<!SDK.RemoteObjectProperty>} internalProperties |
| 697 */ | 685 */ |
| 698 _prepareScopeVariables(callFrame, properties, internalProperties) { | 686 _prepareScopeVariables(callFrame, properties, internalProperties) { |
| 699 if (!properties || !properties.length || properties.length > 500 || !this.is Showing()) { | 687 if (!properties || !properties.length || properties.length > 500 || !this.is Showing()) { |
| 700 this._clearValueWidgets(); | 688 this._clearValueWidgets(); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 827 } | 815 } |
| 828 } | 816 } |
| 829 if (widgetChanged) { | 817 if (widgetChanged) { |
| 830 this._valueWidgets.set(i, widget); | 818 this._valueWidgets.set(i, widget); |
| 831 this.textEditor.addDecoration(widget, i); | 819 this.textEditor.addDecoration(widget, i); |
| 832 } | 820 } |
| 833 } | 821 } |
| 834 } | 822 } |
| 835 | 823 |
| 836 clearExecutionLine() { | 824 clearExecutionLine() { |
| 837 if (this.loaded && this._executionLocation) | 825 this.textEditor.operation(() => { |
| 838 this.textEditor.clearExecutionLine(); | 826 if (this.loaded && this._executionLocation) |
| 839 delete this._executionLocation; | 827 this.textEditor.clearExecutionLine(); |
| 840 this._clearValueWidgetsTimer = setTimeout(this._clearValueWidgets.bind(this) , 1000); | 828 delete this._executionLocation; |
| 841 if (Runtime.experiments.isEnabled('continueToLocationMarkers')) | 829 this._clearValueWidgetsTimer = setTimeout(this._clearValueWidgets.bind(thi s), 1000); |
|
dgozman
2017/04/26 16:04:58
I feel like we should do similar things for all de
pfeldman
2017/04/27 21:05:05
Sure. textEditor operation is a good-enough tool t
| |
| 842 this._clearContinueToLocationsTimer = setTimeout(this._clearContinueToLoca tions.bind(this), 1000); | 830 this._clearContinueToLocations(); |
|
dgozman
2017/04/26 16:04:58
This is a nested operation. That's ok?
pfeldman
2017/04/27 21:05:05
Yes
| |
| 831 }); | |
| 843 } | 832 } |
| 844 | 833 |
| 845 _clearValueWidgets() { | 834 _clearValueWidgets() { |
| 846 delete this._clearValueWidgetsTimer; | 835 delete this._clearValueWidgetsTimer; |
| 847 for (var line of this._valueWidgets.keys()) | 836 this.textEditor.operation(() => { |
| 848 this.textEditor.removeDecoration(this._valueWidgets.get(line), line); | 837 for (var line of this._valueWidgets.keys()) |
| 849 this._valueWidgets.clear(); | 838 this.textEditor.removeDecoration(this._valueWidgets.get(line), line); |
| 839 this._valueWidgets.clear(); | |
| 840 }); | |
| 850 } | 841 } |
| 851 | 842 |
| 852 _clearContinueToLocations() { | 843 _clearContinueToLocations() { |
| 853 if (!Runtime.experiments.isEnabled('continueToLocationMarkers')) | 844 if (!this._continueToLocationDecorations) |
| 854 return; | 845 return; |
| 855 delete this._clearContinueToLocationsTimer; | 846 this.textEditor.operation(() => { |
| 856 var bookmarks = this.textEditor.bookmarks( | 847 for (var decoration of this._continueToLocationDecorations.keys()) |
| 857 this.textEditor.fullRange(), Sources.JavaScriptSourceFrame.continueToLoc ationDecorationSymbol); | 848 this.textEditor.removeHighlight(decoration); |
| 858 this.textEditor.operation(() => bookmarks.map(bookmark => bookmark.clear())) ; | 849 delete this._continueToLocationDecorations; |
| 850 }); | |
| 859 } | 851 } |
| 860 | 852 |
| 861 /** | 853 /** |
| 862 * @param {number} lineNumber | 854 * @param {number} lineNumber |
| 863 * @return {!Array<!Sources.JavaScriptSourceFrame.BreakpointDecoration>} | 855 * @return {!Array<!Sources.JavaScriptSourceFrame.BreakpointDecoration>} |
| 864 */ | 856 */ |
| 865 _lineBreakpointDecorations(lineNumber) { | 857 _lineBreakpointDecorations(lineNumber) { |
| 866 return Array.from(this._breakpointDecorations) | 858 return Array.from(this._breakpointDecorations) |
| 867 .filter(decoration => (decoration.handle.resolve() || {}).lineNumber === lineNumber); | 859 .filter(decoration => (decoration.handle.resolve() || {}).lineNumber === lineNumber); |
| 868 } | 860 } |
| (...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1488 return; | 1480 return; |
| 1489 this.bookmark.clear(); | 1481 this.bookmark.clear(); |
| 1490 this.bookmark = null; | 1482 this.bookmark = null; |
| 1491 } | 1483 } |
| 1492 }; | 1484 }; |
| 1493 | 1485 |
| 1494 Sources.JavaScriptSourceFrame.BreakpointDecoration.bookmarkSymbol = Symbol('book mark'); | 1486 Sources.JavaScriptSourceFrame.BreakpointDecoration.bookmarkSymbol = Symbol('book mark'); |
| 1495 Sources.JavaScriptSourceFrame.BreakpointDecoration._elementSymbolForTest = Symbo l('element'); | 1487 Sources.JavaScriptSourceFrame.BreakpointDecoration._elementSymbolForTest = Symbo l('element'); |
| 1496 | 1488 |
| 1497 Sources.JavaScriptSourceFrame.continueToLocationDecorationSymbol = Symbol('bookm ark'); | 1489 Sources.JavaScriptSourceFrame.continueToLocationDecorationSymbol = Symbol('bookm ark'); |
| OLD | NEW |