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_content-type.js | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.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_content-type.js')
-rw-r--r-- | devtools/client/netmonitor/test/browser_net_content-type.js | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/test/browser_net_content-type.js b/devtools/client/netmonitor/test/browser_net_content-type.js new file mode 100644 index 0000000000..df0bec0c23 --- /dev/null +++ b/devtools/client/netmonitor/test/browser_net_content-type.js @@ -0,0 +1,358 @@ +/* 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. + */ + +add_task(async function () { + const { tab, monitor } = await initNetMonitor( + CONTENT_TYPE_WITHOUT_CACHE_URL, + { requestCount: 1 } + ); + info("Starting test... "); + + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + const { L10N } = windowRequire("devtools/client/netmonitor/src/utils/l10n"); + const { getDisplayedRequests, getSortedRequests } = windowRequire( + "devtools/client/netmonitor/src/selectors/index" + ); + + store.dispatch(Actions.batchEnable(false)); + + // Execute requests. + await performRequests(monitor, tab, CONTENT_TYPE_WITHOUT_CACHE_REQUESTS); + + for (const requestItem of document.querySelectorAll(".request-list-item")) { + const requestsListStatus = requestItem.querySelector(".status-code"); + requestItem.scrollIntoView(); + EventUtils.sendMouseEvent({ type: "mouseover" }, requestsListStatus); + await waitUntil(() => requestsListStatus.title); + await waitForDOMIfNeeded(requestItem, ".requests-list-timings-total"); + } + + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + getSortedRequests(store.getState())[0], + "GET", + CONTENT_TYPE_SJS + "?fmt=xml", + { + status: 200, + statusText: "OK", + type: "xml", + fullMimeType: "text/xml; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 42), + time: true, + } + ); + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + getSortedRequests(store.getState())[1], + "GET", + CONTENT_TYPE_SJS + "?fmt=css", + { + status: 200, + statusText: "OK", + type: "css", + fullMimeType: "text/css; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 34), + time: true, + } + ); + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + getSortedRequests(store.getState())[2], + "GET", + CONTENT_TYPE_SJS + "?fmt=js", + { + status: 200, + statusText: "OK", + type: "js", + fullMimeType: "application/javascript; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 34), + time: true, + } + ); + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + getSortedRequests(store.getState())[3], + "GET", + CONTENT_TYPE_SJS + "?fmt=json", + { + status: 200, + statusText: "OK", + type: "json", + fullMimeType: "application/json; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 29), + time: true, + } + ); + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + getSortedRequests(store.getState())[4], + "GET", + CONTENT_TYPE_SJS + "?fmt=bogus", + { + status: 404, + statusText: "Not Found", + type: "html", + fullMimeType: "text/html; charset=utf-8", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 24), + time: true, + } + ); + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + getSortedRequests(store.getState())[5], + "GET", + TEST_IMAGE, + { + fuzzyUrl: true, + status: 200, + statusText: "OK", + type: "png", + fullMimeType: "image/png", + size: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 580), + time: true, + } + ); + verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + getSortedRequests(store.getState())[6], + "GET", + CONTENT_TYPE_SJS + "?fmt=gzip", + { + status: 200, + statusText: "OK", + type: "plain", + fullMimeType: "text/plain", + transferred: L10N.getFormatStrWithNumbers("networkMenu.sizeB", 324), + size: L10N.getFormatStrWithNumbers("networkMenu.size.kB", 10.99), + time: true, + } + ); + + await selectIndexAndWaitForSourceEditor(monitor, 0); + await testResponseTab("xml"); + + await selectIndexAndWaitForSourceEditor(monitor, 1); + await testResponseTab("css"); + + await selectIndexAndWaitForSourceEditor(monitor, 2); + await testResponseTab("js"); + + await selectIndexAndWaitForJSONView(3); + await testResponseTab("json"); + + await selectIndexAndWaitForHtmlView(4); + await testResponseTab("html"); + + await selectIndexAndWaitForImageView(5); + await testResponseTab("png"); + + await selectIndexAndWaitForSourceEditor(monitor, 6); + await testResponseTab("gzip"); + + await teardown(monitor); + + function testResponseTab(type) { + const tabpanel = document.querySelector("#response-panel"); + + function checkVisibility(box) { + is( + tabpanel.querySelector(".response-error-header") === null, + true, + "The response error header doesn't display" + ); + const jsonView = tabpanel.querySelector(".data-label") || {}; + is( + jsonView.textContent !== L10N.getStr("jsonScopeName"), + box != "json", + "The response json view doesn't display" + ); + is( + tabpanel.querySelector(".CodeMirror-code") === null, + box !== "textarea", + "The response editor doesn't display" + ); + is( + tabpanel.querySelector(".response-image-box") === null, + box != "image", + "The response image view doesn't display" + ); + } + + switch (type) { + case "xml": { + checkVisibility("textarea"); + + const text = getCodeMirrorValue(monitor); + + is( + text, + "<label value='greeting'>Hello XML!</label>", + "The text shown in the source editor is incorrect for the xml request." + ); + break; + } + case "css": { + checkVisibility("textarea"); + + const text = getCodeMirrorValue(monitor); + + is( + text, + "body:pre { content: 'Hello CSS!' }", + "The text shown in the source editor is incorrect for the css request." + ); + break; + } + case "js": { + checkVisibility("textarea"); + + const text = getCodeMirrorValue(monitor); + + is( + text, + "function() { return 'Hello JS!'; }", + "The text shown in the source editor is incorrect for the js request." + ); + break; + } + case "json": { + checkVisibility("json"); + + is( + tabpanel.querySelectorAll(".raw-data-toggle").length, + 1, + "The response payload toggle should be displayed in this tabpanel." + ); + is( + tabpanel.querySelectorAll(".empty-notice").length, + 0, + "The empty notice should not be displayed in this tabpanel." + ); + + is( + tabpanel.querySelector(".data-label").textContent, + L10N.getStr("jsonScopeName"), + "The json view section doesn't have the correct title." + ); + + const labels = tabpanel.querySelectorAll( + "tr .treeLabelCell .treeLabel" + ); + const values = tabpanel.querySelectorAll( + "tr .treeValueCell .objectBox" + ); + + is( + labels[0].textContent, + "greeting", + "The first json property name was incorrect." + ); + is( + values[0].textContent, + `"Hello JSON!"`, + "The first json property value was incorrect." + ); + break; + } + case "html": { + checkVisibility("html"); + + const text = document.querySelector(".html-preview iframe").src; + const expectedText = + "data:text/html;charset=UTF-8," + + encodeURIComponent("<blink>Not Found</blink>"); + + is( + text, + expectedText, + "The text shown in the iframe is incorrect for the html request." + ); + break; + } + case "png": { + checkVisibility("image"); + + const [name, dimensions, mime] = tabpanel.querySelectorAll( + ".response-image-box .tabpanel-summary-value" + ); + + is( + name.textContent, + "test-image.png", + "The image name info isn't correct." + ); + is(mime.textContent, "image/png", "The image mime info isn't correct."); + is( + dimensions.textContent, + "16" + " \u00D7 " + "16", + "The image dimensions info isn't correct." + ); + break; + } + case "gzip": { + checkVisibility("textarea"); + + const text = getCodeMirrorValue(monitor); + + is( + text, + new Array(1000).join("Hello gzip!"), + "The text shown in the source editor is incorrect for the gzip request." + ); + break; + } + } + } + + async function selectIndexAndWaitForHtmlView(index) { + const onResponseContent = monitor.panelWin.api.once( + TEST_EVENTS.RECEIVED_RESPONSE_CONTENT + ); + const tabpanel = document.querySelector("#response-panel"); + const waitDOM = waitForDOM(tabpanel, ".html-preview"); + store.dispatch(Actions.selectRequestByIndex(index)); + await waitDOM; + await onResponseContent; + } + + async function selectIndexAndWaitForJSONView(index) { + const onResponseContent = monitor.panelWin.api.once( + TEST_EVENTS.RECEIVED_RESPONSE_CONTENT + ); + const tabpanel = document.querySelector("#response-panel"); + const waitDOM = waitForDOM(tabpanel, ".treeTable"); + store.dispatch(Actions.selectRequestByIndex(index)); + await waitDOM; + await onResponseContent; + + // Waiting for RECEIVED_RESPONSE_CONTENT isn't enough. + // DOM may not be fully updated yet and checkVisibility(json) may still fail. + await waitForTick(); + } + + async function selectIndexAndWaitForImageView(index) { + const onResponseContent = monitor.panelWin.api.once( + TEST_EVENTS.RECEIVED_RESPONSE_CONTENT + ); + const tabpanel = document.querySelector("#response-panel"); + const waitDOM = waitForDOM(tabpanel, ".response-image"); + store.dispatch(Actions.selectRequestByIndex(index)); + const [imageNode] = await waitDOM; + await once(imageNode, "load"); + await onResponseContent; + } +}); |