Bug 659625 - part2: implement console.clear in devtools webconsole;r=bgrins

When receiving a console clear message, the webconsole should clear
the UI: remove all messages until the clear() message and close
the variables view sidebar if opened.

Add one integration tests to test console.clear calls from the content page.

MozReview-Commit-ID: GnBCBSmN1rk

--HG--
extra : rebase_source : 3bb9f99fa4ac8ed6772e325dba978ce3e6a0f202
extra : source : 671011b82100a598dd8368205bd625227bfdc060
This commit is contained in:
Julian Descottes 2016-04-12 08:09:41 +02:00
parent 0fac5939fc
commit 094aad9e14
6 changed files with 169 additions and 0 deletions

View File

@ -107,6 +107,11 @@ timerStarted=%S: timer started
# is the number of milliseconds.
timeEnd=%1$S: %2$Sms
# LOCALIZATION NOTE (consoleCleared): this string is displayed when receiving a
# call to console.clear() to let the user know the previous messages of the
# console have been removed programmatically.
consoleCleared=Console was cleared.
# LOCALIZATION NOTE (noCounterLabel): this string is used to display
# count-messages with no label provided.
noCounterLabel=<no label>

View File

@ -93,6 +93,7 @@ const CONSOLE_API_LEVELS_TO_SEVERITIES = {
warn: "warning",
info: "info",
log: "log",
clear: "log",
trace: "log",
table: "log",
debug: "log",

View File

@ -69,6 +69,7 @@ support-files =
test-closure-optimized-out.html
test-closures.html
test-console-assert.html
test-console-clear.html
test-console-count.html
test-console-count-external-file.js
test-console-extras.html
@ -157,6 +158,7 @@ skip-if = (e10s && (os == 'win' || os == 'mac')) # Bug 1243976
[browser_cached_messages.js]
[browser_console.js]
[browser_console_addonsdk_loader_exception.js]
[browser_console_clear_method.js]
[browser_console_clear_on_reload.js]
[browser_console_click_focus.js]
[browser_console_consolejsm_output.js]

View File

@ -0,0 +1,131 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Check that calls to console.clear from a script delete the messages
// previously logged.
"use strict";
add_task(function* () {
const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
"test/test-console-clear.html";
yield loadTab(TEST_URI);
let hud = yield openConsole();
ok(hud, "Web Console opened");
info("Check the console.clear() done on page load has been processed.");
yield waitForLog("Console was cleared", hud);
ok(hud.outputNode.textContent.includes("Console was cleared"),
"console.clear() message is displayed");
ok(!hud.outputNode.textContent.includes("log1"), "log1 not displayed");
ok(!hud.outputNode.textContent.includes("log2"), "log2 not displayed");
info("Logging two messages log3, log4");
ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
content.wrappedJSObject.console.log("log3");
content.wrappedJSObject.console.log("log4");
});
yield waitForLog("log3", hud);
yield waitForLog("log4", hud);
ok(hud.outputNode.textContent.includes("Console was cleared"),
"console.clear() message is still displayed");
ok(hud.outputNode.textContent.includes("log3"), "log3 is displayed");
ok(hud.outputNode.textContent.includes("log4"), "log4 is displayed");
info("Open the variables view sidebar for 'objFromPage'");
yield openSidebar("objFromPage", { a: 1 }, hud);
let sidebarClosed = hud.jsterm.once("sidebar-closed");
info("Call console.clear from the page");
ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
content.wrappedJSObject.console.clear();
});
// Cannot wait for "Console was cleared" here because such a message is
// already present and would yield immediately.
info("Wait for variables view sidebar to be closed after console.clear()");
yield sidebarClosed;
ok(!hud.outputNode.textContent.includes("log3"), "log3 not displayed");
ok(!hud.outputNode.textContent.includes("log4"), "log4 not displayed");
ok(hud.outputNode.textContent.includes("Console was cleared"),
"console.clear() message is still displayed");
is(hud.outputNode.textContent.split("Console was cleared").length, 2,
"console.clear() message is only displayed once");
info("Logging one messages log5");
ContentTask.spawn(gBrowser.selectedBrowser, {}, function* () {
content.wrappedJSObject.console.log("log5");
});
yield waitForLog("log5", hud);
info("Close and reopen the webconsole.");
yield closeConsole(gBrowser.selectedTab);
hud = yield openConsole();
yield waitForLog("Console was cleared", hud);
ok(hud.outputNode.textContent.includes("Console was cleared"),
"console.clear() message is still displayed");
ok(!hud.outputNode.textContent.includes("log1"), "log1 not displayed");
ok(!hud.outputNode.textContent.includes("log2"), "log1 not displayed");
ok(!hud.outputNode.textContent.includes("log3"), "log3 not displayed");
ok(!hud.outputNode.textContent.includes("log4"), "log4 not displayed");
ok(hud.outputNode.textContent.includes("log5"), "log5 still displayed");
});
/**
* Wait for a single message to be logged in the provided webconsole instance
* with the category CATEGORY_WEBDEV and the SEVERITY_LOG severity.
*
* @param {String} message
* The expected messaged.
* @param {WebConsole} webconsole
* WebConsole instance in which the message should be logged.
*/
function* waitForLog(message, webconsole, options) {
yield waitForMessages({
webconsole: webconsole,
messages: [{
text: message,
category: CATEGORY_WEBDEV,
severity: SEVERITY_LOG,
}],
});
}
/**
* Open the variables view sidebar for the object with the provided name objName
* and wait for the expected object is displayed in the variables view.
*
* @param {String} objName
* The name of the object to open in the sidebar.
* @param {Object} expectedObj
* The properties that should be displayed in the variables view.
* @param {WebConsole} webconsole
* WebConsole instance in which the message should be logged.
*
*/
function* openSidebar(objName, expectedObj, webconsole) {
let msg = yield webconsole.jsterm.execute(objName);
ok(msg, "output message found");
let anchor = msg.querySelector("a");
let body = msg.querySelector(".message-body");
ok(anchor, "object anchor");
ok(body, "message body");
yield EventUtils.synthesizeMouse(anchor, 2, 2, {}, webconsole.iframeWindow);
let vviewVar = yield webconsole.jsterm.once("variablesview-fetched");
let vview = vviewVar._variablesView;
ok(vview, "variables view object exists");
yield findVariableViewProperties(vviewVar, [
expectedObj,
], { webconsole: webconsole });
}

View File

@ -0,0 +1,16 @@
<!DOCTYPE HTML>
<html dir="ltr" xml:lang="en-US" lang="en-US"><head>
<meta charset="utf-8">
<title>Console.clear() tests</title>
<script type="text/javascript">
console.log("log1");
console.log("log2");
console.clear();
window.objFromPage = { a: 1 };
</script>
</head>
<body>
<h1 id="header">Clear Demo</h1>
</body>
</html>

View File

@ -142,6 +142,7 @@ const LEVELS = {
warn: SEVERITY_WARNING,
info: SEVERITY_INFO,
log: SEVERITY_LOG,
clear: SEVERITY_LOG,
trace: SEVERITY_LOG,
table: SEVERITY_LOG,
debug: SEVERITY_LOG,
@ -1285,6 +1286,11 @@ WebConsoleFrame.prototype = {
node = msg.init(this.output).render().element;
break;
}
case "clear": {
body = l10n.getStr("consoleCleared");
clipboardText = body;
break;
}
case "dir": {
body = { arguments: args };
let clipboardArray = [];
@ -2203,6 +2209,14 @@ WebConsoleFrame.prototype = {
let isRepeated = this._filterRepeatedMessage(node);
// If a clear message is processed while the webconsole is opened, the UI
// should be cleared.
if (message && message.level == "clear") {
// Do not clear the consoleStorage here as it has been cleared already
// by the clear method, only clear the UI.
this.jsterm.clearOutput(false);
}
let visible = !isRepeated && !isFiltered;
if (!isRepeated) {
this.outputNode.appendChild(node);