Changeset 141269 in webkit


Ignore:
Timestamp:
Jan 30, 2013 7:10:57 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

Web Inspector: Filters on Console panel
https://bugs.webkit.org/show_bug.cgi?id=107813

Source/WebCore:

The problem is that third-party libraries may spam javascript console with internal
messages. Now there's filter context-menu option, which allows to hide/show messages
sent from specific scripts or urls.

Patch by Dmitry Zvorygin <zvorygin@chromium.org> on 2013-01-30
Reviewed by Pavel Feldman.

  • English.lproj/localizedStrings.js:
  • inspector/front-end/ConsoleMessage.js:

(WebInspector.ConsoleMessageImpl.prototype.appendUndefined):
(WebInspector.ConsoleMessageImpl.prototype._printArray):
(WebInspector.ConsoleMessageImpl.prototype._highlightSearchResultsInElement):

  • inspector/front-end/ConsolePanel.js:

(WebInspector.ConsolePanel.prototype.performSearch):

  • inspector/front-end/ConsoleView.js:

(WebInspector.ConsoleView.get this):
(WebInspector.ConsoleView.prototype._consoleMessageAdded):
(WebInspector.ConsoleView.prototype._appendConsoleMessage):
(WebInspector.ConsoleView.prototype._consoleCleared):
(WebInspector.ConsoleView.prototype._handleContextMenuEvent.get var):
(WebInspector.ConsoleView.prototype._handleContextMenuEvent.set get contextMenu):
(WebInspector.ConsoleView.prototype._shouldBeVisible):
(WebInspector.ConsoleView.prototype._updateMessageList):
(WebInspector.ConsoleGroup.prototype.addMessage):

  • inspector/front-end/ContextMenu.js:

(WebInspector.ContextMenuItem.prototype.isEnabled):
(WebInspector.ContextMenuItem.prototype.setEnabled):

  • inspector/front-end/Settings.js:

LayoutTests:

The problem is that third-party libraries may spam javascript console
with internal messages. Now there's filter context-menu option, which
allows to hide/show messages sent from specific scripts or urls.

Patch by Dmitry Zvorygin <zvorygin@chromium.org> on 2013-01-30
Reviewed by Pavel Feldman.

  • http/tests/inspector/console-test.js:

(initialize_ConsoleTest.InspectorTest.dumpConsoleMessages):
(initialize_ConsoleTest.InspectorTest.dumpConsoleMessagesWithStyles):
(initialize_ConsoleTest.InspectorTest.dumpConsoleMessagesWithClasses):
(initialize_ConsoleTest.InspectorTest.expandConsoleMessages):
(initialize_ConsoleTest.InspectorTest.checkConsoleMessagesDontHaveParameters):
(initialize_ConsoleTest):

  • http/tests/inspector/stacktraces/resources/stacktrace-test.js:

(test.addMessage):
(test):

  • inspector/console/console-filter-test-expected.txt: Added.
  • inspector/console/console-filter-test.html: Added.
  • inspector/console/resources/log-source.js: Added.

(log2):

Location:
trunk
Files:
3 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r141266 r141269  
     12013-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
    1272013-01-30  Ádám Kallai  <kadam@inf.u-szeged.hu>
    228
  • trunk/LayoutTests/http/tests/inspector/console-test.js

    r134166 r141269  
    1010{
    1111    var result = [];
    12     var messages = WebInspector.consoleView.messages;
     12    var messages = WebInspector.consoleView._visibleMessages;
    1313    for (var i = 0; i < messages.length; ++i) {
    1414        var element = messages[i].toMessageElement();
     
    2525{
    2626    var result = [];
    27     var messages = WebInspector.consoleView.messages;
     27    var messages = WebInspector.consoleView._visibleMessages;
    2828    for (var i = 0; i < messages.length; ++i) {
    2929        var element = messages[i].toMessageElement();
     
    3737InspectorTest.dumpConsoleMessagesWithClasses = function(sortMessages) {
    3838    var result = [];
    39     var messages = WebInspector.consoleView.messages;
     39    var messages = WebInspector.consoleView._visibleMessages;
    4040    for (var i = 0; i < messages.length; ++i) {
    4141        var element = messages[i].toMessageElement();
     
    5050InspectorTest.expandConsoleMessages = function()
    5151{
    52     var messages = WebInspector.consoleView.messages;
     52    var messages = WebInspector.consoleView._visibleMessages;
    5353    for (var i = 0; i < messages.length; ++i) {
    5454        var element = messages[i].toMessageElement();
     
    6464InspectorTest.checkConsoleMessagesDontHaveParameters = function()
    6565{
    66     var messages = WebInspector.console.messages;
     66    var messages = WebInspector.consoleView._visibleMessages;
    6767    for (var i = 0; i < messages.length; ++i) {
    6868        var m = messages[i];
  • trunk/LayoutTests/http/tests/inspector/stacktraces/resources/stacktrace-test.js

    r135042 r141269  
    33
    44    function addMessage(message) {
    5         var messages = WebInspector.consoleView.messages;
     5        var messages = WebInspector.consoleView._visibleMessages;
    66        for (var i = 0; i < messages.length; ++i) {
    77            var m = messages[i];
  • trunk/Source/WebCore/ChangeLog

    r141265 r141269  
     12013-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
    1342013-01-20  Philippe Normand  <pnormand@igalia.com>
    235
  • trunk/Source/WebCore/English.lproj/localizedStrings.js

    r141250 r141269  
    196196localizedStrings["Expires / Max-Age"] = "Expires / Max-Age";
    197197localizedStrings["File size"] = "File size";
     198localizedStrings["Filter"] = "Filter";
    198199localizedStrings["Fit in window"] = "Fit in window";
    199200localizedStrings["Force Element State"] = "Force Element State";
     
    224225localizedStrings["Hex Colors"] = "Hex Colors";
    225226localizedStrings["Hide console."] = "Hide console.";
     227localizedStrings["Hide messages from %s"] = "Hide messages from %s";
    226228localizedStrings["Image"] = "Image";
    227229localizedStrings["Images"] = "Images";
     
    439441localizedStrings["Use small resource rows."] = "Use small resource rows.";
    440442localizedStrings["Used Heap Size"] = "Used Heap Size";
     443localizedStrings["Unhide all"] = "Unhide all";
    441444localizedStrings["Value"] = "Value";
    442445localizedStrings["Waiting"] = "Waiting";
  • trunk/Source/WebCore/inspector/front-end/ConsoleMessage.js

    r140813 r141269  
    248248
    249249    /**
     250     * @param {Object} output
    250251     * @param {boolean=} forceObjectFormat
    251252     * @param {boolean=} includePreview
     
    448449            if (index - lastNonEmptyIndex <= 1)
    449450                return;
    450             var span = elem.createChild(span, "console-formatted-undefined");
     451            var span = elem.createChild("span", "console-formatted-undefined");
    451452            span.textContent = WebInspector.UIString("undefined × %d", index - lastNonEmptyIndex - 1);
    452453        }
     
    481482    _formatWithSubstitutionString: function(parameters, formattedResult)
    482483    {
    483         var formatters = {}
     484        var formatters = {};
    484485
    485486        function parameterFormatter(force, obj)
     
    596597        var text = element.textContent;
    597598        var match = regexObject.exec(text);
    598         var offset = 0;
    599599        var matchRanges = [];
    600600        while (match) {
  • trunk/Source/WebCore/inspector/front-end/ConsolePanel.js

    r130149 r141269  
    8282
    8383        this._searchResults = [];
    84         var messages = WebInspector.consoleView.messages;
     84        var messages = WebInspector.console.messages;
    8585        for (var i = 0; i < messages.length; i++) {
    8686            if (messages[i].matchesRegex(this._searchRegex)) {
  • trunk/Source/WebCore/inspector/front-end/ConsoleView.js

    r139972 r141269  
    3838
    3939    this.element.id = "console-view";
    40     this.messages = [];
     40    this._messageURLFilters = WebInspector.settings.messageURLFilters.get();
     41    this._visibleMessages = [];
     42    this._urlToMessageCount = {};
    4143
    4244    this._clearConsoleButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear console log."), "clear-status-bar-item");
     
    382384    _consoleMessageAdded: function(event)
    383385    {
    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)
    388397    {
    389398        // this.messagesElement.isScrolledToBottom() is forcing style recalculation.
    390399        // We just skip it if the scroll action has been scheduled.
    391         if (!this._isScrollIntoViewScheduled() && ((msg instanceof WebInspector.ConsoleCommandResult) || this.messagesElement.isScrolledToBottom()))
     400        if (!this._isScrollIntoViewScheduled() && ((message instanceof WebInspector.ConsoleCommandResult) || this.messagesElement.isScrolledToBottom()))
    392401            this._scheduleScrollIntoView();
    393402
    394         this.messages.push(msg);
    395 
    396         if (msg.type === WebInspector.ConsoleMessage.MessageType.EndGroup) {
     403        this._visibleMessages.push(message);
     404
     405        if (message.type === WebInspector.ConsoleMessage.MessageType.EndGroup) {
    397406            var parentGroup = this.currentGroup.parentGroup
    398407            if (parentGroup)
    399408                this.currentGroup = parentGroup;
    400409        } else {
    401             if (msg.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) {
    402411                var group = new WebInspector.ConsoleGroup(this.currentGroup);
    403412                this.currentGroup.messagesElement.appendChild(group.element);
     
    405414            }
    406415
    407             this.currentGroup.addMessage(msg);
    408         }
    409 
    410         this.dispatchEventToListeners(WebInspector.ConsoleView.Events.EntryAdded, msg);
     416            this.currentGroup.addMessage(message);
     417        }
     418
     419        this.dispatchEventToListeners(WebInspector.ConsoleView.Events.EntryAdded, message);
    411420    },
    412421
     
    414423    {
    415424        this._scrolledToBottom = true;
    416         this.messages = [];
     425        this._visibleMessages = [];
    417426
    418427        this.currentGroup = this.topGroup;
     
    448457        }
    449458        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);
    450481
    451482        contextMenu.appendSeparator();
     
    460491
    461492        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;
    462559    },
    463560
     
    709806
    710807WebInspector.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) {
    716817            this.messagesElement.parentNode.insertBefore(element, this.messagesElement);
    717818            element.addEventListener("click", this._titleClicked.bind(this), false);
    718819            var groupElement = element.enclosingNodeOrSelfWithClass("console-group");
    719             if (groupElement && msg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed)
     820            if (groupElement && message.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed)
    720821                groupElement.addStyleClass("collapsed");
    721822        } else
    722             this.messagesElement.appendChild(element);
    723 
    724         if (element.previousSibling && msg.originatingCommand && element.previousSibling.command === msg.originatingCommand)
     823            this.messagesElement.insertBefore(element, node);
     824
     825        if (element.previousSibling && message.originatingCommand && element.previousSibling.command === message.originatingCommand)
    725826            element.previousSibling.addStyleClass("console-adjacent-user-command-result");
    726827    },
  • trunk/Source/WebCore/inspector/front-end/ContextMenu.js

    r134911 r141269  
    5959    },
    6060
     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
    6177    _buildDescriptor: function()
    6278    {
     
    87103WebInspector.ContextSubMenuItem.prototype = {
    88104    /**
     105     * @param {string} label
     106     * @param {function} handler
    89107     * @param {boolean=} disabled
     108     * @return {WebInspector.ContextMenuItem}
    90109     */
    91110    appendItem: function(label, handler, disabled)
     
    97116    },
    98117
     118    /**
     119     * @param {string} label
     120     * @param {boolean=} disabled
     121     * @return {WebInspector.ContextMenuItem}
     122     */
    99123    appendSubMenuItem: function(label, disabled)
    100124    {
  • trunk/Source/WebCore/inspector/front-end/Settings.js

    r141249 r141269  
    122122    this.workerInspectorWidth = this.createSetting("workerInspectorWidth", 600);
    123123    this.workerInspectorHeight = this.createSetting("workerInspectorHeight", 600);
     124    this.messageURLFilters = this.createSetting("messageURLFilters", {});
    124125
    125126    // 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.