| 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 30 matching lines...) Expand all Loading... |
| 41 this._url = contentProvider.contentURL(); | 41 this._url = contentProvider.contentURL(); |
| 42 this._contentProvider = contentProvider; | 42 this._contentProvider = contentProvider; |
| 43 | 43 |
| 44 var textEditorDelegate = new WebInspector.TextEditorDelegateForSourceFrame(t
his); | 44 var textEditorDelegate = new WebInspector.TextEditorDelegateForSourceFrame(t
his); |
| 45 | 45 |
| 46 this._textEditor = new WebInspector.CodeMirrorTextEditor(this._url, textEdit
orDelegate); | 46 this._textEditor = new WebInspector.CodeMirrorTextEditor(this._url, textEdit
orDelegate); |
| 47 | 47 |
| 48 this._currentSearchResultIndex = -1; | 48 this._currentSearchResultIndex = -1; |
| 49 this._searchResults = []; | 49 this._searchResults = []; |
| 50 | 50 |
| 51 this._rowMessageBuckets = {}; | |
| 52 | |
| 53 this._textEditor.setReadOnly(!this.canEditSource()); | 51 this._textEditor.setReadOnly(!this.canEditSource()); |
| 54 | 52 |
| 55 this._shortcuts = {}; | 53 this._shortcuts = {}; |
| 56 this.element.addEventListener("keydown", this._handleKeyDown.bind(this), fal
se); | 54 this.element.addEventListener("keydown", this._handleKeyDown.bind(this), fal
se); |
| 57 | 55 |
| 58 this._sourcePosition = new WebInspector.ToolbarText("", "source-frame-cursor
-position"); | 56 this._sourcePosition = new WebInspector.ToolbarText("", "source-frame-cursor
-position"); |
| 59 | |
| 60 this._errorPopoverHelper = new WebInspector.PopoverHelper(this.element, this
._getErrorAnchor.bind(this), this._showErrorPopover.bind(this)); | |
| 61 this._errorPopoverHelper.setTimeout(100, 100); | |
| 62 } | 57 } |
| 63 | 58 |
| 64 WebInspector.SourceFrame.Events = { | 59 WebInspector.SourceFrame.Events = { |
| 65 ScrollChanged: "ScrollChanged", | 60 ScrollChanged: "ScrollChanged", |
| 66 SelectionChanged: "SelectionChanged", | 61 SelectionChanged: "SelectionChanged", |
| 67 JumpHappened: "JumpHappened" | 62 JumpHappened: "JumpHappened" |
| 68 } | 63 } |
| 69 | 64 |
| 70 WebInspector.SourceFrame.prototype = { | 65 WebInspector.SourceFrame.prototype = { |
| 71 /** | 66 /** |
| 72 * @param {!Element} target | |
| 73 * @param {!Event} event | |
| 74 * @return {(!Element|undefined)} | |
| 75 */ | |
| 76 _getErrorAnchor: function(target, event) | |
| 77 { | |
| 78 var element = target.enclosingNodeOrSelfWithClass("text-editor-line-deco
ration-icon") | |
| 79 || target.enclosingNodeOrSelfWithClass("text-editor-line-decoration-
wave"); | |
| 80 if (!element) | |
| 81 return; | |
| 82 this._errorWavePopoverAnchor = new AnchorBox(event.clientX, event.client
Y, 1, 1); | |
| 83 return element; | |
| 84 }, | |
| 85 | |
| 86 /** | |
| 87 * @param {!Element} anchor | |
| 88 * @param {!WebInspector.Popover} popover | |
| 89 */ | |
| 90 _showErrorPopover: function(anchor, popover) | |
| 91 { | |
| 92 var messageBucket = anchor.enclosingNodeOrSelfWithClass("text-editor-lin
e-decoration")._messageBucket; | |
| 93 var messagesOutline = messageBucket.messagesDescription(); | |
| 94 var popoverAnchor = anchor.enclosingNodeOrSelfWithClass("text-editor-lin
e-decoration-icon") ? anchor : this._errorWavePopoverAnchor; | |
| 95 popover.showForAnchor(messagesOutline, popoverAnchor); | |
| 96 }, | |
| 97 | |
| 98 /** | |
| 99 * @param {number} key | 67 * @param {number} key |
| 100 * @param {function():boolean} handler | 68 * @param {function():boolean} handler |
| 101 */ | 69 */ |
| 102 addShortcut: function(key, handler) | 70 addShortcut: function(key, handler) |
| 103 { | 71 { |
| 104 this._shortcuts[key] = handler; | 72 this._shortcuts[key] = handler; |
| 105 }, | 73 }, |
| 106 | 74 |
| 107 wasShown: function() | 75 wasShown: function() |
| 108 { | 76 { |
| 109 this._ensureContentLoaded(); | 77 this._ensureContentLoaded(); |
| 110 this._textEditor.show(this.element); | 78 this._textEditor.show(this.element); |
| 111 this._editorAttached = true; | 79 this._editorAttached = true; |
| 112 // We need CodeMirrorTextEditor to be initialized prior to this call as
it calls |cursorPositionToCoordinates| internally. @see crbug.com/506566 | |
| 113 setImmediate(this._updateBucketDecorations.bind(this)); | |
| 114 this._wasShownOrLoaded(); | 80 this._wasShownOrLoaded(); |
| 115 }, | 81 }, |
| 116 | 82 |
| 117 _updateBucketDecorations: function() | |
| 118 { | |
| 119 for (var line in this._rowMessageBuckets) { | |
| 120 var bucket = this._rowMessageBuckets[line]; | |
| 121 bucket._updateDecoration(); | |
| 122 } | |
| 123 }, | |
| 124 | |
| 125 /** | 83 /** |
| 126 * @return {boolean} | 84 * @return {boolean} |
| 127 */ | 85 */ |
| 128 _isEditorShowing: function() | 86 isEditorShowing: function() |
| 129 { | 87 { |
| 130 return this.isShowing() && this._editorAttached; | 88 return this.isShowing() && this._editorAttached; |
| 131 }, | 89 }, |
| 132 | 90 |
| 133 willHide: function() | 91 willHide: function() |
| 134 { | 92 { |
| 135 WebInspector.Widget.prototype.willHide.call(this); | 93 WebInspector.Widget.prototype.willHide.call(this); |
| 136 | 94 |
| 137 this._clearPositionToReveal(); | 95 this._clearPositionToReveal(); |
| 138 }, | 96 }, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 165 }, | 123 }, |
| 166 | 124 |
| 167 _ensureContentLoaded: function() | 125 _ensureContentLoaded: function() |
| 168 { | 126 { |
| 169 if (!this._contentRequested) { | 127 if (!this._contentRequested) { |
| 170 this._contentRequested = true; | 128 this._contentRequested = true; |
| 171 this._contentProvider.requestContent(this.setContent.bind(this)); | 129 this._contentProvider.requestContent(this.setContent.bind(this)); |
| 172 } | 130 } |
| 173 }, | 131 }, |
| 174 | 132 |
| 175 clearMessages: function() | |
| 176 { | |
| 177 for (var line in this._rowMessageBuckets) { | |
| 178 var bubble = this._rowMessageBuckets[line]; | |
| 179 bubble.detachFromEditor(); | |
| 180 } | |
| 181 | |
| 182 this._rowMessageBuckets = {}; | |
| 183 this._errorPopoverHelper.hidePopover(); | |
| 184 }, | |
| 185 | |
| 186 /** | 133 /** |
| 187 * @param {number} line 0-based | 134 * @param {number} line 0-based |
| 188 * @param {number=} column | 135 * @param {number=} column |
| 189 * @param {boolean=} shouldHighlight | 136 * @param {boolean=} shouldHighlight |
| 190 */ | 137 */ |
| 191 revealPosition: function(line, column, shouldHighlight) | 138 revealPosition: function(line, column, shouldHighlight) |
| 192 { | 139 { |
| 193 this._clearLineToScrollTo(); | 140 this._clearLineToScrollTo(); |
| 194 this._clearSelectionToSet(); | 141 this._clearSelectionToSet(); |
| 195 this._positionToReveal = { line: line, column: column, shouldHighlight:
shouldHighlight }; | 142 this._positionToReveal = { line: line, column: column, shouldHighlight:
shouldHighlight }; |
| 196 this._innerRevealPositionIfNeeded(); | 143 this._innerRevealPositionIfNeeded(); |
| 197 }, | 144 }, |
| 198 | 145 |
| 199 _innerRevealPositionIfNeeded: function() | 146 _innerRevealPositionIfNeeded: function() |
| 200 { | 147 { |
| 201 if (!this._positionToReveal) | 148 if (!this._positionToReveal) |
| 202 return; | 149 return; |
| 203 | 150 |
| 204 if (!this.loaded || !this._isEditorShowing()) | 151 if (!this.loaded || !this.isEditorShowing()) |
| 205 return; | 152 return; |
| 206 | 153 |
| 207 this._textEditor.revealPosition(this._positionToReveal.line, this._posit
ionToReveal.column, this._positionToReveal.shouldHighlight); | 154 this._textEditor.revealPosition(this._positionToReveal.line, this._posit
ionToReveal.column, this._positionToReveal.shouldHighlight); |
| 208 delete this._positionToReveal; | 155 delete this._positionToReveal; |
| 209 }, | 156 }, |
| 210 | 157 |
| 211 _clearPositionToReveal: function() | 158 _clearPositionToReveal: function() |
| 212 { | 159 { |
| 213 this._textEditor.clearPositionHighlight(); | 160 this._textEditor.clearPositionHighlight(); |
| 214 delete this._positionToReveal; | 161 delete this._positionToReveal; |
| 215 }, | 162 }, |
| 216 | 163 |
| 217 /** | 164 /** |
| 218 * @param {number} line | 165 * @param {number} line |
| 219 */ | 166 */ |
| 220 scrollToLine: function(line) | 167 scrollToLine: function(line) |
| 221 { | 168 { |
| 222 this._clearPositionToReveal(); | 169 this._clearPositionToReveal(); |
| 223 this._lineToScrollTo = line; | 170 this._lineToScrollTo = line; |
| 224 this._innerScrollToLineIfNeeded(); | 171 this._innerScrollToLineIfNeeded(); |
| 225 }, | 172 }, |
| 226 | 173 |
| 227 _innerScrollToLineIfNeeded: function() | 174 _innerScrollToLineIfNeeded: function() |
| 228 { | 175 { |
| 229 if (typeof this._lineToScrollTo === "number") { | 176 if (typeof this._lineToScrollTo === "number") { |
| 230 if (this.loaded && this._isEditorShowing()) { | 177 if (this.loaded && this.isEditorShowing()) { |
| 231 this._textEditor.scrollToLine(this._lineToScrollTo); | 178 this._textEditor.scrollToLine(this._lineToScrollTo); |
| 232 delete this._lineToScrollTo; | 179 delete this._lineToScrollTo; |
| 233 } | 180 } |
| 234 } | 181 } |
| 235 }, | 182 }, |
| 236 | 183 |
| 237 _clearLineToScrollTo: function() | 184 _clearLineToScrollTo: function() |
| 238 { | 185 { |
| 239 delete this._lineToScrollTo; | 186 delete this._lineToScrollTo; |
| 240 }, | 187 }, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 251 * @param {!WebInspector.TextRange} textRange | 198 * @param {!WebInspector.TextRange} textRange |
| 252 */ | 199 */ |
| 253 setSelection: function(textRange) | 200 setSelection: function(textRange) |
| 254 { | 201 { |
| 255 this._selectionToSet = textRange; | 202 this._selectionToSet = textRange; |
| 256 this._innerSetSelectionIfNeeded(); | 203 this._innerSetSelectionIfNeeded(); |
| 257 }, | 204 }, |
| 258 | 205 |
| 259 _innerSetSelectionIfNeeded: function() | 206 _innerSetSelectionIfNeeded: function() |
| 260 { | 207 { |
| 261 if (this._selectionToSet && this.loaded && this._isEditorShowing()) { | 208 if (this._selectionToSet && this.loaded && this.isEditorShowing()) { |
| 262 this._textEditor.setSelection(this._selectionToSet); | 209 this._textEditor.setSelection(this._selectionToSet); |
| 263 delete this._selectionToSet; | 210 delete this._selectionToSet; |
| 264 } | 211 } |
| 265 }, | 212 }, |
| 266 | 213 |
| 267 _clearSelectionToSet: function() | 214 _clearSelectionToSet: function() |
| 268 { | 215 { |
| 269 delete this._selectionToSet; | 216 delete this._selectionToSet; |
| 270 }, | 217 }, |
| 271 | 218 |
| 272 _wasShownOrLoaded: function() | 219 _wasShownOrLoaded: function() |
| 273 { | 220 { |
| 274 this._innerRevealPositionIfNeeded(); | 221 this._innerRevealPositionIfNeeded(); |
| 275 this._innerSetSelectionIfNeeded(); | 222 this._innerSetSelectionIfNeeded(); |
| 276 this._innerScrollToLineIfNeeded(); | 223 this._innerScrollToLineIfNeeded(); |
| 277 }, | 224 }, |
| 278 | 225 |
| 279 onTextChanged: function(oldRange, newRange) | 226 onTextChanged: function(oldRange, newRange) |
| 280 { | 227 { |
| 281 if (this._searchResultsChangedCallback) | 228 if (this._searchResultsChangedCallback) |
| 282 this._searchResultsChangedCallback(); | 229 this._searchResultsChangedCallback(); |
| 283 this.clearMessages(); | |
| 284 }, | 230 }, |
| 285 | 231 |
| 286 /** | 232 /** |
| 287 * @param {string} content | 233 * @param {string} content |
| 288 * @param {string} mimeType | 234 * @param {string} mimeType |
| 289 * @return {string} | 235 * @return {string} |
| 290 */ | 236 */ |
| 291 _simplifyMimeType: function(content, mimeType) | 237 _simplifyMimeType: function(content, mimeType) |
| 292 { | 238 { |
| 293 if (!mimeType) | 239 if (!mimeType) |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 this._textEditor.markClean(); | 276 this._textEditor.markClean(); |
| 331 } else { | 277 } else { |
| 332 var firstLine = this._textEditor.firstVisibleLine(); | 278 var firstLine = this._textEditor.firstVisibleLine(); |
| 333 var selection = this._textEditor.selection(); | 279 var selection = this._textEditor.selection(); |
| 334 this._textEditor.setText(content || ""); | 280 this._textEditor.setText(content || ""); |
| 335 this._textEditor.scrollToLine(firstLine); | 281 this._textEditor.scrollToLine(firstLine); |
| 336 this._textEditor.setSelection(selection); | 282 this._textEditor.setSelection(selection); |
| 337 } | 283 } |
| 338 | 284 |
| 339 this._updateHighlighterType(content || ""); | 285 this._updateHighlighterType(content || ""); |
| 340 this.clearMessages(); | |
| 341 this._wasShownOrLoaded(); | 286 this._wasShownOrLoaded(); |
| 342 | 287 |
| 343 if (this._delayedFindSearchMatches) { | 288 if (this._delayedFindSearchMatches) { |
| 344 this._delayedFindSearchMatches(); | 289 this._delayedFindSearchMatches(); |
| 345 delete this._delayedFindSearchMatches; | 290 delete this._delayedFindSearchMatches; |
| 346 } | 291 } |
| 347 this.onTextEditorContentLoaded(); | 292 this.onTextEditorContentLoaded(); |
| 348 }, | 293 }, |
| 349 | 294 |
| 350 onTextEditorContentLoaded: function() {}, | 295 onTextEditorContentLoaded: function() {}, |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 ranges.push(new WebInspector.TextRange(i, offset + match
.index, i, offset + matchEndIndex)); | 507 ranges.push(new WebInspector.TextRange(i, offset + match
.index, i, offset + matchEndIndex)); |
| 563 offset += matchEndIndex; | 508 offset += matchEndIndex; |
| 564 line = line.substring(matchEndIndex); | 509 line = line.substring(matchEndIndex); |
| 565 } | 510 } |
| 566 } while (match && line); | 511 } while (match && line); |
| 567 } | 512 } |
| 568 return ranges; | 513 return ranges; |
| 569 }, | 514 }, |
| 570 | 515 |
| 571 /** | 516 /** |
| 572 * @param {!WebInspector.SourceFrameMessage} message | |
| 573 */ | |
| 574 addMessageToSource: function(message) | |
| 575 { | |
| 576 var lineNumber = message.lineNumber(); | |
| 577 if (lineNumber >= this._textEditor.linesCount) | |
| 578 lineNumber = this._textEditor.linesCount - 1; | |
| 579 if (lineNumber < 0) | |
| 580 lineNumber = 0; | |
| 581 | |
| 582 if (!this._rowMessageBuckets[lineNumber]) | |
| 583 this._rowMessageBuckets[lineNumber] = new WebInspector.SourceFrame.R
owMessageBucket(this, this._textEditor, lineNumber); | |
| 584 var messageBucket = this._rowMessageBuckets[lineNumber]; | |
| 585 messageBucket.addMessage(message); | |
| 586 }, | |
| 587 | |
| 588 /** | |
| 589 * @param {!WebInspector.SourceFrameMessage} message | |
| 590 */ | |
| 591 removeMessageFromSource: function(message) | |
| 592 { | |
| 593 var lineNumber = message.lineNumber(); | |
| 594 if (lineNumber >= this._textEditor.linesCount) | |
| 595 lineNumber = this._textEditor.linesCount - 1; | |
| 596 if (lineNumber < 0) | |
| 597 lineNumber = 0; | |
| 598 | |
| 599 var messageBucket = this._rowMessageBuckets[lineNumber]; | |
| 600 if (!messageBucket) | |
| 601 return; | |
| 602 messageBucket.removeMessage(message); | |
| 603 if (!messageBucket.uniqueMessagesCount()) { | |
| 604 messageBucket.detachFromEditor(); | |
| 605 delete this._rowMessageBuckets[lineNumber]; | |
| 606 } | |
| 607 }, | |
| 608 | |
| 609 /** | |
| 610 * @return {!Promise} | 517 * @return {!Promise} |
| 611 */ | 518 */ |
| 612 populateLineGutterContextMenu: function(contextMenu, lineNumber) | 519 populateLineGutterContextMenu: function(contextMenu, lineNumber) |
| 613 { | 520 { |
| 614 return Promise.resolve(); | 521 return Promise.resolve(); |
| 615 }, | 522 }, |
| 616 | 523 |
| 617 /** | 524 /** |
| 618 * @return {!Promise} | 525 * @return {!Promise} |
| 619 */ | 526 */ |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 688 var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(e); | 595 var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(e); |
| 689 var handler = this._shortcuts[shortcutKey]; | 596 var handler = this._shortcuts[shortcutKey]; |
| 690 if (handler && handler()) | 597 if (handler && handler()) |
| 691 e.consume(true); | 598 e.consume(true); |
| 692 }, | 599 }, |
| 693 | 600 |
| 694 __proto__: WebInspector.VBox.prototype | 601 __proto__: WebInspector.VBox.prototype |
| 695 } | 602 } |
| 696 | 603 |
| 697 /** | 604 /** |
| 698 * @constructor | |
| 699 * @param {string} messageText | |
| 700 * @param {!WebInspector.SourceFrameMessage.Level} level | |
| 701 * @param {number} lineNumber | |
| 702 * @param {number=} columnNumber | |
| 703 */ | |
| 704 WebInspector.SourceFrameMessage = function(messageText, level, lineNumber, colum
nNumber) | |
| 705 { | |
| 706 this._messageText = messageText; | |
| 707 this._level = level; | |
| 708 this._lineNumber = lineNumber; | |
| 709 this._columnNumber = columnNumber; | |
| 710 } | |
| 711 | |
| 712 /** | |
| 713 * @enum {string} | |
| 714 */ | |
| 715 WebInspector.SourceFrameMessage.Level = { | |
| 716 Error: "Error", | |
| 717 Warning: "Warning" | |
| 718 } | |
| 719 | |
| 720 /** | |
| 721 * @param {!WebInspector.ConsoleMessage} consoleMessage | |
| 722 * @param {number} lineNumber | |
| 723 * @param {number} columnNumber | |
| 724 * @return {!WebInspector.SourceFrameMessage} | |
| 725 */ | |
| 726 WebInspector.SourceFrameMessage.fromConsoleMessage = function(consoleMessage, li
neNumber, columnNumber) | |
| 727 { | |
| 728 console.assert(consoleMessage.level === WebInspector.ConsoleMessage.MessageL
evel.Error || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.
Warning); | |
| 729 var level = consoleMessage.level === WebInspector.ConsoleMessage.MessageLeve
l.Error ? WebInspector.SourceFrameMessage.Level.Error : WebInspector.SourceFrame
Message.Level.Warning; | |
| 730 return new WebInspector.SourceFrameMessage(consoleMessage.messageText, level
, lineNumber, columnNumber); | |
| 731 } | |
| 732 | |
| 733 WebInspector.SourceFrameMessage.prototype = { | |
| 734 /** | |
| 735 * @return {string} | |
| 736 */ | |
| 737 messageText: function() | |
| 738 { | |
| 739 return this._messageText; | |
| 740 }, | |
| 741 | |
| 742 /** | |
| 743 * @return {!WebInspector.SourceFrameMessage.Level} | |
| 744 */ | |
| 745 level: function() | |
| 746 { | |
| 747 return this._level; | |
| 748 }, | |
| 749 | |
| 750 /** | |
| 751 * @return {number} | |
| 752 */ | |
| 753 lineNumber: function() | |
| 754 { | |
| 755 return this._lineNumber; | |
| 756 }, | |
| 757 | |
| 758 /** | |
| 759 * @return {(number|undefined)} | |
| 760 */ | |
| 761 columnNumber: function() | |
| 762 { | |
| 763 return this._columnNumber; | |
| 764 }, | |
| 765 | |
| 766 /** | |
| 767 * @param {!WebInspector.SourceFrameMessage} another | |
| 768 * @return {boolean} | |
| 769 */ | |
| 770 isEqual: function(another) | |
| 771 { | |
| 772 return this.messageText() === another.messageText() && this.level() ===
another.level() && this.lineNumber() === another.lineNumber() && this.columnNumb
er() === another.columnNumber(); | |
| 773 } | |
| 774 } | |
| 775 | |
| 776 WebInspector.SourceFrame._iconClassPerLevel = {}; | |
| 777 WebInspector.SourceFrame._iconClassPerLevel[WebInspector.SourceFrameMessage.Leve
l.Error] = "error-icon"; | |
| 778 WebInspector.SourceFrame._iconClassPerLevel[WebInspector.SourceFrameMessage.Leve
l.Warning] = "warning-icon"; | |
| 779 | |
| 780 WebInspector.SourceFrame._lineClassPerLevel = {}; | |
| 781 WebInspector.SourceFrame._lineClassPerLevel[WebInspector.SourceFrameMessage.Leve
l.Error] = "text-editor-line-with-error"; | |
| 782 WebInspector.SourceFrame._lineClassPerLevel[WebInspector.SourceFrameMessage.Leve
l.Warning] = "text-editor-line-with-warning"; | |
| 783 | |
| 784 /** | |
| 785 * @constructor | |
| 786 * @param {!WebInspector.SourceFrameMessage} message | |
| 787 */ | |
| 788 WebInspector.SourceFrame.RowMessage = function(message) | |
| 789 { | |
| 790 this._message = message; | |
| 791 this._repeatCount = 1; | |
| 792 this.element = createElementWithClass("div", "text-editor-row-message"); | |
| 793 this._icon = this.element.createChild("label", "", "dt-icon-label"); | |
| 794 this._icon.type = WebInspector.SourceFrame._iconClassPerLevel[message.level(
)]; | |
| 795 this._repeatCountElement = this.element.createChild("span", "bubble-repeat-c
ount hidden error"); | |
| 796 var linesContainer = this.element.createChild("div", "text-editor-row-messag
e-lines"); | |
| 797 var lines = this._message.messageText().split("\n"); | |
| 798 for (var i = 0; i < lines.length; ++i) { | |
| 799 var messageLine = linesContainer.createChild("div"); | |
| 800 messageLine.textContent = lines[i]; | |
| 801 } | |
| 802 } | |
| 803 | |
| 804 WebInspector.SourceFrame.RowMessage.prototype = { | |
| 805 /** | |
| 806 * @return {!WebInspector.SourceFrameMessage} | |
| 807 */ | |
| 808 message: function() | |
| 809 { | |
| 810 return this._message; | |
| 811 }, | |
| 812 | |
| 813 /** | |
| 814 * @return {number} | |
| 815 */ | |
| 816 repeatCount: function() | |
| 817 { | |
| 818 return this._repeatCount; | |
| 819 }, | |
| 820 | |
| 821 setRepeatCount: function(repeatCount) | |
| 822 { | |
| 823 if (this._repeatCount === repeatCount) | |
| 824 return; | |
| 825 this._repeatCount = repeatCount; | |
| 826 this._updateMessageRepeatCount(); | |
| 827 }, | |
| 828 | |
| 829 _updateMessageRepeatCount: function() | |
| 830 { | |
| 831 this._repeatCountElement.textContent = this._repeatCount; | |
| 832 var showRepeatCount = this._repeatCount > 1; | |
| 833 this._repeatCountElement.classList.toggle("hidden", !showRepeatCount); | |
| 834 this._icon.classList.toggle("hidden", showRepeatCount); | |
| 835 } | |
| 836 } | |
| 837 | |
| 838 /** | |
| 839 * @constructor | |
| 840 * @param {!WebInspector.SourceFrame} sourceFrame | |
| 841 * @param {!WebInspector.CodeMirrorTextEditor} textEditor | |
| 842 * @param {number} lineNumber | |
| 843 */ | |
| 844 WebInspector.SourceFrame.RowMessageBucket = function(sourceFrame, textEditor, li
neNumber) | |
| 845 { | |
| 846 this._sourceFrame = sourceFrame; | |
| 847 this._textEditor = textEditor; | |
| 848 this._lineHandle = textEditor.textEditorPositionHandle(lineNumber, 0); | |
| 849 this._decoration = createElementWithClass("div", "text-editor-line-decoratio
n"); | |
| 850 this._decoration._messageBucket = this; | |
| 851 this._wave = this._decoration.createChild("div", "text-editor-line-decoratio
n-wave"); | |
| 852 this._icon = this._wave.createChild("label", "text-editor-line-decoration-ic
on", "dt-icon-label"); | |
| 853 | |
| 854 this._textEditor.addDecoration(lineNumber, this._decoration); | |
| 855 | |
| 856 this._messagesDescriptionElement = createElementWithClass("div", "text-edito
r-messages-description-container"); | |
| 857 /** @type {!Array.<!WebInspector.SourceFrame.RowMessage>} */ | |
| 858 this._messages = []; | |
| 859 | |
| 860 this._level = null; | |
| 861 } | |
| 862 | |
| 863 WebInspector.SourceFrame.RowMessageBucket.prototype = { | |
| 864 /** | |
| 865 * @param {number} lineNumber | |
| 866 * @param {number} columnNumber | |
| 867 */ | |
| 868 _updateWavePosition: function(lineNumber, columnNumber) | |
| 869 { | |
| 870 lineNumber = Math.min(lineNumber, this._textEditor.linesCount - 1); | |
| 871 var lineText = this._textEditor.line(lineNumber); | |
| 872 columnNumber = Math.min(columnNumber, lineText.length); | |
| 873 var lineIndent = WebInspector.TextUtils.lineIndent(lineText).length; | |
| 874 var base = this._textEditor.cursorPositionToCoordinates(lineNumber, 0); | |
| 875 | |
| 876 var start = this._textEditor.cursorPositionToCoordinates(lineNumber, Mat
h.max(columnNumber - 1, lineIndent)); | |
| 877 var end = this._textEditor.cursorPositionToCoordinates(lineNumber, lineT
ext.length); | |
| 878 /** @const */ | |
| 879 var codeMirrorLinesLeftPadding = 4; | |
| 880 this._wave.style.left = (start.x - base.x + codeMirrorLinesLeftPadding)
+ "px"; | |
| 881 this._wave.style.width = (end.x - start.x) + "px"; | |
| 882 }, | |
| 883 | |
| 884 /** | |
| 885 * @return {!Element} | |
| 886 */ | |
| 887 messagesDescription: function() | |
| 888 { | |
| 889 this._messagesDescriptionElement.removeChildren(); | |
| 890 for (var i = 0; i < this._messages.length; ++i) { | |
| 891 this._messagesDescriptionElement.appendChild(this._messages[i].eleme
nt); | |
| 892 } | |
| 893 return this._messagesDescriptionElement; | |
| 894 }, | |
| 895 | |
| 896 detachFromEditor: function() | |
| 897 { | |
| 898 var position = this._lineHandle.resolve(); | |
| 899 if (!position) | |
| 900 return; | |
| 901 var lineNumber = position.lineNumber; | |
| 902 if (this._level) | |
| 903 this._textEditor.toggleLineClass(lineNumber, WebInspector.SourceFram
e._lineClassPerLevel[this._level], false); | |
| 904 this._textEditor.removeDecoration(lineNumber, this._decoration); | |
| 905 }, | |
| 906 | |
| 907 /** | |
| 908 * @return {number} | |
| 909 */ | |
| 910 uniqueMessagesCount: function() | |
| 911 { | |
| 912 return this._messages.length; | |
| 913 }, | |
| 914 | |
| 915 /** | |
| 916 * @param {!WebInspector.SourceFrameMessage} message | |
| 917 */ | |
| 918 addMessage: function(message) | |
| 919 { | |
| 920 for (var i = 0; i < this._messages.length; ++i) { | |
| 921 var rowMessage = this._messages[i]; | |
| 922 if (rowMessage.message().isEqual(message)) { | |
| 923 rowMessage.setRepeatCount(rowMessage.repeatCount() + 1); | |
| 924 return; | |
| 925 } | |
| 926 } | |
| 927 | |
| 928 var rowMessage = new WebInspector.SourceFrame.RowMessage(message); | |
| 929 this._messages.push(rowMessage); | |
| 930 this._updateDecoration(); | |
| 931 }, | |
| 932 | |
| 933 /** | |
| 934 * @param {!WebInspector.SourceFrameMessage} message | |
| 935 */ | |
| 936 removeMessage: function(message) | |
| 937 { | |
| 938 for (var i = 0; i < this._messages.length; ++i) { | |
| 939 var rowMessage = this._messages[i]; | |
| 940 if (!rowMessage.message().isEqual(message)) | |
| 941 continue; | |
| 942 rowMessage.setRepeatCount(rowMessage.repeatCount() - 1); | |
| 943 if (!rowMessage.repeatCount()) | |
| 944 this._messages.splice(i, 1); | |
| 945 this._updateDecoration(); | |
| 946 return; | |
| 947 } | |
| 948 }, | |
| 949 | |
| 950 _updateDecoration: function() | |
| 951 { | |
| 952 if (!this._sourceFrame._isEditorShowing()) | |
| 953 return; | |
| 954 if (!this._messages.length) | |
| 955 return; | |
| 956 var position = this._lineHandle.resolve(); | |
| 957 if (!position) | |
| 958 return; | |
| 959 | |
| 960 var lineNumber = position.lineNumber; | |
| 961 var columnNumber = Number.MAX_VALUE; | |
| 962 var maxMessage = null; | |
| 963 for (var i = 0; i < this._messages.length; ++i) { | |
| 964 var message = this._messages[i].message(); | |
| 965 columnNumber = Math.min(columnNumber, message.columnNumber()); | |
| 966 if (!maxMessage || WebInspector.SourceFrameMessage.messageLevelCompa
rator(maxMessage, message) < 0) | |
| 967 maxMessage = message; | |
| 968 } | |
| 969 this._updateWavePosition(lineNumber, columnNumber); | |
| 970 | |
| 971 if (this._level) { | |
| 972 this._textEditor.toggleLineClass(lineNumber, WebInspector.SourceFram
e._lineClassPerLevel[this._level], false); | |
| 973 this._icon.type = ""; | |
| 974 } | |
| 975 this._level = maxMessage.level(); | |
| 976 if (!this._level) | |
| 977 return; | |
| 978 this._textEditor.toggleLineClass(lineNumber, WebInspector.SourceFrame._l
ineClassPerLevel[this._level], true); | |
| 979 this._icon.type = WebInspector.SourceFrame._iconClassPerLevel[this._leve
l]; | |
| 980 } | |
| 981 } | |
| 982 | |
| 983 /** | |
| 984 * @implements {WebInspector.TextEditorDelegate} | 605 * @implements {WebInspector.TextEditorDelegate} |
| 985 * @constructor | 606 * @constructor |
| 986 */ | 607 */ |
| 987 WebInspector.TextEditorDelegateForSourceFrame = function(sourceFrame) | 608 WebInspector.TextEditorDelegateForSourceFrame = function(sourceFrame) |
| 988 { | 609 { |
| 989 this._sourceFrame = sourceFrame; | 610 this._sourceFrame = sourceFrame; |
| 990 } | 611 } |
| 991 | 612 |
| 992 WebInspector.TextEditorDelegateForSourceFrame.prototype = { | 613 WebInspector.TextEditorDelegateForSourceFrame.prototype = { |
| 993 /** | 614 /** |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1050 /** | 671 /** |
| 1051 * @override | 672 * @override |
| 1052 * @param {?WebInspector.TextRange} from | 673 * @param {?WebInspector.TextRange} from |
| 1053 * @param {?WebInspector.TextRange} to | 674 * @param {?WebInspector.TextRange} to |
| 1054 */ | 675 */ |
| 1055 onJumpToPosition: function(from, to) | 676 onJumpToPosition: function(from, to) |
| 1056 { | 677 { |
| 1057 this._sourceFrame.onJumpToPosition(from, to); | 678 this._sourceFrame.onJumpToPosition(from, to); |
| 1058 } | 679 } |
| 1059 } | 680 } |
| 1060 | |
| 1061 WebInspector.SourceFrameMessage._messageLevelPriority = { | |
| 1062 "Warning": 3, | |
| 1063 "Error": 4 | |
| 1064 }; | |
| 1065 | |
| 1066 /** | |
| 1067 * @param {!WebInspector.SourceFrameMessage} a | |
| 1068 * @param {!WebInspector.SourceFrameMessage} b | |
| 1069 * @return {number} | |
| 1070 */ | |
| 1071 WebInspector.SourceFrameMessage.messageLevelComparator = function(a, b) | |
| 1072 { | |
| 1073 return WebInspector.SourceFrameMessage._messageLevelPriority[a.level()] - We
bInspector.SourceFrameMessage._messageLevelPriority[b.level()]; | |
| 1074 } | |
| OLD | NEW |