Changeset 141269 in webkit
- Timestamp:
- Jan 30, 2013 7:10:57 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r141266 r141269 1 2013-01-30 Dmitry Zvorygin <zvorygin@chromium.org> 2 3 Web Inspector: Filters on Console panel 4 https://bugs.webkit.org/show_bug.cgi?id=107813 5 6 The problem is that third-party libraries may spam javascript console 7 with internal messages. Now there's filter context-menu option, which 8 allows to hide/show messages sent from specific scripts or urls. 9 10 Reviewed by Pavel Feldman. 11 12 * http/tests/inspector/console-test.js: 13 (initialize_ConsoleTest.InspectorTest.dumpConsoleMessages): 14 (initialize_ConsoleTest.InspectorTest.dumpConsoleMessagesWithStyles): 15 (initialize_ConsoleTest.InspectorTest.dumpConsoleMessagesWithClasses): 16 (initialize_ConsoleTest.InspectorTest.expandConsoleMessages): 17 (initialize_ConsoleTest.InspectorTest.checkConsoleMessagesDontHaveParameters): 18 (initialize_ConsoleTest): 19 * http/tests/inspector/stacktraces/resources/stacktrace-test.js: 20 (test.addMessage): 21 (test): 22 * inspector/console/console-filter-test-expected.txt: Added. 23 * inspector/console/console-filter-test.html: Added. 24 * inspector/console/resources/log-source.js: Added. 25 (log2): 26 1 27 2013-01-30 Ádám Kallai <kadam@inf.u-szeged.hu> 2 28 -
trunk/LayoutTests/http/tests/inspector/console-test.js
r134166 r141269 10 10 { 11 11 var result = []; 12 var messages = WebInspector.consoleView. messages;12 var messages = WebInspector.consoleView._visibleMessages; 13 13 for (var i = 0; i < messages.length; ++i) { 14 14 var element = messages[i].toMessageElement(); … … 25 25 { 26 26 var result = []; 27 var messages = WebInspector.consoleView. messages;27 var messages = WebInspector.consoleView._visibleMessages; 28 28 for (var i = 0; i < messages.length; ++i) { 29 29 var element = messages[i].toMessageElement(); … … 37 37 InspectorTest.dumpConsoleMessagesWithClasses = function(sortMessages) { 38 38 var result = []; 39 var messages = WebInspector.consoleView. messages;39 var messages = WebInspector.consoleView._visibleMessages; 40 40 for (var i = 0; i < messages.length; ++i) { 41 41 var element = messages[i].toMessageElement(); … … 50 50 InspectorTest.expandConsoleMessages = function() 51 51 { 52 var messages = WebInspector.consoleView. messages;52 var messages = WebInspector.consoleView._visibleMessages; 53 53 for (var i = 0; i < messages.length; ++i) { 54 54 var element = messages[i].toMessageElement(); … … 64 64 InspectorTest.checkConsoleMessagesDontHaveParameters = function() 65 65 { 66 var messages = WebInspector.console .messages;66 var messages = WebInspector.consoleView._visibleMessages; 67 67 for (var i = 0; i < messages.length; ++i) { 68 68 var m = messages[i]; -
trunk/LayoutTests/http/tests/inspector/stacktraces/resources/stacktrace-test.js
r135042 r141269 3 3 4 4 function addMessage(message) { 5 var messages = WebInspector.consoleView. messages;5 var messages = WebInspector.consoleView._visibleMessages; 6 6 for (var i = 0; i < messages.length; ++i) { 7 7 var m = messages[i]; -
trunk/Source/WebCore/ChangeLog
r141265 r141269 1 2013-01-30 Dmitry Zvorygin <zvorygin@chromium.org> 2 3 Web Inspector: Filters on Console panel 4 https://bugs.webkit.org/show_bug.cgi?id=107813 5 6 The problem is that third-party libraries may spam javascript console with internal 7 messages. Now there's filter context-menu option, which allows to hide/show messages 8 sent from specific scripts or urls. 9 10 Reviewed by Pavel Feldman. 11 12 * English.lproj/localizedStrings.js: 13 * inspector/front-end/ConsoleMessage.js: 14 (WebInspector.ConsoleMessageImpl.prototype.appendUndefined): 15 (WebInspector.ConsoleMessageImpl.prototype._printArray): 16 (WebInspector.ConsoleMessageImpl.prototype._highlightSearchResultsInElement): 17 * inspector/front-end/ConsolePanel.js: 18 (WebInspector.ConsolePanel.prototype.performSearch): 19 * inspector/front-end/ConsoleView.js: 20 (WebInspector.ConsoleView.get this): 21 (WebInspector.ConsoleView.prototype._consoleMessageAdded): 22 (WebInspector.ConsoleView.prototype._appendConsoleMessage): 23 (WebInspector.ConsoleView.prototype._consoleCleared): 24 (WebInspector.ConsoleView.prototype._handleContextMenuEvent.get var): 25 (WebInspector.ConsoleView.prototype._handleContextMenuEvent.set get contextMenu): 26 (WebInspector.ConsoleView.prototype._shouldBeVisible): 27 (WebInspector.ConsoleView.prototype._updateMessageList): 28 (WebInspector.ConsoleGroup.prototype.addMessage): 29 * inspector/front-end/ContextMenu.js: 30 (WebInspector.ContextMenuItem.prototype.isEnabled): 31 (WebInspector.ContextMenuItem.prototype.setEnabled): 32 * inspector/front-end/Settings.js: 33 1 34 2013-01-20 Philippe Normand <pnormand@igalia.com> 2 35 -
trunk/Source/WebCore/English.lproj/localizedStrings.js
r141250 r141269 196 196 localizedStrings["Expires / Max-Age"] = "Expires / Max-Age"; 197 197 localizedStrings["File size"] = "File size"; 198 localizedStrings["Filter"] = "Filter"; 198 199 localizedStrings["Fit in window"] = "Fit in window"; 199 200 localizedStrings["Force Element State"] = "Force Element State"; … … 224 225 localizedStrings["Hex Colors"] = "Hex Colors"; 225 226 localizedStrings["Hide console."] = "Hide console."; 227 localizedStrings["Hide messages from %s"] = "Hide messages from %s"; 226 228 localizedStrings["Image"] = "Image"; 227 229 localizedStrings["Images"] = "Images"; … … 439 441 localizedStrings["Use small resource rows."] = "Use small resource rows."; 440 442 localizedStrings["Used Heap Size"] = "Used Heap Size"; 443 localizedStrings["Unhide all"] = "Unhide all"; 441 444 localizedStrings["Value"] = "Value"; 442 445 localizedStrings["Waiting"] = "Waiting"; -
trunk/Source/WebCore/inspector/front-end/ConsoleMessage.js
r140813 r141269 248 248 249 249 /** 250 * @param {Object} output 250 251 * @param {boolean=} forceObjectFormat 251 252 * @param {boolean=} includePreview … … 448 449 if (index - lastNonEmptyIndex <= 1) 449 450 return; 450 var span = elem.createChild( span, "console-formatted-undefined");451 var span = elem.createChild("span", "console-formatted-undefined"); 451 452 span.textContent = WebInspector.UIString("undefined × %d", index - lastNonEmptyIndex - 1); 452 453 } … … 481 482 _formatWithSubstitutionString: function(parameters, formattedResult) 482 483 { 483 var formatters = {} 484 var formatters = {}; 484 485 485 486 function parameterFormatter(force, obj) … … 596 597 var text = element.textContent; 597 598 var match = regexObject.exec(text); 598 var offset = 0;599 599 var matchRanges = []; 600 600 while (match) { -
trunk/Source/WebCore/inspector/front-end/ConsolePanel.js
r130149 r141269 82 82 83 83 this._searchResults = []; 84 var messages = WebInspector.console View.messages;84 var messages = WebInspector.console.messages; 85 85 for (var i = 0; i < messages.length; i++) { 86 86 if (messages[i].matchesRegex(this._searchRegex)) { -
trunk/Source/WebCore/inspector/front-end/ConsoleView.js
r139972 r141269 38 38 39 39 this.element.id = "console-view"; 40 this.messages = []; 40 this._messageURLFilters = WebInspector.settings.messageURLFilters.get(); 41 this._visibleMessages = []; 42 this._urlToMessageCount = {}; 41 43 42 44 this._clearConsoleButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear console log."), "clear-status-bar-item"); … … 382 384 _consoleMessageAdded: function(event) 383 385 { 384 this._appendConsoleMessage(event.data); 385 }, 386 387 _appendConsoleMessage: function(msg) 386 var message = /** @type {WebInspector.ConsoleMessage} */ (event.data); 387 if (this._urlToMessageCount[message.url]) 388 this._urlToMessageCount[message.url]++; 389 else 390 this._urlToMessageCount[message.url] = 1; 391 392 if (this._shouldBeVisible(message)) 393 this._appendConsoleMessage(message); 394 }, 395 396 _appendConsoleMessage: function(message) 388 397 { 389 398 // this.messagesElement.isScrolledToBottom() is forcing style recalculation. 390 399 // We just skip it if the scroll action has been scheduled. 391 if (!this._isScrollIntoViewScheduled() && ((m sginstanceof WebInspector.ConsoleCommandResult) || this.messagesElement.isScrolledToBottom()))400 if (!this._isScrollIntoViewScheduled() && ((message instanceof WebInspector.ConsoleCommandResult) || this.messagesElement.isScrolledToBottom())) 392 401 this._scheduleScrollIntoView(); 393 402 394 this. messages.push(msg);395 396 if (m sg.type === WebInspector.ConsoleMessage.MessageType.EndGroup) {403 this._visibleMessages.push(message); 404 405 if (message.type === WebInspector.ConsoleMessage.MessageType.EndGroup) { 397 406 var parentGroup = this.currentGroup.parentGroup 398 407 if (parentGroup) 399 408 this.currentGroup = parentGroup; 400 409 } else { 401 if (m sg.type === WebInspector.ConsoleMessage.MessageType.StartGroup || msg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) {410 if (message.type === WebInspector.ConsoleMessage.MessageType.StartGroup || message.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) { 402 411 var group = new WebInspector.ConsoleGroup(this.currentGroup); 403 412 this.currentGroup.messagesElement.appendChild(group.element); … … 405 414 } 406 415 407 this.currentGroup.addMessage(m sg);408 } 409 410 this.dispatchEventToListeners(WebInspector.ConsoleView.Events.EntryAdded, m sg);416 this.currentGroup.addMessage(message); 417 } 418 419 this.dispatchEventToListeners(WebInspector.ConsoleView.Events.EntryAdded, message); 411 420 }, 412 421 … … 414 423 { 415 424 this._scrolledToBottom = true; 416 this. messages = [];425 this._visibleMessages = []; 417 426 418 427 this.currentGroup = this.topGroup; … … 448 457 } 449 458 contextMenu.appendCheckboxItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Preserve log upon navigation" : "Preserve Log upon Navigation"), preserveLogItemAction.bind(this), WebInspector.settings.preserveConsoleLog.get()); 459 460 var sourceElement = event.target.enclosingNodeOrSelfWithClass("console-message"); 461 462 var filterSubMenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Filter")); 463 464 if (sourceElement && sourceElement.message.url) 465 filterSubMenu.appendItem(WebInspector.UIString("Hide messages from %s", new WebInspector.ParsedURL(sourceElement.message.url).displayName), this._addMessageURLFilter.bind(this, sourceElement.message.url)); 466 467 filterSubMenu.appendSeparator(); 468 var unhideAll = filterSubMenu.appendItem(WebInspector.UIString("Unhide all"), this._removeMessageURLFilter.bind(this)); 469 filterSubMenu.appendSeparator(); 470 471 var hasFilters = false; 472 for (var url in this._messageURLFilters) { 473 if (this._messageURLFilters.hasOwnProperty(url)) { 474 filterSubMenu.appendCheckboxItem(String.sprintf("%s (%d)", new WebInspector.ParsedURL(url).displayName, this._urlToMessageCount[url]), this._removeMessageURLFilter.bind(this, url), true); 475 hasFilters = true; 476 } 477 } 478 479 filterSubMenu.setEnabled(hasFilters || (sourceElement && sourceElement.message.url)); 480 unhideAll.setEnabled(hasFilters); 450 481 451 482 contextMenu.appendSeparator(); … … 460 491 461 492 contextMenu.show(); 493 }, 494 495 /** 496 * @param {string} url 497 * @private 498 */ 499 _addMessageURLFilter: function(url) 500 { 501 this._messageURLFilters[url] = true; 502 WebInspector.settings.messageURLFilters.set(this._messageURLFilters); 503 this._updateMessageList(); 504 }, 505 506 /** 507 * @param {string} url 508 * @private 509 */ 510 _removeMessageURLFilter: function(url) 511 { 512 if (!url) 513 this._messageURLFilters = {}; 514 else 515 delete this._messageURLFilters[url]; 516 517 WebInspector.settings.messageURLFilters.set(this._messageURLFilters); 518 519 this._updateMessageList(); 520 }, 521 522 /** 523 * @param {WebInspector.ConsoleMessage} message 524 * @return {boolean} 525 * @private 526 */ 527 _shouldBeVisible: function(message) 528 { 529 return !message.url || !this._messageURLFilters[message.url]; 530 }, 531 532 /** 533 * @private 534 */ 535 _updateMessageList: function() 536 { 537 var sourceMessages = WebInspector.console.messages; 538 var visibleMessageIndex = 0; 539 var newVisibleMessages = []; 540 for (var i = 0; i < sourceMessages.length; i++) { 541 var sourceMessage = sourceMessages[i]; 542 var visibleMessage = this._visibleMessages[visibleMessageIndex]; 543 544 if (visibleMessage === sourceMessage) { 545 visibleMessageIndex++; 546 if (this._shouldBeVisible(visibleMessage)) 547 newVisibleMessages.push(visibleMessage); 548 else 549 visibleMessage.toMessageElement().removeSelf(); 550 } else { 551 if (this._shouldBeVisible(sourceMessage)) { 552 this.currentGroup.addMessage(sourceMessage, visibleMessage ? visibleMessage.toMessageElement() : null); 553 newVisibleMessages.push(sourceMessage); 554 } 555 } 556 } 557 558 this._visibleMessages = newVisibleMessages; 462 559 }, 463 560 … … 709 806 710 807 WebInspector.ConsoleGroup.prototype = { 711 addMessage: function(msg) 712 { 713 var element = msg.toMessageElement(); 714 715 if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup || msg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) { 808 /** 809 * @param {WebInspector.ConsoleMessage} message 810 * @param {Node=} node 811 */ 812 addMessage: function(message, node) 813 { 814 var element = message.toMessageElement(); 815 816 if (message.type === WebInspector.ConsoleMessage.MessageType.StartGroup || message.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) { 716 817 this.messagesElement.parentNode.insertBefore(element, this.messagesElement); 717 818 element.addEventListener("click", this._titleClicked.bind(this), false); 718 819 var groupElement = element.enclosingNodeOrSelfWithClass("console-group"); 719 if (groupElement && m sg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed)820 if (groupElement && message.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) 720 821 groupElement.addStyleClass("collapsed"); 721 822 } else 722 this.messagesElement. appendChild(element);723 724 if (element.previousSibling && m sg.originatingCommand && element.previousSibling.command === msg.originatingCommand)823 this.messagesElement.insertBefore(element, node); 824 825 if (element.previousSibling && message.originatingCommand && element.previousSibling.command === message.originatingCommand) 725 826 element.previousSibling.addStyleClass("console-adjacent-user-command-result"); 726 827 }, -
trunk/Source/WebCore/inspector/front-end/ContextMenu.js
r134911 r141269 59 59 }, 60 60 61 /** 62 * @return {boolean} 63 */ 64 isEnabled: function() 65 { 66 return !this._disabled; 67 }, 68 69 /** 70 * @param {boolean} enabled 71 */ 72 setEnabled: function(enabled) 73 { 74 this._disabled = !enabled; 75 }, 76 61 77 _buildDescriptor: function() 62 78 { … … 87 103 WebInspector.ContextSubMenuItem.prototype = { 88 104 /** 105 * @param {string} label 106 * @param {function} handler 89 107 * @param {boolean=} disabled 108 * @return {WebInspector.ContextMenuItem} 90 109 */ 91 110 appendItem: function(label, handler, disabled) … … 97 116 }, 98 117 118 /** 119 * @param {string} label 120 * @param {boolean=} disabled 121 * @return {WebInspector.ContextMenuItem} 122 */ 99 123 appendSubMenuItem: function(label, disabled) 100 124 { -
trunk/Source/WebCore/inspector/front-end/Settings.js
r141249 r141269 122 122 this.workerInspectorWidth = this.createSetting("workerInspectorWidth", 600); 123 123 this.workerInspectorHeight = this.createSetting("workerInspectorHeight", 600); 124 this.messageURLFilters = this.createSetting("messageURLFilters", {}); 124 125 125 126 // If there are too many breakpoints in a storage, it is likely due to a recent bug that caused
Note: See TracChangeset
for help on using the changeset viewer.