Bug 585237 - Limit the number of lines displayed in the Web Console. r=sdwilsh a=blocking2.0+

This commit is contained in:
Patrick Walton 2010-09-08 17:08:58 -07:00
parent 1c699544d4
commit f78f8c9b7e
3 changed files with 139 additions and 0 deletions

View File

@ -111,6 +111,11 @@ const NEW_GROUP_DELAY = 5000;
// search.
const SEARCH_DELAY = 200;
// The number of lines that are displayed in the console output by default.
// The user can change this number by adjusting the hidden
// "devtools.hud.loglimit" preference.
const DEFAULT_LOG_LIMIT = 200;
const ERRORS = { LOG_MESSAGE_MISSING_ARGS:
"Missing arguments: aMessage, aConsoleNode and aMessageNode are required.",
CANNOT_GET_HUD: "Cannot getHeads Up Display with provided ID",
@ -1094,6 +1099,48 @@ NetworkPanel.prototype =
}
}
///////////////////////////////////////////////////////////////////////////
//// Private utility functions for the HUD service
/**
* Destroys lines of output if more lines than the allowed log limit are
* present.
*
* @param nsIDOMNode aConsoleNode
* The DOM node that holds the output of the console.
* @returns void
*/
function pruneConsoleOutputIfNecessary(aConsoleNode)
{
let logLimit;
try {
let prefBranch = Services.prefs.getBranch("devtools.hud.");
logLimit = prefBranch.getIntPref("loglimit");
} catch (e) {
logLimit = DEFAULT_LOG_LIMIT;
}
let messageNodes = aConsoleNode.querySelectorAll(".hud-msg-node");
for (let i = 0; i < messageNodes.length - logLimit; i++) {
let messageNode = messageNodes[i];
let groupNode = messageNode.parentNode;
if (!groupNode.classList.contains("hud-group")) {
throw new Error("pruneConsoleOutputIfNecessary: message node not in a " +
"HUD group");
}
groupNode.removeChild(messageNode);
// If there are no more children, then remove the group itself.
if (!groupNode.querySelector(".hud-msg-node")) {
groupNode.parentNode.removeChild(groupNode);
}
}
}
///////////////////////////////////////////////////////////////////////////
//// The HUD service
function HUD_SERVICE()
{
// TODO: provide mixins for FENNEC: bug 568621
@ -1861,6 +1908,8 @@ HUD_SERVICE.prototype =
// store this message in the storage module:
this.storage.recordEntry(aMessage.hudId, aMessage);
pruneConsoleOutputIfNecessary(aConsoleNode);
},
/**
@ -3915,6 +3964,7 @@ JSTerm.prototype = {
lastGroupNode.appendChild(node);
ConsoleUtils.scrollToVisible(node);
pruneConsoleOutputIfNecessary(this.outputNode);
},
/**
@ -3954,6 +4004,7 @@ JSTerm.prototype = {
lastGroupNode.appendChild(node);
ConsoleUtils.scrollToVisible(node);
pruneConsoleOutputIfNecessary(this.outputNode);
},
clearOutput: function JST_clearOutput()

View File

@ -45,6 +45,7 @@ include $(topsrcdir)/config/rules.mk
_BROWSER_TEST_FILES = \
browser_HUDServiceTestsAll.js \
browser_webconsole_bug_585237_line_limit.js \
browser_webconsole_bug_588967_input_expansion.js \
browser_webconsole_netlogging.js \
browser_webconsole_bug_581231_close_button.js \

View File

@ -0,0 +1,87 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* ***** BEGIN LICENSE BLOCK *****
* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*
* Contributor(s):
* Patrick Walton <pcwalton@mozilla.com>
*
* ***** END LICENSE BLOCK ***** */
// Tests that the Web Console limits the number of lines displayed according to
// the user's preferences.
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/HUDService.jsm");
const TEST_URI = "http://example.com/browser/toolkit/components/console/hudservice/tests/browser/test-console.html";
function test() {
waitForExplicitFinish();
content.location.href = TEST_URI;
waitForFocus(onFocus);
}
function onFocus() {
gBrowser.selectedBrowser.addEventListener("DOMContentLoaded", testLineLimit,
false);
}
function testLineLimit() {
gBrowser.selectedBrowser.removeEventListener("DOMContentLoaded",
testLineLimit, false);
HUDService.activateHUDForContext(gBrowser.selectedTab);
let hudId = HUDService.displaysIndex()[0];
let console = gBrowser.selectedBrowser.contentWindow.wrappedJSObject.console;
let hudBox = HUDService.getHeadsUpDisplay(hudId);
let prefBranch = Services.prefs.getBranch("devtools.hud.");
prefBranch.setIntPref("loglimit", 20);
for (let i = 0; i < 20; i++) {
console.log("foo");
}
is(countMessageNodes(), 20, "there are 20 message nodes in the output " +
"when the log limit is set to 20");
isnot(countGroupNodes(), 0, "there is at least one group node in the " +
"output when the log limit is set to 20");
console.log("bar");
is(countMessageNodes(), 20, "there are still 20 message nodes in the " +
"output when adding one more");
prefBranch.setIntPref("loglimit", 30);
for (let i = 0; i < 20; i++) {
console.log("boo");
}
is(countMessageNodes(), 30, "there are 30 message nodes in the output " +
"when the log limit is set to 30");
prefBranch.setIntPref("loglimit", 0);
console.log("baz");
is(countMessageNodes(), 0, "there are no message nodes in the output when " +
"the log limit is set to zero");
is(countGroupNodes(), 0, "there are no group nodes in the output when the " +
"log limit is set to zero");
prefBranch.clearUserPref("loglimit");
HUDService.deactivateHUDForContext(gBrowser.selectedTab);
finish();
}
function countMessageNodes() {
let hudId = HUDService.displaysIndex()[0];
let hudBox = HUDService.getHeadsUpDisplay(hudId);
return hudBox.querySelectorAll(".hud-msg-node").length;
}
function countGroupNodes() {
let hudId = HUDService.displaysIndex()[0];
let hudBox = HUDService.getHeadsUpDisplay(hudId);
return hudBox.querySelectorAll(".hud-group").length;
}