| 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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 this.textEditor.element.addEventListener('mousedown', this._onMouseDown.bind
(this), true); |
| 58 this.textEditor.element.addEventListener('focusout', this._onBlur.bind(this)
, false); |
| 58 if (Runtime.experiments.isEnabled('continueToLocationMarkers')) { | 59 if (Runtime.experiments.isEnabled('continueToLocationMarkers')) { |
| 59 this.textEditor.element.addEventListener('wheel', event => { | 60 this.textEditor.element.addEventListener('wheel', event => { |
| 60 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event)) | 61 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event)) |
| 61 event.preventDefault(); | 62 event.preventDefault(); |
| 62 }, true); | 63 }, true); |
| 63 } | 64 } |
| 64 | 65 |
| 65 this.textEditor.addEventListener( | 66 this.textEditor.addEventListener( |
| 66 SourceFrame.SourcesTextEditor.Events.GutterClick, this._handleGutterClic
k.bind(this), this); | 67 SourceFrame.SourcesTextEditor.Events.GutterClick, this._handleGutterClic
k.bind(this), this); |
| 67 | 68 |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 debuggerModel.runtimeModel().releaseObjectGroup('popover'); | 479 debuggerModel.runtimeModel().releaseObjectGroup('popover'); |
| 479 this.textEditor.removeHighlight(highlightDescriptor); | 480 this.textEditor.removeHighlight(highlightDescriptor); |
| 480 } | 481 } |
| 481 }; | 482 }; |
| 482 } | 483 } |
| 483 | 484 |
| 484 /** | 485 /** |
| 485 * @param {!KeyboardEvent} event | 486 * @param {!KeyboardEvent} event |
| 486 */ | 487 */ |
| 487 _onKeyDown(event) { | 488 _onKeyDown(event) { |
| 489 this._clearControlDown(); |
| 490 |
| 488 if (event.key === 'Escape') { | 491 if (event.key === 'Escape') { |
| 489 if (this._popoverHelper.isPopoverVisible()) { | 492 if (this._popoverHelper.isPopoverVisible()) { |
| 490 this._popoverHelper.hidePopover(); | 493 this._popoverHelper.hidePopover(); |
| 491 event.consume(); | 494 event.consume(); |
| 492 } | 495 } |
| 493 return; | 496 return; |
| 494 } | 497 } |
| 498 |
| 495 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event) && this._executionLocation
) { | 499 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event) && this._executionLocation
) { |
| 496 if (!this._continueToLocationDecorations) | 500 this._controlDown = true; |
| 497 this._showContinueToLocations(); | 501 if (event.key === UI.KeyboardShortcut.Keys.CtrlOrMeta.name) { |
| 502 this._controlTimeout = setTimeout(() => { |
| 503 if (this._executionLocation && this._controlDown) |
| 504 this._showContinueToLocations(); |
| 505 }, 150); |
| 506 } |
| 498 } | 507 } |
| 499 } | 508 } |
| 500 | 509 |
| 501 /** | 510 /** |
| 502 * @param {!MouseEvent} event | 511 * @param {!MouseEvent} event |
| 503 */ | 512 */ |
| 504 _onMouseMove(event) { | 513 _onMouseMove(event) { |
| 505 if (this._executionLocation && UI.KeyboardShortcut.eventHasCtrlOrMeta(event)
) { | 514 if (this._executionLocation && this._controlDown && UI.KeyboardShortcut.even
tHasCtrlOrMeta(event)) { |
| 506 if (!this._continueToLocationDecorations) | 515 if (!this._continueToLocationDecorations) |
| 507 this._showContinueToLocations(); | 516 this._showContinueToLocations(); |
| 508 } | 517 } |
| 509 } | 518 } |
| 510 | 519 |
| 511 /** | 520 /** |
| 512 * @param {!MouseEvent} event | 521 * @param {!MouseEvent} event |
| 513 */ | 522 */ |
| 514 _onMouseDown(event) { | 523 _onMouseDown(event) { |
| 515 if (!this._executionLocation || !UI.KeyboardShortcut.eventHasCtrlOrMeta(even
t)) | 524 if (!this._executionLocation || !UI.KeyboardShortcut.eventHasCtrlOrMeta(even
t)) |
| 516 return; | 525 return; |
| 517 if (!this._continueToLocationDecorations) | 526 if (!this._continueToLocationDecorations) |
| 518 return; | 527 return; |
| 519 event.consume(); | 528 event.consume(); |
| 520 var textPosition = this.textEditor.coordinatesToCursorPosition(event.x, even
t.y); | 529 var textPosition = this.textEditor.coordinatesToCursorPosition(event.x, even
t.y); |
| 521 if (!textPosition) | 530 if (!textPosition) |
| 522 return; | 531 return; |
| 523 for (var decoration of this._continueToLocationDecorations.keys()) { | 532 for (var decoration of this._continueToLocationDecorations.keys()) { |
| 524 var range = decoration.find(); | 533 var range = decoration.find(); |
| 525 if (range.from.line !== textPosition.startLine || range.to.line !== textPo
sition.startLine) | 534 if (range.from.line !== textPosition.startLine || range.to.line !== textPo
sition.startLine) |
| 526 continue; | 535 continue; |
| 527 if (range.from.ch <= textPosition.startColumn && textPosition.startColumn
<= range.to.ch) { | 536 if (range.from.ch <= textPosition.startColumn && textPosition.startColumn
<= range.to.ch) { |
| 528 this._continueToLocationDecorations.get(decoration)(); | 537 this._continueToLocationDecorations.get(decoration)(); |
| 529 break; | 538 break; |
| 530 } | 539 } |
| 531 } | 540 } |
| 532 } | 541 } |
| 533 | 542 |
| 534 /** | 543 /** |
| 544 * @param {!Event} event |
| 545 */ |
| 546 _onBlur(event) { |
| 547 if (this.textEditor.element.isAncestor(event.target)) |
| 548 return; |
| 549 this._clearControlDown(); |
| 550 } |
| 551 |
| 552 /** |
| 535 * @param {!KeyboardEvent} event | 553 * @param {!KeyboardEvent} event |
| 536 */ | 554 */ |
| 537 _onKeyUp(event) { | 555 _onKeyUp(event) { |
| 538 if (UI.KeyboardShortcut.eventHasCtrlOrMeta(event)) | 556 this._clearControlDown(); |
| 539 return; | 557 } |
| 558 |
| 559 _clearControlDown() { |
| 560 this._controlDown = false; |
| 540 this._clearContinueToLocations(); | 561 this._clearContinueToLocations(); |
| 562 clearTimeout(this._controlTimeout); |
| 541 } | 563 } |
| 542 | 564 |
| 543 /** | 565 /** |
| 544 * @param {number} lineNumber | 566 * @param {number} lineNumber |
| 545 * @param {?Bindings.BreakpointManager.Breakpoint} breakpoint | 567 * @param {?Bindings.BreakpointManager.Breakpoint} breakpoint |
| 546 * @param {?{lineNumber: number, columnNumber: number}} location | 568 * @param {?{lineNumber: number, columnNumber: number}} location |
| 547 */ | 569 */ |
| 548 _editBreakpointCondition(lineNumber, breakpoint, location) { | 570 _editBreakpointCondition(lineNumber, breakpoint, location) { |
| 549 this._conditionElement = this._createConditionElement(lineNumber); | 571 this._conditionElement = this._createConditionElement(lineNumber); |
| 550 this.textEditor.addDecoration(this._conditionElement, lineNumber); | 572 this.textEditor.addDecoration(this._conditionElement, lineNumber); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 594 */ | 616 */ |
| 595 setExecutionLocation(uiLocation) { | 617 setExecutionLocation(uiLocation) { |
| 596 this._executionLocation = uiLocation; | 618 this._executionLocation = uiLocation; |
| 597 if (!this.loaded) | 619 if (!this.loaded) |
| 598 return; | 620 return; |
| 599 | 621 |
| 600 this.textEditor.setExecutionLocation(uiLocation.lineNumber, uiLocation.colum
nNumber); | 622 this.textEditor.setExecutionLocation(uiLocation.lineNumber, uiLocation.colum
nNumber); |
| 601 if (this.isShowing()) { | 623 if (this.isShowing()) { |
| 602 // We need SourcesTextEditor to be initialized prior to this call. @see cr
bug.com/506566 | 624 // We need SourcesTextEditor to be initialized prior to this call. @see cr
bug.com/506566 |
| 603 setImmediate(() => { | 625 setImmediate(() => { |
| 604 this._generateValuesInSource(); | 626 if (this._controlDown) { |
| 605 if (Runtime.experiments.isEnabled('continueToLocationMarkers')) { | 627 if (Runtime.experiments.isEnabled('continueToLocationMarkers')) |
| 606 if (this._continueToLocationDecorations) | |
| 607 this._showContinueToLocations(); | 628 this._showContinueToLocations(); |
| 629 } else { |
| 630 this._generateValuesInSource(); |
| 608 } | 631 } |
| 609 }); | 632 }); |
| 610 } | 633 } |
| 611 } | 634 } |
| 612 | 635 |
| 613 _generateValuesInSource() { | 636 _generateValuesInSource() { |
| 614 if (!Common.moduleSetting('inlineVariableValues').get()) | 637 if (!Common.moduleSetting('inlineVariableValues').get()) |
| 615 return; | 638 return; |
| 616 var executionContext = UI.context.flavor(SDK.ExecutionContext); | 639 var executionContext = UI.context.flavor(SDK.ExecutionContext); |
| 617 if (!executionContext) | 640 if (!executionContext) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 638 return; | 661 return; |
| 639 this._popoverHelper.hidePopover(); | 662 this._popoverHelper.hidePopover(); |
| 640 var executionContext = UI.context.flavor(SDK.ExecutionContext); | 663 var executionContext = UI.context.flavor(SDK.ExecutionContext); |
| 641 if (!executionContext) | 664 if (!executionContext) |
| 642 return; | 665 return; |
| 643 var callFrame = UI.context.flavor(SDK.DebuggerModel.CallFrame); | 666 var callFrame = UI.context.flavor(SDK.DebuggerModel.CallFrame); |
| 644 if (!callFrame) | 667 if (!callFrame) |
| 645 return; | 668 return; |
| 646 var localScope = callFrame.localScope(); | 669 var localScope = callFrame.localScope(); |
| 647 if (!localScope) { | 670 if (!localScope) { |
| 648 this._clearContinueToLocations(); | 671 this._clearContinueToLocationsNoRestore(); |
| 649 return; | 672 return; |
| 650 } | 673 } |
| 651 var start = localScope.startLocation(); | 674 var start = localScope.startLocation(); |
| 652 var end = localScope.endLocation(); | 675 var end = localScope.endLocation(); |
| 653 var debuggerModel = callFrame.debuggerModel; | 676 var debuggerModel = callFrame.debuggerModel; |
| 654 debuggerModel.getPossibleBreakpoints(start, end, true) | 677 debuggerModel.getPossibleBreakpoints(start, end, true) |
| 655 .then(locations => this.textEditor.operation(renderLocations.bind(this,
locations))); | 678 .then(locations => this.textEditor.operation(renderLocations.bind(this,
locations))); |
| 656 | 679 |
| 657 /** | 680 /** |
| 658 * @param {!Array<!SDK.DebuggerModel.BreakLocation>} locations | 681 * @param {!Array<!SDK.DebuggerModel.BreakLocation>} locations |
| 659 * @this {Sources.JavaScriptSourceFrame} | 682 * @this {Sources.JavaScriptSourceFrame} |
| 660 */ | 683 */ |
| 661 function renderLocations(locations) { | 684 function renderLocations(locations) { |
| 662 this._clearContinueToLocations(); | 685 this._clearContinueToLocationsNoRestore(); |
| 686 this.textEditor.hideExecutionLineBackground(); |
| 687 this._clearValueWidgets(); |
| 663 this._continueToLocationDecorations = new Map(); | 688 this._continueToLocationDecorations = new Map(); |
| 664 for (var location of locations) { | 689 for (var location of locations) { |
| 665 var lineNumber = location.lineNumber; | 690 var lineNumber = location.lineNumber; |
| 666 var token = this.textEditor.tokenAtTextPosition(lineNumber, location.col
umnNumber); | 691 var token = this.textEditor.tokenAtTextPosition(lineNumber, location.col
umnNumber); |
| 667 if (!token || !token.type) | 692 if (!token || !token.type) |
| 668 continue; | 693 continue; |
| 669 var line = this.textEditor.line(lineNumber); | 694 var line = this.textEditor.line(lineNumber); |
| 670 var tokenContent = line.substring(token.startColumn, token.endColumn); | 695 var tokenContent = line.substring(token.startColumn, token.endColumn); |
| 671 if (!this._isIdentifier(token.type) && (token.type !== 'js-keyword' || t
okenContent !== 'this')) | 696 if (!this._isIdentifier(token.type) && (token.type !== 'js-keyword' || t
okenContent !== 'this')) |
| 672 continue; | 697 continue; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 } | 845 } |
| 821 } | 846 } |
| 822 } | 847 } |
| 823 | 848 |
| 824 clearExecutionLine() { | 849 clearExecutionLine() { |
| 825 this.textEditor.operation(() => { | 850 this.textEditor.operation(() => { |
| 826 if (this.loaded && this._executionLocation) | 851 if (this.loaded && this._executionLocation) |
| 827 this.textEditor.clearExecutionLine(); | 852 this.textEditor.clearExecutionLine(); |
| 828 delete this._executionLocation; | 853 delete this._executionLocation; |
| 829 this._clearValueWidgetsTimer = setTimeout(this._clearValueWidgets.bind(thi
s), 1000); | 854 this._clearValueWidgetsTimer = setTimeout(this._clearValueWidgets.bind(thi
s), 1000); |
| 830 this._clearContinueToLocations(); | 855 this._clearContinueToLocationsNoRestore(); |
| 831 }); | 856 }); |
| 832 } | 857 } |
| 833 | 858 |
| 834 _clearValueWidgets() { | 859 _clearValueWidgets() { |
| 860 clearTimeout(this._clearValueWidgetsTimer); |
| 835 delete this._clearValueWidgetsTimer; | 861 delete this._clearValueWidgetsTimer; |
| 836 this.textEditor.operation(() => { | 862 this.textEditor.operation(() => { |
| 837 for (var line of this._valueWidgets.keys()) | 863 for (var line of this._valueWidgets.keys()) |
| 838 this.textEditor.removeDecoration(this._valueWidgets.get(line), line); | 864 this.textEditor.removeDecoration(this._valueWidgets.get(line), line); |
| 839 this._valueWidgets.clear(); | 865 this._valueWidgets.clear(); |
| 840 }); | 866 }); |
| 841 } | 867 } |
| 842 | 868 |
| 869 _clearContinueToLocationsNoRestore() { |
| 870 if (!this._continueToLocationDecorations) |
| 871 return; |
| 872 this.textEditor.operation(() => { |
| 873 for (var decoration of this._continueToLocationDecorations.keys()) |
| 874 this.textEditor.removeHighlight(decoration); |
| 875 this._continueToLocationDecorations = null; |
| 876 }); |
| 877 } |
| 878 |
| 843 _clearContinueToLocations() { | 879 _clearContinueToLocations() { |
| 844 if (!this._continueToLocationDecorations) | 880 if (!this._continueToLocationDecorations) |
| 845 return; | 881 return; |
| 846 this.textEditor.operation(() => { | 882 this.textEditor.operation(() => { |
| 847 for (var decoration of this._continueToLocationDecorations.keys()) | 883 this.textEditor.showExecutionLineBackground(); |
| 848 this.textEditor.removeHighlight(decoration); | 884 this._generateValuesInSource(); |
| 849 delete this._continueToLocationDecorations; | 885 this._clearContinueToLocationsNoRestore(); |
| 850 }); | 886 }); |
| 851 } | 887 } |
| 852 | 888 |
| 853 /** | 889 /** |
| 854 * @param {number} lineNumber | 890 * @param {number} lineNumber |
| 855 * @return {!Array<!Sources.JavaScriptSourceFrame.BreakpointDecoration>} | 891 * @return {!Array<!Sources.JavaScriptSourceFrame.BreakpointDecoration>} |
| 856 */ | 892 */ |
| 857 _lineBreakpointDecorations(lineNumber) { | 893 _lineBreakpointDecorations(lineNumber) { |
| 858 return Array.from(this._breakpointDecorations) | 894 return Array.from(this._breakpointDecorations) |
| 859 .filter(decoration => (decoration.handle.resolve() || {}).lineNumber ===
lineNumber); | 895 .filter(decoration => (decoration.handle.resolve() || {}).lineNumber ===
lineNumber); |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1480 return; | 1516 return; |
| 1481 this.bookmark.clear(); | 1517 this.bookmark.clear(); |
| 1482 this.bookmark = null; | 1518 this.bookmark = null; |
| 1483 } | 1519 } |
| 1484 }; | 1520 }; |
| 1485 | 1521 |
| 1486 Sources.JavaScriptSourceFrame.BreakpointDecoration.bookmarkSymbol = Symbol('book
mark'); | 1522 Sources.JavaScriptSourceFrame.BreakpointDecoration.bookmarkSymbol = Symbol('book
mark'); |
| 1487 Sources.JavaScriptSourceFrame.BreakpointDecoration._elementSymbolForTest = Symbo
l('element'); | 1523 Sources.JavaScriptSourceFrame.BreakpointDecoration._elementSymbolForTest = Symbo
l('element'); |
| 1488 | 1524 |
| 1489 Sources.JavaScriptSourceFrame.continueToLocationDecorationSymbol = Symbol('bookm
ark'); | 1525 Sources.JavaScriptSourceFrame.continueToLocationDecorationSymbol = Symbol('bookm
ark'); |
| OLD | NEW |