michael@0: /* vim:set ts=2 sw=2 sts=2 et: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: // Tests that the network panel works with LongStringActors. michael@0: michael@0: const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; michael@0: const TEST_IMG = "http://example.com/browser/browser/devtools/webconsole/test/test-image.png"; michael@0: michael@0: const TEST_IMG_BASE64 = michael@0: "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAVRJREFU" + michael@0: "OI2lk7FLw0AUxr+YpC1CBqcMWfsvCCLdXFzqEJCgDl1EQRGxg9AhSBEJONhFhG52UCuFDjq5dxD8" + michael@0: "FwoO0qGDOBQkl7vLOeWa2EQDffDBvTu+373Hu1OEEJgntGgxGD6J+7fLXKbt5VNUyhsKAChRBQcP" + michael@0: "FVFeWskFGH694mZroCQqCLlAwPxcgJBP254CmAD5B7C7dgHLMLF3uzoL4DQEod+Z5sP1FizDxGgy" + michael@0: "BqfhLID9AahX29J89bwPFgMsSEAQglAf9WobhPpScbPXr4FQHyzIADTsDizDRMPuIOC+zEeTMZo9" + michael@0: "BwH3EfAMACccbtfGaDKGZZg423yUZrdrg3EqxQlPr0BTdTR7joREN2uqnlBmCwW1hIJagtev4f3z" + michael@0: "A16/JvfiigMSYyzqJXlw/XKUyOORMUaBor6YavgdjKa8xGOnidadmwtwsnMu18q83/kHSou+bFND" + michael@0: "Dr4AAAAASUVORK5CYII="; michael@0: michael@0: let testDriver; michael@0: michael@0: function test() { michael@0: addTab(TEST_URI); michael@0: browser.addEventListener("load", function onLoad() { michael@0: browser.removeEventListener("load", onLoad, true); michael@0: openConsole(null, testNetworkPanel); michael@0: }, true); michael@0: } michael@0: michael@0: function testNetworkPanel() { michael@0: testDriver = testGen(); michael@0: testDriver.next(); michael@0: } michael@0: michael@0: function checkIsVisible(aPanel, aList) { michael@0: for (let id in aList) { michael@0: let node = aPanel.document.getElementById(id); michael@0: let isVisible = aList[id]; michael@0: is(node.style.display, (isVisible ? "block" : "none"), id + " isVisible=" + isVisible); michael@0: } michael@0: } michael@0: michael@0: function checkNodeContent(aPanel, aId, aContent) { michael@0: let node = aPanel.document.getElementById(aId); michael@0: if (node == null) { michael@0: ok(false, "Tried to access node " + aId + " that doesn't exist!"); michael@0: } michael@0: else if (node.textContent.indexOf(aContent) != -1) { michael@0: ok(true, "checking content of " + aId); michael@0: } michael@0: else { michael@0: ok(false, "Got false value for " + aId + ": " + node.textContent + " doesn't have " + aContent); michael@0: } michael@0: } michael@0: michael@0: function checkNodeKeyValue(aPanel, aId, aKey, aValue) { michael@0: let node = aPanel.document.getElementById(aId); michael@0: michael@0: let headers = node.querySelectorAll("th"); michael@0: for (let i = 0; i < headers.length; i++) { michael@0: if (headers[i].textContent == (aKey + ":")) { michael@0: is(headers[i].nextElementSibling.textContent, aValue, michael@0: "checking content of " + aId + " for key " + aKey); michael@0: return; michael@0: } michael@0: } michael@0: michael@0: ok(false, "content check failed for " + aId + ", key " + aKey); michael@0: } michael@0: michael@0: function testGen() { michael@0: let hud = HUDService.getHudByWindow(content); michael@0: let filterBox = hud.ui.filterBox; michael@0: michael@0: let headerValue = (new Array(456)).join("fooz bar"); michael@0: let headerValueGrip = { michael@0: type: "longString", michael@0: initial: headerValue.substr(0, 123), michael@0: length: headerValue.length, michael@0: actor: "faktor", michael@0: _fullString: headerValue, michael@0: }; michael@0: michael@0: let imageContentGrip = { michael@0: type: "longString", michael@0: initial: TEST_IMG_BASE64.substr(0, 143), michael@0: length: TEST_IMG_BASE64.length, michael@0: actor: "faktor2", michael@0: _fullString: TEST_IMG_BASE64, michael@0: }; michael@0: michael@0: let postDataValue = (new Array(123)).join("post me"); michael@0: let postDataGrip = { michael@0: type: "longString", michael@0: initial: postDataValue.substr(0, 172), michael@0: length: postDataValue.length, michael@0: actor: "faktor3", michael@0: _fullString: postDataValue, michael@0: }; michael@0: michael@0: let httpActivity = { michael@0: updates: ["responseContent", "eventTimings"], michael@0: discardRequestBody: false, michael@0: discardResponseBody: false, michael@0: startedDateTime: (new Date()).toISOString(), michael@0: request: { michael@0: url: TEST_IMG, michael@0: method: "GET", michael@0: cookies: [], michael@0: headers: [ michael@0: { name: "foo", value: "bar" }, michael@0: { name: "loongstring", value: headerValueGrip }, michael@0: ], michael@0: postData: { text: postDataGrip }, michael@0: }, michael@0: response: { michael@0: httpVersion: "HTTP/3.14", michael@0: status: 2012, michael@0: statusText: "ddahl likes tacos :)", michael@0: headers: [ michael@0: { name: "Content-Type", value: "image/png" }, michael@0: ], michael@0: content: { mimeType: "image/png", text: imageContentGrip }, michael@0: cookies: [], michael@0: }, michael@0: timings: { wait: 15, receive: 23 }, michael@0: }; michael@0: michael@0: let networkPanel = hud.ui.openNetworkPanel(filterBox, httpActivity); michael@0: michael@0: is(filterBox._netPanel, networkPanel, michael@0: "Network panel stored on the anchor object"); michael@0: michael@0: networkPanel._onUpdate = function() { michael@0: networkPanel._onUpdate = null; michael@0: executeSoon(function() { michael@0: testDriver.next(); michael@0: }); michael@0: }; michael@0: michael@0: yield undefined; michael@0: michael@0: info("test 1: check if a header value is expandable"); michael@0: michael@0: checkIsVisible(networkPanel, { michael@0: requestCookie: false, michael@0: requestFormData: false, michael@0: requestBody: false, michael@0: requestBodyFetchLink: true, michael@0: responseContainer: true, michael@0: responseBody: false, michael@0: responseNoBody: false, michael@0: responseImage: true, michael@0: responseImageCached: false, michael@0: responseBodyFetchLink: true, michael@0: }); michael@0: michael@0: checkNodeKeyValue(networkPanel, "requestHeadersContent", "foo", "bar"); michael@0: checkNodeKeyValue(networkPanel, "requestHeadersContent", "loongstring", michael@0: headerValueGrip.initial + "[\u2026]"); michael@0: michael@0: let webConsoleClient = networkPanel.webconsole.webConsoleClient; michael@0: let longStringFn = webConsoleClient.longString; michael@0: michael@0: let expectedGrip = headerValueGrip; michael@0: michael@0: function longStringClientProvider(aLongString) michael@0: { michael@0: is(aLongString, expectedGrip, michael@0: "longString grip is correct"); michael@0: michael@0: return { michael@0: initial: expectedGrip.initial, michael@0: length: expectedGrip.length, michael@0: substring: function(aStart, aEnd, aCallback) { michael@0: is(aStart, expectedGrip.initial.length, michael@0: "substring start is correct"); michael@0: is(aEnd, expectedGrip.length, michael@0: "substring end is correct"); michael@0: michael@0: executeSoon(function() { michael@0: aCallback({ michael@0: substring: expectedGrip._fullString.substring(aStart, aEnd), michael@0: }); michael@0: michael@0: executeSoon(function() { michael@0: testDriver.next(); michael@0: }); michael@0: }); michael@0: }, michael@0: }; michael@0: } michael@0: michael@0: webConsoleClient.longString = longStringClientProvider; michael@0: michael@0: let clickable = networkPanel.document michael@0: .querySelector("#requestHeadersContent .longStringEllipsis"); michael@0: ok(clickable, "long string ellipsis is shown"); michael@0: michael@0: EventUtils.sendMouseEvent({ type: "mousedown"}, clickable, michael@0: networkPanel.document.defaultView); michael@0: michael@0: yield undefined; michael@0: michael@0: clickable = networkPanel.document michael@0: .querySelector("#requestHeadersContent .longStringEllipsis"); michael@0: ok(!clickable, "long string ellipsis is not shown"); michael@0: michael@0: checkNodeKeyValue(networkPanel, "requestHeadersContent", "loongstring", michael@0: expectedGrip._fullString); michael@0: michael@0: info("test 2: check that response body image fetching works"); michael@0: expectedGrip = imageContentGrip; michael@0: michael@0: let imgNode = networkPanel.document.getElementById("responseImageNode"); michael@0: ok(!imgNode.getAttribute("src"), "no image is displayed"); michael@0: michael@0: clickable = networkPanel.document.querySelector("#responseBodyFetchLink"); michael@0: EventUtils.sendMouseEvent({ type: "mousedown"}, clickable, michael@0: networkPanel.document.defaultView); michael@0: michael@0: yield undefined; michael@0: michael@0: imgNode = networkPanel.document.getElementById("responseImageNode"); michael@0: is(imgNode.getAttribute("src"), "data:image/png;base64," + TEST_IMG_BASE64, michael@0: "displayed image is correct"); michael@0: is(clickable.style.display, "none", "#responseBodyFetchLink is not visible"); michael@0: michael@0: info("test 3: expand the request body"); michael@0: michael@0: expectedGrip = postDataGrip; michael@0: michael@0: clickable = networkPanel.document.querySelector("#requestBodyFetchLink"); michael@0: EventUtils.sendMouseEvent({ type: "mousedown"}, clickable, michael@0: networkPanel.document.defaultView); michael@0: yield undefined; michael@0: michael@0: is(clickable.style.display, "none", "#requestBodyFetchLink is not visible"); michael@0: michael@0: checkIsVisible(networkPanel, { michael@0: requestBody: true, michael@0: requestBodyFetchLink: false, michael@0: }); michael@0: michael@0: checkNodeContent(networkPanel, "requestBodyContent", expectedGrip._fullString); michael@0: michael@0: webConsoleClient.longString = longStringFn; michael@0: michael@0: networkPanel.panel.hidePopup(); michael@0: michael@0: info("test 4: reponse body long text"); michael@0: michael@0: httpActivity.response.content.mimeType = "text/plain"; michael@0: httpActivity.response.headers[0].value = "text/plain"; michael@0: michael@0: expectedGrip = imageContentGrip; michael@0: michael@0: // Reset response.content.text to avoid caching of the full string. michael@0: httpActivity.response.content.text = expectedGrip; michael@0: michael@0: networkPanel = hud.ui.openNetworkPanel(filterBox, httpActivity); michael@0: is(filterBox._netPanel, networkPanel, michael@0: "Network panel stored on httpActivity object"); michael@0: michael@0: networkPanel._onUpdate = function() { michael@0: networkPanel._onUpdate = null; michael@0: executeSoon(function() { michael@0: testDriver.next(); michael@0: }); michael@0: }; michael@0: michael@0: yield undefined; michael@0: michael@0: checkIsVisible(networkPanel, { michael@0: requestCookie: false, michael@0: requestFormData: false, michael@0: requestBody: true, michael@0: requestBodyFetchLink: false, michael@0: responseContainer: true, michael@0: responseBody: true, michael@0: responseNoBody: false, michael@0: responseImage: false, michael@0: responseImageCached: false, michael@0: responseBodyFetchLink: true, michael@0: }); michael@0: michael@0: checkNodeContent(networkPanel, "responseBodyContent", expectedGrip.initial); michael@0: michael@0: webConsoleClient.longString = longStringClientProvider; michael@0: michael@0: clickable = networkPanel.document.querySelector("#responseBodyFetchLink"); michael@0: EventUtils.sendMouseEvent({ type: "mousedown"}, clickable, michael@0: networkPanel.document.defaultView); michael@0: michael@0: yield undefined; michael@0: michael@0: webConsoleClient.longString = longStringFn; michael@0: is(clickable.style.display, "none", "#responseBodyFetchLink is not visible"); michael@0: checkNodeContent(networkPanel, "responseBodyContent", expectedGrip._fullString); michael@0: michael@0: networkPanel.panel.hidePopup(); michael@0: michael@0: // All done! michael@0: testDriver = null; michael@0: executeSoon(finishTest); michael@0: michael@0: yield undefined; michael@0: }