diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /devtools/client/netmonitor/test/browser_net_html-preview.js | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devtools/client/netmonitor/test/browser_net_html-preview.js')
-rw-r--r-- | devtools/client/netmonitor/test/browser_net_html-preview.js | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/test/browser_net_html-preview.js b/devtools/client/netmonitor/test/browser_net_html-preview.js new file mode 100644 index 0000000000..873c712105 --- /dev/null +++ b/devtools/client/netmonitor/test/browser_net_html-preview.js @@ -0,0 +1,176 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/** + * Tests if different response content types are handled correctly. + */ + +const httpServer = createTestHTTPServer(); +httpServer.registerContentType("html", "text/html"); + +const BASE_URL = `http://localhost:${httpServer.identity.primaryPort}/`; + +const REDIRECT_URL = BASE_URL + "redirect.html"; + +// In all content previewed as HTML we ensure using proper html, head and body in order to +// prevent having them added by the <browser> when loaded as a preview. +function addBaseHtmlElements(body) { + return `<html><head></head><body>${body}</body></html>`; +} + +// This first page asserts we can redirect to another URL, even if JS happen to be executed +const FETCH_CONTENT_1 = addBaseHtmlElements( + `Fetch 1<script>window.parent.location.href = "${REDIRECT_URL}";</script>` +); +// This second page asserts that JS is disabled +const FETCH_CONTENT_2 = addBaseHtmlElements( + `Fetch 2<script>document.write("JS activated")</script>` +); +// This third page asserts that links and forms are disabled +const FETCH_CONTENT_3 = addBaseHtmlElements( + `Fetch 3<a href="${REDIRECT_URL}">link</a> -- <form action="${REDIRECT_URL}"><input type="submit"></form>` +); +// This fourth page asserts responses with line breaks +const FETCH_CONTENT_4 = addBaseHtmlElements(` + <a href="#" id="link1">link1</a> + <a href="#" id="link2">link2</a> +`); + +// Use fetch in order to prevent actually running this code in the test page +const TEST_HTML = addBaseHtmlElements(`<div id="to-copy">HTML</div><script> + fetch("${BASE_URL}fetch-1.html"); + fetch("${BASE_URL}fetch-2.html"); + fetch("${BASE_URL}fetch-3.html"); + fetch("${BASE_URL}fetch-4.html"); +</script>`); +const TEST_URL = BASE_URL + "doc-html-preview.html"; + +httpServer.registerPathHandler( + "/doc-html-preview.html", + (request, response) => { + response.setStatusLine(request.httpVersion, 200, "OK"); + response.write(TEST_HTML); + } +); +httpServer.registerPathHandler("/fetch-1.html", (request, response) => { + response.setStatusLine(request.httpVersion, 200, "OK"); + response.write(FETCH_CONTENT_1); +}); +httpServer.registerPathHandler("/fetch-2.html", (request, response) => { + response.setStatusLine(request.httpVersion, 200, "OK"); + response.write(FETCH_CONTENT_2); +}); +httpServer.registerPathHandler("/fetch-3.html", (request, response) => { + response.setStatusLine(request.httpVersion, 200, "OK"); + response.write(FETCH_CONTENT_3); +}); +httpServer.registerPathHandler("/fetch-4.html", (request, response) => { + response.setStatusLine(request.httpVersion, 200, "OK"); + response.write(FETCH_CONTENT_4); +}); +httpServer.registerPathHandler("/redirect.html", (request, response) => { + response.setStatusLine(request.httpVersion, 200, "OK"); + response.write("Redirected!"); +}); + +add_task(async function () { + // Enable async events so that clicks on preview iframe's links are correctly + // going through the parent process which is meant to cancel any mousedown. + await pushPref("test.events.async.enabled", true); + + const { monitor } = await initNetMonitor(TEST_URL, { requestCount: 3 }); + info("Starting test... "); + + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + + store.dispatch(Actions.batchEnable(false)); + + const onNetworkEvent = waitForNetworkEvents(monitor, 3); + await reloadBrowser(); + await onNetworkEvent; + + // The new lines are stripped when using outerHTML to retrieve HTML content of the preview iframe + await selectIndexAndWaitForHtmlView(0, TEST_HTML); + await selectIndexAndWaitForHtmlView(1, FETCH_CONTENT_1); + await selectIndexAndWaitForHtmlView(2, FETCH_CONTENT_2); + await selectIndexAndWaitForHtmlView(3, FETCH_CONTENT_3); + await selectIndexAndWaitForHtmlView(4, FETCH_CONTENT_4); + + await teardown(monitor); + + async function selectIndexAndWaitForHtmlView(index, expectedHtmlPreview) { + info(`Select the request #${index}`); + const onResponseContent = monitor.panelWin.api.once( + TEST_EVENTS.RECEIVED_RESPONSE_CONTENT + ); + store.dispatch(Actions.selectRequestByIndex(index)); + + info("Open the Response tab"); + document.querySelector("#response-tab").click(); + + const [iframe] = await waitForDOM( + document, + "#response-panel .html-preview iframe" + ); + + // <xul:iframe type=content remote=true> don't emit "load" event. + // And SpecialPowsers.spawn throws if kept running during a page load. + // So poll for the end of the iframe load... + await waitFor(async () => { + // Note that if spawn executes early, the iframe may not yet be loading + // and would throw for the reason mentioned in previous comment. + try { + const rv = await SpecialPowers.spawn(iframe.browsingContext, [], () => { + return content.document.readyState == "complete"; + }); + return rv; + } catch (e) { + return false; + } + }); + + info("Wait for response content to be loaded"); + await onResponseContent; + + is( + iframe.browsingContext.currentWindowGlobal.isInProcess, + false, + "The preview is loaded in a content process" + ); + + await SpecialPowers.spawn( + iframe.browsingContext, + [expectedHtmlPreview], + async function (expectedHtml) { + is( + content.document.documentElement.outerHTML, + expectedHtml, + "The text shown in the iframe is incorrect for the html request." + ); + } + ); + + // Only assert copy to clipboard on the first test page + if (expectedHtmlPreview == TEST_HTML) { + await waitForClipboardPromise(async function () { + await SpecialPowers.spawn( + iframe.browsingContext, + [], + async function () { + const elt = content.document.getElementById("to-copy"); + EventUtils.synthesizeMouseAtCenter(elt, { clickCount: 2 }, content); + await new Promise(r => + elt.addEventListener("dblclick", r, { once: true }) + ); + EventUtils.synthesizeKey("c", { accelKey: true }, content); + } + ); + }, "HTML"); + } + + return iframe; + } +}); |