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