summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js')
-rw-r--r--devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js172
1 files changed, 172 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js b/devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js
new file mode 100644
index 000000000..c3df51ced
--- /dev/null
+++ b/devtools/client/netmonitor/test/browser_net_details-no-duplicated-content.js
@@ -0,0 +1,172 @@
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// A test to ensure that the content in details pane is not duplicated.
+
+add_task(function* () {
+ let { tab, monitor } = yield initNetMonitor(CUSTOM_GET_URL);
+ let panel = monitor.panelWin;
+ let { NetMonitorView, EVENTS } = panel;
+ let { RequestsMenu, NetworkDetails } = NetMonitorView;
+
+ const COOKIE_UNIQUE_PATH = "/do-not-use-in-other-tests-using-cookies";
+
+ let TEST_CASES = [
+ {
+ desc: "Test headers tab",
+ pageURI: CUSTOM_GET_URL,
+ requestURI: null,
+ isPost: false,
+ tabIndex: 0,
+ variablesView: NetworkDetails._headers,
+ expectedScopeLength: 2,
+ },
+ {
+ desc: "Test cookies tab",
+ pageURI: CUSTOM_GET_URL,
+ requestURI: COOKIE_UNIQUE_PATH,
+ isPost: false,
+ tabIndex: 1,
+ variablesView: NetworkDetails._cookies,
+ expectedScopeLength: 1,
+ },
+ {
+ desc: "Test params tab",
+ pageURI: POST_RAW_URL,
+ requestURI: null,
+ isPost: true,
+ tabIndex: 2,
+ variablesView: NetworkDetails._params,
+ expectedScopeLength: 1,
+ },
+ ];
+
+ info("Adding a cookie for the \"Cookie\" tab test");
+ yield setDocCookie("a=b; path=" + COOKIE_UNIQUE_PATH);
+
+ info("Running tests");
+ for (let spec of TEST_CASES) {
+ yield runTestCase(spec);
+ }
+
+ // Remove the cookie. If an error occurs the path of the cookie ensures it
+ // doesn't mess with the other tests.
+ info("Removing the added cookie.");
+ yield setDocCookie(
+ "a=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=" + COOKIE_UNIQUE_PATH);
+
+ yield teardown(monitor);
+
+ /**
+ * Set a content document cookie
+ */
+ function setDocCookie(cookie) {
+ return ContentTask.spawn(tab.linkedBrowser, cookie, function* (cookieArg) {
+ content.document.cookie = cookieArg;
+ });
+ }
+
+ /**
+ * A helper that handles the execution of each case.
+ */
+ function* runTestCase(spec) {
+ info("Running case: " + spec.desc);
+ let wait = waitForNetworkEvents(monitor, 1);
+ tab.linkedBrowser.loadURI(spec.pageURI);
+ yield wait;
+
+ RequestsMenu.clear();
+ yield waitForFinalDetailTabUpdate(spec.tabIndex, spec.isPost, spec.requestURI);
+
+ is(spec.variablesView._store.length, spec.expectedScopeLength,
+ "View contains " + spec.expectedScopeLength + " scope headers");
+ }
+
+ /**
+ * A helper that prepares the variables view for the actual testing. It
+ * - selects the correct tab
+ * - performs the specified request to specified URI
+ * - opens the details view
+ * - waits for the final update to happen
+ */
+ function* waitForFinalDetailTabUpdate(tabIndex, isPost, uri) {
+ let onNetworkEvent = panel.once(EVENTS.NETWORK_EVENT);
+ let onDetailsPopulated = panel.once(EVENTS.NETWORKDETAILSVIEW_POPULATED);
+ let onRequestFinished = isPost ?
+ waitForNetworkEvents(monitor, 0, 1) :
+ waitForNetworkEvents(monitor, 1);
+
+ info("Performing a request");
+ yield ContentTask.spawn(tab.linkedBrowser, uri, function* (url) {
+ content.wrappedJSObject.performRequests(1, url);
+ });
+
+ info("Waiting for NETWORK_EVENT");
+ yield onNetworkEvent;
+
+ if (!RequestsMenu.getItemAtIndex(0)) {
+ info("Waiting for the request to be added to the view");
+ yield monitor.panelWin.once(EVENTS.REQUEST_ADDED);
+ }
+
+ ok(true, "Received NETWORK_EVENT. Selecting the item.");
+ let item = RequestsMenu.getItemAtIndex(0);
+ RequestsMenu.selectedItem = item;
+
+ info("Item selected. Waiting for NETWORKDETAILSVIEW_POPULATED");
+ yield onDetailsPopulated;
+
+ info("Received populated event. Selecting tab at index " + tabIndex);
+ NetworkDetails.widget.selectedIndex = tabIndex;
+
+ info("Waiting for request to finish.");
+ yield onRequestFinished;
+
+ ok(true, "Request finished.");
+
+ /**
+ * Because this test uses lazy updates there's four scenarios to consider:
+ * #1: Everything is updated and test is ready to continue.
+ * #2: There's updates that are waiting to be flushed.
+ * #3: Updates are flushed but the tab update is still running.
+ * #4: There's pending updates and a tab update is still running.
+ *
+ * For case #1 there's not going to be a TAB_UPDATED event so don't wait for
+ * it (bug 1106181).
+ *
+ * For cases #2 and #3 it's enough to wait for one TAB_UPDATED event as for
+ * - case #2 the next flush will perform the final update and single
+ * TAB_UPDATED event is emitted.
+ * - case #3 the running update is the final update that'll emit one
+ * TAB_UPDATED event.
+ *
+ * For case #4 we must wait for the updates to be flushed before we can
+ * start waiting for TAB_UPDATED event or we'll continue the test right
+ * after the pending update finishes.
+ */
+ let hasQueuedUpdates = RequestsMenu._updateQueue.length !== 0;
+ let hasRunningTabUpdate = NetworkDetails._viewState.updating[tabIndex];
+
+ if (hasQueuedUpdates || hasRunningTabUpdate) {
+ info("There's pending updates - waiting for them to finish.");
+ info(" hasQueuedUpdates: " + hasQueuedUpdates);
+ info(" hasRunningTabUpdate: " + hasRunningTabUpdate);
+
+ if (hasQueuedUpdates && hasRunningTabUpdate) {
+ info("Waiting for updates to be flushed.");
+ // _flushRequests calls .populate which emits the following event
+ yield panel.once(EVENTS.NETWORKDETAILSVIEW_POPULATED);
+
+ info("Requests flushed.");
+ }
+
+ info("Waiting for final tab update.");
+ yield waitFor(panel, EVENTS.TAB_UPDATED);
+ }
+
+ info("All updates completed.");
+ }
+});