Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(461)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/console/ConsoleView.js

Issue 2331053002: DevTools: Implement the console prompt with CodeMirror (Closed)
Patch Set: Merge Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2009 Joseph Pecoraro 3 * Copyright (C) 2009 Joseph Pecoraro
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 8 *
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 this._filterStatusMessageElement.createTextChild(" "); 96 this._filterStatusMessageElement.createTextChild(" ");
97 var resetFiltersLink = this._filterStatusMessageElement.createChild("span", "console-info link"); 97 var resetFiltersLink = this._filterStatusMessageElement.createChild("span", "console-info link");
98 resetFiltersLink.textContent = WebInspector.UIString("Show all messages."); 98 resetFiltersLink.textContent = WebInspector.UIString("Show all messages.");
99 resetFiltersLink.addEventListener("click", this._filter.reset.bind(this._fil ter), true); 99 resetFiltersLink.addEventListener("click", this._filter.reset.bind(this._fil ter), true);
100 100
101 this._topGroup = WebInspector.ConsoleGroup.createTopGroup(); 101 this._topGroup = WebInspector.ConsoleGroup.createTopGroup();
102 this._currentGroup = this._topGroup; 102 this._currentGroup = this._topGroup;
103 103
104 this._promptElement = this._messagesElement.createChild("div", "source-code" ); 104 this._promptElement = this._messagesElement.createChild("div", "source-code" );
105 this._promptElement.id = "console-prompt"; 105 this._promptElement.id = "console-prompt";
106 this._promptElement.spellcheck = false; 106 this._promptElement.addEventListener("input", this._promptInput.bind(this), false);
107
108 this._searchableView.setDefaultFocusedElement(this._promptElement);
109 107
110 // FIXME: This is a workaround for the selection machinery bug. See crbug.co m/410899 108 // FIXME: This is a workaround for the selection machinery bug. See crbug.co m/410899
111 var selectAllFixer = this._messagesElement.createChild("div", "console-view- fix-select-all"); 109 var selectAllFixer = this._messagesElement.createChild("div", "console-view- fix-select-all");
112 selectAllFixer.textContent = "."; 110 selectAllFixer.textContent = ".";
113 111
114 this._showAllMessagesCheckbox = new WebInspector.ToolbarCheckbox(WebInspecto r.UIString("Show all messages")); 112 this._showAllMessagesCheckbox = new WebInspector.ToolbarCheckbox(WebInspecto r.UIString("Show all messages"));
115 this._showAllMessagesCheckbox.inputElement.checked = true; 113 this._showAllMessagesCheckbox.inputElement.checked = true;
116 this._showAllMessagesCheckbox.inputElement.addEventListener("change", this._ updateMessageList.bind(this), false); 114 this._showAllMessagesCheckbox.inputElement.addEventListener("change", this._ updateMessageList.bind(this), false);
117 115
118 this._showAllMessagesCheckbox.element.classList.add("hidden"); 116 this._showAllMessagesCheckbox.element.classList.add("hidden");
119 117
120 toolbar.appendToolbarItem(this._showAllMessagesCheckbox); 118 toolbar.appendToolbarItem(this._showAllMessagesCheckbox);
121 119
122 this._registerShortcuts(); 120 this._registerShortcuts();
123 121
124 this._messagesElement.addEventListener("contextmenu", this._handleContextMen uEvent.bind(this), false); 122 this._messagesElement.addEventListener("contextmenu", this._handleContextMen uEvent.bind(this), false);
125 WebInspector.moduleSetting("monitoringXHREnabled").addChangeListener(this._m onitoringXHREnabledSettingChanged, this); 123 WebInspector.moduleSetting("monitoringXHREnabled").addChangeListener(this._m onitoringXHREnabledSettingChanged, this);
126 124
127 this._linkifier = new WebInspector.Linkifier(); 125 this._linkifier = new WebInspector.Linkifier();
128 126
129 /** @type {!Array.<!WebInspector.ConsoleViewMessage>} */ 127 /** @type {!Array.<!WebInspector.ConsoleViewMessage>} */
130 this._consoleMessages = []; 128 this._consoleMessages = [];
131 this._viewMessageSymbol = Symbol("viewMessage"); 129 this._viewMessageSymbol = Symbol("viewMessage");
132 130
133 this._prompt = new WebInspector.TextPromptWithHistory(WebInspector.Execution ContextSelector.completionsForTextPromptInCurrentContext);
134 this._prompt.setSuggestBoxEnabled(true);
135 this._prompt.setAutocompletionTimeout(0);
136 this._prompt.renderAsBlock();
137 var proxyElement = this._prompt.attach(this._promptElement);
138 proxyElement.addEventListener("keydown", this._promptKeyDown.bind(this), fal se);
139 proxyElement.addEventListener("input", this._promptInput.bind(this), false);
140 131
141 this._consoleHistorySetting = WebInspector.settings.createLocalSetting("cons oleHistory", []); 132 this._consoleHistorySetting = WebInspector.settings.createLocalSetting("cons oleHistory", []);
142 var historyData = this._consoleHistorySetting.get(); 133
143 this._prompt.history().setHistoryData(historyData); 134 this._prompt = new WebInspector.ConsolePrompt();
135 this._prompt.show(this._promptElement);
136 this._prompt.element.addEventListener("keydown", this._promptKeyDown.bind(th is), true);
137 // this._searchableView.setDefaultFocusedElement(this._prompt.element);
dgozman 2016/09/14 04:26:18 Commented code.
einbinder 2016/09/14 20:21:06 Done.
138
144 139
145 this._consoleHistoryAutocompleteSetting = WebInspector.moduleSetting("consol eHistoryAutocomplete"); 140 this._consoleHistoryAutocompleteSetting = WebInspector.moduleSetting("consol eHistoryAutocomplete");
146 this._consoleHistoryAutocompleteSetting.addChangeListener(this._consoleHisto ryAutocompleteChanged, this); 141 this._consoleHistoryAutocompleteSetting.addChangeListener(this._consoleHisto ryAutocompleteChanged, this);
142
143 var historyData = this._consoleHistorySetting.get();
144 this._prompt.history().setHistoryData(historyData);
147 this._consoleHistoryAutocompleteChanged(); 145 this._consoleHistoryAutocompleteChanged();
148 146
149 this._updateFilterStatus(); 147 this._updateFilterStatus();
150 WebInspector.moduleSetting("consoleTimestampsEnabled").addChangeListener(thi s._consoleTimestampsSettingChanged, this); 148 WebInspector.moduleSetting("consoleTimestampsEnabled").addChangeListener(thi s._consoleTimestampsSettingChanged, this);
151 149
152 this._registerWithMessageSink(); 150 this._registerWithMessageSink();
153 WebInspector.targetManager.observeTargets(this); 151 WebInspector.targetManager.observeTargets(this);
154 152
155 this._initConsoleMessages(); 153 this._initConsoleMessages();
156 154
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 this._fetchMultitargetMessages(); 206 this._fetchMultitargetMessages();
209 }, 207 },
210 208
211 _fetchMultitargetMessages: function() 209 _fetchMultitargetMessages: function()
212 { 210 {
213 WebInspector.multitargetConsoleModel.addEventListener(WebInspector.Conso leModel.Events.ConsoleCleared, this._consoleCleared, this); 211 WebInspector.multitargetConsoleModel.addEventListener(WebInspector.Conso leModel.Events.ConsoleCleared, this._consoleCleared, this);
214 WebInspector.multitargetConsoleModel.addEventListener(WebInspector.Conso leModel.Events.MessageAdded, this._onConsoleMessageAdded, this); 212 WebInspector.multitargetConsoleModel.addEventListener(WebInspector.Conso leModel.Events.MessageAdded, this._onConsoleMessageAdded, this);
215 WebInspector.multitargetConsoleModel.addEventListener(WebInspector.Conso leModel.Events.MessageUpdated, this._onConsoleMessageUpdated, this); 213 WebInspector.multitargetConsoleModel.addEventListener(WebInspector.Conso leModel.Events.MessageUpdated, this._onConsoleMessageUpdated, this);
216 WebInspector.multitargetConsoleModel.addEventListener(WebInspector.Conso leModel.Events.CommandEvaluated, this._commandEvaluated, this); 214 WebInspector.multitargetConsoleModel.addEventListener(WebInspector.Conso leModel.Events.CommandEvaluated, this._commandEvaluated, this);
217 WebInspector.multitargetConsoleModel.messages().forEach(this._addConsole Message, this); 215 WebInspector.multitargetConsoleModel.messages().forEach(this._addConsole Message, this);
216 this._viewport.invalidate();
218 }, 217 },
219 218
220 /** 219 /**
221 * @override 220 * @override
222 * @return {number} 221 * @return {number}
223 */ 222 */
224 itemCount: function() 223 itemCount: function()
225 { 224 {
226 return this._visibleViewMessages.length; 225 return this._visibleViewMessages.length;
227 }, 226 },
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 }, 328 },
330 329
331 willHide: function() 330 willHide: function()
332 { 331 {
333 this._hidePromptSuggestBox(); 332 this._hidePromptSuggestBox();
334 }, 333 },
335 334
336 wasShown: function() 335 wasShown: function()
337 { 336 {
338 this._viewport.refresh(); 337 this._viewport.refresh();
339 if (!this._prompt.isCaretInsidePrompt()) 338 this.focus();
dgozman 2016/09/14 04:26:18 Why this? I think the code which shows ConsoleView
einbinder 2016/09/14 20:21:06 The old code focused the prompt. I agree that its
340 this._prompt.moveCaretToEndOfPrompt();
341 }, 339 },
342 340
343 focus: function() 341 focus: function()
344 { 342 {
345 if (this._promptElement === WebInspector.currentFocusElement()) 343 if (this._prompt.hasFocus())
346 return; 344 return;
347 // Set caret position before setting focus in order to avoid scrolling 345 // Set caret position before setting focus in order to avoid scrolling
348 // by focus(). 346 // by focus().
349 this._prompt.moveCaretToEndOfPrompt(); 347 this._prompt.moveCaretToEndOfPrompt();
350 WebInspector.setCurrentFocusElement(this._promptElement); 348 this._prompt.focus();
351 }, 349 },
352 350
353 restoreScrollPositions: function() 351 restoreScrollPositions: function()
354 { 352 {
355 if (this._viewport.stickToBottom()) 353 if (this._viewport.stickToBottom())
356 this._immediatelyScrollToBottom(); 354 this._immediatelyScrollToBottom();
357 else 355 else
358 WebInspector.Widget.prototype.restoreScrollPositions.call(this); 356 WebInspector.Widget.prototype.restoreScrollPositions.call(this);
359 }, 357 },
360 358
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 return new WebInspector.ConsoleViewMessage(message, this._linkifier, nestingLevel); 548 return new WebInspector.ConsoleViewMessage(message, this._linkifier, nestingLevel);
551 } 549 }
552 }, 550 },
553 551
554 _consoleCleared: function() 552 _consoleCleared: function()
555 { 553 {
556 this._currentMatchRangeIndex = -1; 554 this._currentMatchRangeIndex = -1;
557 this._consoleMessages = []; 555 this._consoleMessages = [];
558 this._updateMessageList(); 556 this._updateMessageList();
559 this._hidePromptSuggestBox(); 557 this._hidePromptSuggestBox();
558 this._viewport.setStickToBottom(true);
560 this._linkifier.reset(); 559 this._linkifier.reset();
561 }, 560 },
562 561
563 _handleContextMenuEvent: function(event) 562 _handleContextMenuEvent: function(event)
564 { 563 {
565 if (event.target.enclosingNodeOrSelfWithNodeName("a")) 564 if (event.target.enclosingNodeOrSelfWithNodeName("a"))
566 return; 565 return;
567 566
568 var contextMenu = new WebInspector.ContextMenu(event); 567 var contextMenu = new WebInspector.ContextMenu(event);
569 if (event.target.isSelfOrDescendant(this._promptElement)) { 568 if (event.target.isSelfOrDescendant(this._promptElement)) {
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 var enabled = /** @type {boolean} */ (event.data); 708 var enabled = /** @type {boolean} */ (event.data);
710 WebInspector.targetManager.targets().forEach(function(target) {target.ne tworkAgent().setMonitoringXHREnabled(enabled);}); 709 WebInspector.targetManager.targets().forEach(function(target) {target.ne tworkAgent().setMonitoringXHREnabled(enabled);});
711 }, 710 },
712 711
713 /** 712 /**
714 * @param {!Event} event 713 * @param {!Event} event
715 */ 714 */
716 _messagesClicked: function(event) 715 _messagesClicked: function(event)
717 { 716 {
718 var targetElement = event.deepElementFromPoint(); 717 var targetElement = event.deepElementFromPoint();
719 if (!this._prompt.isCaretInsidePrompt() && (!targetElement || targetElem ent.isComponentSelectionCollapsed())) 718 if (!targetElement || targetElement.isComponentSelectionCollapsed())
720 this._prompt.moveCaretToEndOfPrompt(); 719 this.focus();
721 var groupMessage = event.target.enclosingNodeOrSelfWithClass("console-gr oup-title"); 720 var groupMessage = event.target.enclosingNodeOrSelfWithClass("console-gr oup-title");
722 if (!groupMessage) 721 if (!groupMessage)
723 return; 722 return;
724 var consoleGroupViewMessage = groupMessage.parentElement.message; 723 var consoleGroupViewMessage = groupMessage.parentElement.message;
725 consoleGroupViewMessage.setCollapsed(!consoleGroupViewMessage.collapsed( )); 724 consoleGroupViewMessage.setCollapsed(!consoleGroupViewMessage.collapsed( ));
726 this._updateMessageList(); 725 this._updateMessageList();
727 }, 726 },
728 727
729 _registerShortcuts: function() 728 _registerShortcuts: function()
730 { 729 {
(...skipping 29 matching lines...) Expand all
760 shortcut.makeDescriptor("P", shortcut.Modifiers.Alt) 759 shortcut.makeDescriptor("P", shortcut.Modifiers.Alt)
761 ]; 760 ];
762 section.addRelatedKeys(keys, WebInspector.UIString("Next/previous co mmand")); 761 section.addRelatedKeys(keys, WebInspector.UIString("Next/previous co mmand"));
763 } 762 }
764 763
765 section.addKey(shortcut.makeDescriptor(shortcut.Keys.Enter), WebInspecto r.UIString("Execute command")); 764 section.addKey(shortcut.makeDescriptor(shortcut.Keys.Enter), WebInspecto r.UIString("Execute command"));
766 }, 765 },
767 766
768 _clearPromptBackwards: function() 767 _clearPromptBackwards: function()
769 { 768 {
770 this._prompt.setText(""); 769 if (this._prompt)
lushnikov 2016/09/14 01:11:21 how could there be no prompt?
einbinder 2016/09/14 20:21:06 Got lost in a merge.
770 this._prompt.setText("");
771 }, 771 },
772 772
773 /**
774 * @param {!Event} event
775 */
773 _promptKeyDown: function(event) 776 _promptKeyDown: function(event)
774 { 777 {
775 if (event.key === "PageUp") { 778 var keyboardEvent = /** @type {!KeyboardEvent} */ (event);
779 if (keyboardEvent.key === "PageUp") {
776 this._updateStickToBottomOnWheel(); 780 this._updateStickToBottomOnWheel();
777 return; 781 return;
778 } else if (isEnterKey(event)) { 782 } else if (isEnterKey(keyboardEvent)) {
779 this._enterKeyPressed(event); 783 this._enterKeyPressed(keyboardEvent);
780 return; 784 return;
781 } 785 }
782 786
783 var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event); 787 var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(keyboardEv ent);
784 var handler = this._shortcuts[shortcut]; 788 var handler = this._shortcuts[shortcut];
785 if (handler) { 789 if (handler) {
786 handler(); 790 handler();
787 event.preventDefault(); 791 keyboardEvent.preventDefault();
788 } 792 }
789 }, 793 },
790 794
791 _enterKeyPressed: function(event) 795 _enterKeyPressed: function(event)
792 { 796 {
793 if (event.altKey || event.ctrlKey || event.shiftKey) 797 if (!this._prompt || event.altKey || event.ctrlKey || event.shiftKey || !this._prompt.hasFocus())
dgozman 2016/09/14 04:26:18 prompt is always there.
einbinder 2016/09/14 20:21:06 Done.
794 return; 798 return;
795 799
796 event.consume(true); 800 event.consume(true);
797 801
798 this._prompt.clearAutocomplete(); 802 this._prompt.clearAutocomplete();
799 803
800 var str = this._prompt.text(); 804 var str = this._prompt.text();
801 if (!str.length) 805 if (!str.length)
802 return; 806 return;
803 this._appendCommand(str, true); 807 this._appendCommand(str, true);
(...skipping 18 matching lines...) Expand all
822 message.setOriginatingMessage(originatingConsoleMessage); 826 message.setOriginatingMessage(originatingConsoleMessage);
823 result.target().consoleModel.addMessage(message); 827 result.target().consoleModel.addMessage(message);
824 }, 828 },
825 829
826 /** 830 /**
827 * @param {string} text 831 * @param {string} text
828 * @param {boolean} useCommandLineAPI 832 * @param {boolean} useCommandLineAPI
829 */ 833 */
830 _appendCommand: function(text, useCommandLineAPI) 834 _appendCommand: function(text, useCommandLineAPI)
831 { 835 {
832 this._prompt.setText(""); 836 if (this._prompt)
dgozman 2016/09/14 04:26:18 ditto
einbinder 2016/09/14 20:21:06 Done.
837 this._prompt.setText("");
833 var currentExecutionContext = WebInspector.context.flavor(WebInspector.E xecutionContext); 838 var currentExecutionContext = WebInspector.context.flavor(WebInspector.E xecutionContext);
834 if (currentExecutionContext) { 839 if (currentExecutionContext) {
835 WebInspector.ConsoleModel.evaluateCommandInConsole(currentExecutionC ontext, text, useCommandLineAPI); 840 WebInspector.ConsoleModel.evaluateCommandInConsole(currentExecutionC ontext, text, useCommandLineAPI);
836 if (WebInspector.inspectorView.currentPanel() && WebInspector.inspec torView.currentPanel().name === "console") 841 if (WebInspector.inspectorView.currentPanel() && WebInspector.inspec torView.currentPanel().name === "console")
837 WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Ac tion.CommandEvaluatedInConsolePanel); 842 WebInspector.userMetrics.actionTaken(WebInspector.UserMetrics.Ac tion.CommandEvaluatedInConsolePanel);
838 } 843 }
839 }, 844 },
840 845
841 /** 846 /**
842 * @param {!WebInspector.Event} event 847 * @param {!WebInspector.Event} event
843 */ 848 */
844 _commandEvaluated: function(event) 849 _commandEvaluated: function(event)
845 { 850 {
851 if (!this._prompt)
dgozman 2016/09/14 04:26:18 ditto
einbinder 2016/09/14 20:21:06 Done.
852 return;
846 var data = /** @type {{result: ?WebInspector.RemoteObject, text: string, commandMessage: !WebInspector.ConsoleMessage, exceptionDetails: (!RuntimeAgent. ExceptionDetails|undefined)}} */ (event.data); 853 var data = /** @type {{result: ?WebInspector.RemoteObject, text: string, commandMessage: !WebInspector.ConsoleMessage, exceptionDetails: (!RuntimeAgent. ExceptionDetails|undefined)}} */ (event.data);
847 this._prompt.history().pushHistoryItem(data.text); 854 this._prompt.history().pushHistoryItem(data.text);
848 this._consoleHistorySetting.set(this._prompt.history().historyData().sli ce(-WebInspector.ConsoleView.persistedHistorySize)); 855 this._consoleHistorySetting.set(this._prompt.history().historyData().sli ce(-WebInspector.ConsoleView.persistedHistorySize));
849 this._printResult(data.result, data.commandMessage, data.exceptionDetail s); 856 this._printResult(data.result, data.commandMessage, data.exceptionDetail s);
850 }, 857 },
851 858
852 /** 859 /**
853 * @override 860 * @override
854 * @return {!Array.<!Element>} 861 * @return {!Array.<!Element>}
855 */ 862 */
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
1415 return true; 1422 return true;
1416 } 1423 }
1417 return false; 1424 return false;
1418 } 1425 }
1419 } 1426 }
1420 1427
1421 /** 1428 /**
1422 * @typedef {{messageIndex: number, matchIndex: number}} 1429 * @typedef {{messageIndex: number, matchIndex: number}}
1423 */ 1430 */
1424 WebInspector.ConsoleView.RegexMatchRange; 1431 WebInspector.ConsoleView.RegexMatchRange;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698