diff options
Diffstat (limited to 'devtools/client/webconsole/test/browser/browser_webconsole_warning_groups.js')
-rw-r--r-- | devtools/client/webconsole/test/browser/browser_webconsole_warning_groups.js | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups.js b/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups.js new file mode 100644 index 0000000000..a78926fe10 --- /dev/null +++ b/devtools/client/webconsole/test/browser/browser_webconsole_warning_groups.js @@ -0,0 +1,286 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Test that warning messages can be grouped, per navigation and category, and that +// interacting with these groups works as expected. + +"use strict"; +requestLongerTimeout(2); + +const TEST_FILE = + "browser/devtools/client/webconsole/test/browser/test-warning-groups.html"; +const TEST_URI = "https://example.org/" + TEST_FILE; + +const TRACKER_URL = "https://tracking.example.com/"; +const BLOCKED_URL = + TRACKER_URL + + "browser/devtools/client/webconsole/test/browser/test-image.png"; + +const { UrlClassifierTestUtils } = ChromeUtils.importESModule( + "resource://testing-common/UrlClassifierTestUtils.sys.mjs" +); +UrlClassifierTestUtils.addTestTrackers(); +registerCleanupFunction(function () { + UrlClassifierTestUtils.cleanupTestTrackers(); +}); + +pushPref("privacy.trackingprotection.enabled", true); +pushPref("devtools.webconsole.groupWarningMessages", true); + +const CONTENT_BLOCKING_GROUP_LABEL = + "The resource at “<URL>” was blocked because content blocking is enabled."; + +add_task(async function testContentBlockingMessage() { + // Enable groupWarning and persist log + await pushPref("devtools.webconsole.persistlog", true); + + const hud = await openNewTabAndConsole(TEST_URI); + + info( + "Log a tracking protection message to check a single message isn't grouped" + ); + let onContentBlockingWarningMessage = waitForMessageByType( + hud, + BLOCKED_URL, + ".warn" + ); + emitContentBlockedMessage(hud); + let { node } = await onContentBlockingWarningMessage; + is( + node.querySelector(".warning-indent"), + null, + "The message has the expected style" + ); + is( + node.getAttribute("data-indent"), + "0", + "The message has the expected indent" + ); + + info("Log a simple message"); + await logString(hud, "simple message 1"); + + info( + "Log a second tracking protection message to check that it causes the grouping" + ); + let onContentBlockingWarningGroupMessage = waitForMessageByType( + hud, + CONTENT_BLOCKING_GROUP_LABEL, + ".warn" + ); + emitContentBlockedMessage(hud); + ({ node } = await onContentBlockingWarningGroupMessage); + is( + node.querySelector(".warning-group-badge").textContent, + "2", + "The badge has the expected text" + ); + + await checkConsoleOutputForWarningGroup(hud, [ + `▶︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `simple message 1`, + ]); + + info("Log another simple message"); + await logString(hud, "simple message 2"); + + await checkConsoleOutputForWarningGroup(hud, [ + `▶︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `simple message 1`, + `simple message 2`, + ]); + + info( + "Log a third tracking protection message to check that the badge updates" + ); + emitContentBlockedMessage(hud); + await waitFor( + () => node.querySelector(".warning-group-badge").textContent == "3" + ); + + await checkConsoleOutputForWarningGroup(hud, [ + `▶︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `simple message 1`, + `simple message 2`, + ]); + + info("Open the group"); + node.querySelector(".arrow").click(); + await waitFor(() => findWarningMessage(hud, BLOCKED_URL)); + + await checkConsoleOutputForWarningGroup(hud, [ + `▼︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `| ${BLOCKED_URL}?1`, + `| ${BLOCKED_URL}?2`, + `| ${BLOCKED_URL}?3`, + `simple message 1`, + `simple message 2`, + ]); + + info( + "Log a new tracking protection message to check it appears inside the group" + ); + onContentBlockingWarningMessage = waitForMessageByType( + hud, + BLOCKED_URL, + ".warn" + ); + emitContentBlockedMessage(hud); + await onContentBlockingWarningMessage; + ok(true, "The new tracking protection message is displayed"); + + await checkConsoleOutputForWarningGroup(hud, [ + `▼︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `| ${BLOCKED_URL}?1`, + `| ${BLOCKED_URL}?2`, + `| ${BLOCKED_URL}?3`, + `| ${BLOCKED_URL}?4`, + `simple message 1`, + `simple message 2`, + ]); + + info("Reload the page and wait for it to be ready"); + await reloadPage(); + + // Also wait for the navigation message to be displayed. + await waitFor(() => + findMessageByType(hud, "Navigated to", ".navigationMarker") + ); + + info("Log a tracking protection message to check it is not grouped"); + onContentBlockingWarningMessage = waitForMessageByType( + hud, + BLOCKED_URL, + ".warn" + ); + emitContentBlockedMessage(hud); + await onContentBlockingWarningMessage; + + await logString(hud, "simple message 3"); + + await checkConsoleOutputForWarningGroup(hud, [ + `▼︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `| ${BLOCKED_URL}?1`, + `| ${BLOCKED_URL}?2`, + `| ${BLOCKED_URL}?3`, + `| ${BLOCKED_URL}?4`, + `simple message 1`, + `simple message 2`, + "Navigated to", + `${BLOCKED_URL}?5`, + `simple message 3`, + ]); + + info( + "Log a second tracking protection message to check that it causes the grouping" + ); + onContentBlockingWarningGroupMessage = waitForMessageByType( + hud, + CONTENT_BLOCKING_GROUP_LABEL, + ".warn" + ); + emitContentBlockedMessage(hud); + ({ node } = await onContentBlockingWarningGroupMessage); + is( + node.querySelector(".warning-group-badge").textContent, + "2", + "The badge has the expected text" + ); + + await checkConsoleOutputForWarningGroup(hud, [ + `▼︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `| ${BLOCKED_URL}?1`, + `| ${BLOCKED_URL}?2`, + `| ${BLOCKED_URL}?3`, + `| ${BLOCKED_URL}?4`, + `simple message 1`, + `simple message 2`, + `Navigated to`, + `▶︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `simple message 3`, + ]); + + info("Check that opening this group works"); + node.querySelector(".arrow").click(); + await waitFor(() => findWarningMessages(hud, BLOCKED_URL).length === 6); + + await checkConsoleOutputForWarningGroup(hud, [ + `▼︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `| ${BLOCKED_URL}?1`, + `| ${BLOCKED_URL}?2`, + `| ${BLOCKED_URL}?3`, + `| ${BLOCKED_URL}?4`, + `simple message 1`, + `simple message 2`, + `Navigated to`, + `▼︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `| ${BLOCKED_URL}?5`, + `| ${BLOCKED_URL}?6`, + `simple message 3`, + ]); + + info("Check that closing this group works, and let the other one open"); + node.querySelector(".arrow").click(); + await waitFor(() => findWarningMessages(hud, BLOCKED_URL).length === 4); + + await checkConsoleOutputForWarningGroup(hud, [ + `▼︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `| ${BLOCKED_URL}?1`, + `| ${BLOCKED_URL}?2`, + `| ${BLOCKED_URL}?3`, + `| ${BLOCKED_URL}?4`, + `simple message 1`, + `simple message 2`, + `Navigated to`, + `▶︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `simple message 3`, + ]); + + info( + "Log a third tracking protection message to check that the badge updates" + ); + emitContentBlockedMessage(hud); + await waitFor( + () => node.querySelector(".warning-group-badge").textContent == "3" + ); + + await checkConsoleOutputForWarningGroup(hud, [ + `▼︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `| ${BLOCKED_URL}?1`, + `| ${BLOCKED_URL}?2`, + `| ${BLOCKED_URL}?3`, + `| ${BLOCKED_URL}?4`, + `simple message 1`, + `simple message 2`, + `Navigated to`, + `▶︎⚠ ${CONTENT_BLOCKING_GROUP_LABEL}`, + `simple message 3`, + ]); +}); + +let cpt = 0; +/** + * Emit a Content Blocking message. This is done by loading an image from an origin + * tagged as tracker. The image is loaded with a incremented counter query parameter + * each time so we can get the warning message. + */ +function emitContentBlockedMessage() { + const url = `${BLOCKED_URL}?${++cpt}`; + SpecialPowers.spawn(gBrowser.selectedBrowser, [url], function (innerURL) { + content.wrappedJSObject.loadImage(innerURL); + }); +} + +/** + * Log a string from the content page. + * + * @param {WebConsole} hud + * @param {String} str + */ +function logString(hud, str) { + const onMessage = waitForMessageByType(hud, str, ".console-api"); + SpecialPowers.spawn(gBrowser.selectedBrowser, [str], function (arg) { + content.console.log(arg); + }); + return onMessage; +} |