Blame devtools/server/tests/browser/browser_storage_dynamic_windows.js

Packit f0b94e
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
Packit f0b94e
/* Any copyright is dedicated to the Public Domain.
Packit f0b94e
   http://creativecommons.org/publicdomain/zero/1.0/ */
Packit f0b94e
Packit f0b94e
"use strict";
Packit f0b94e
Packit f0b94e
const {StorageFront} = require("devtools/shared/fronts/storage");
Packit f0b94e
Services.scriptloader.loadSubScript("chrome://mochitests/content/browser/devtools/server/tests/browser/storage-helpers.js", this);
Packit f0b94e
Packit f0b94e
const beforeReload = {
Packit f0b94e
  cookies: {
Packit f0b94e
    "http://test1.example.org": ["c1", "cs2", "c3", "uc1"],
Packit f0b94e
    "http://sectest1.example.org": ["uc1", "cs2"]
Packit f0b94e
  },
Packit f0b94e
  localStorage: {
Packit f0b94e
    "http://test1.example.org": ["ls1", "ls2"],
Packit f0b94e
    "http://sectest1.example.org": ["iframe-u-ls1"]
Packit f0b94e
  },
Packit f0b94e
  sessionStorage: {
Packit f0b94e
    "http://test1.example.org": ["ss1"],
Packit f0b94e
    "http://sectest1.example.org": ["iframe-u-ss1", "iframe-u-ss2"]
Packit f0b94e
  },
Packit f0b94e
  indexedDB: {
Packit f0b94e
    "http://test1.example.org": [
Packit f0b94e
      JSON.stringify(["idb1", "obj1"]),
Packit f0b94e
      JSON.stringify(["idb1", "obj2"]),
Packit f0b94e
      JSON.stringify(["idb2", "obj3"]),
Packit f0b94e
    ],
Packit f0b94e
    "http://sectest1.example.org": []
Packit f0b94e
  }
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
async function testStores(data, front) {
Packit f0b94e
  testWindowsBeforeReload(data);
Packit f0b94e
Packit f0b94e
  // FIXME: Bug 1183581 - browser_storage_dynamic_windows.js IsSafeToRunScript
Packit f0b94e
  //                      errors when testing reload in E10S mode
Packit f0b94e
  // yield testReload(front);
Packit f0b94e
  await testAddIframe(front);
Packit f0b94e
  await testRemoveIframe(front);
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testWindowsBeforeReload(data) {
Packit f0b94e
  for (let storageType in beforeReload) {
Packit f0b94e
    ok(data[storageType], storageType + " storage actor is present");
Packit f0b94e
    is(Object.keys(data[storageType].hosts).length,
Packit f0b94e
       Object.keys(beforeReload[storageType]).length,
Packit f0b94e
       "Number of hosts for " + storageType + "match");
Packit f0b94e
    for (let host in beforeReload[storageType]) {
Packit f0b94e
      ok(data[storageType].hosts[host], "Host " + host + " is present");
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function markOutMatched(toBeEmptied, data, deleted) {
Packit f0b94e
  if (!Object.keys(toBeEmptied).length) {
Packit f0b94e
    info("Object empty");
Packit f0b94e
    return;
Packit f0b94e
  }
Packit f0b94e
  ok(Object.keys(data).length,
Packit f0b94e
     "At least one storage type should be present");
Packit f0b94e
  for (let storageType in toBeEmptied) {
Packit f0b94e
    if (!data[storageType]) {
Packit f0b94e
      continue;
Packit f0b94e
    }
Packit f0b94e
    info("Testing for " + storageType);
Packit f0b94e
    for (let host in data[storageType]) {
Packit f0b94e
      ok(toBeEmptied[storageType][host], "Host " + host + " found");
Packit f0b94e
Packit f0b94e
      if (!deleted) {
Packit f0b94e
        for (let item of data[storageType][host]) {
Packit f0b94e
          let index = toBeEmptied[storageType][host].indexOf(item);
Packit f0b94e
          ok(index > -1, "Item found - " + item);
Packit f0b94e
          if (index > -1) {
Packit f0b94e
            toBeEmptied[storageType][host].splice(index, 1);
Packit f0b94e
          }
Packit f0b94e
        }
Packit f0b94e
        if (!toBeEmptied[storageType][host].length) {
Packit f0b94e
          delete toBeEmptied[storageType][host];
Packit f0b94e
        }
Packit f0b94e
      } else {
Packit f0b94e
        delete toBeEmptied[storageType][host];
Packit f0b94e
      }
Packit f0b94e
    }
Packit f0b94e
    if (!Object.keys(toBeEmptied[storageType]).length) {
Packit f0b94e
      delete toBeEmptied[storageType];
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testAddIframe(front) {
Packit f0b94e
  info("Testing if new iframe addition works properly");
Packit f0b94e
  return new Promise(resolve => {
Packit f0b94e
    let shouldBeEmpty = {
Packit f0b94e
      localStorage: {
Packit f0b94e
        "https://sectest1.example.org": ["iframe-s-ls1"]
Packit f0b94e
      },
Packit f0b94e
      sessionStorage: {
Packit f0b94e
        "https://sectest1.example.org": ["iframe-s-ss1"]
Packit f0b94e
      },
Packit f0b94e
      cookies: {
Packit f0b94e
        "https://sectest1.example.org": [
Packit f0b94e
          getCookieId("cs2", ".example.org", "/"),
Packit f0b94e
          getCookieId("sc1", "sectest1.example.org",
Packit f0b94e
                      "/browser/devtools/server/tests/browser/")
Packit f0b94e
        ],
Packit f0b94e
        "http://sectest1.example.org": [
Packit f0b94e
          getCookieId("sc1", "sectest1.example.org",
Packit f0b94e
                      "/browser/devtools/server/tests/browser/")
Packit f0b94e
        ]
Packit f0b94e
      },
Packit f0b94e
      indexedDB: {
Packit f0b94e
        // empty because indexed db creation happens after the page load, so at
Packit f0b94e
        // the time of window-ready, there was no indexed db present.
Packit f0b94e
        "https://sectest1.example.org": []
Packit f0b94e
      },
Packit f0b94e
      Cache: {
Packit f0b94e
        "https://sectest1.example.org": []
Packit f0b94e
      }
Packit f0b94e
    };
Packit f0b94e
Packit f0b94e
    let onStoresUpdate = data => {
Packit f0b94e
      info("checking if the hosts list is correct for this iframe addition");
Packit f0b94e
Packit f0b94e
      markOutMatched(shouldBeEmpty, data.added);
Packit f0b94e
Packit f0b94e
      ok(!data.changed || !data.changed.cookies ||
Packit f0b94e
         !data.changed.cookies["https://sectest1.example.org"],
Packit f0b94e
         "Nothing got changed for cookies");
Packit f0b94e
      ok(!data.changed || !data.changed.localStorage ||
Packit f0b94e
         !data.changed.localStorage["https://sectest1.example.org"],
Packit f0b94e
         "Nothing got changed for local storage");
Packit f0b94e
      ok(!data.changed || !data.changed.sessionStorage ||
Packit f0b94e
         !data.changed.sessionStorage["https://sectest1.example.org"],
Packit f0b94e
         "Nothing got changed for session storage");
Packit f0b94e
      ok(!data.changed || !data.changed.indexedDB ||
Packit f0b94e
         !data.changed.indexedDB["https://sectest1.example.org"],
Packit f0b94e
         "Nothing got changed for indexed db");
Packit f0b94e
Packit f0b94e
      ok(!data.deleted || !data.deleted.cookies ||
Packit f0b94e
         !data.deleted.cookies["https://sectest1.example.org"],
Packit f0b94e
         "Nothing got deleted for cookies");
Packit f0b94e
      ok(!data.deleted || !data.deleted.localStorage ||
Packit f0b94e
         !data.deleted.localStorage["https://sectest1.example.org"],
Packit f0b94e
         "Nothing got deleted for local storage");
Packit f0b94e
      ok(!data.deleted || !data.deleted.sessionStorage ||
Packit f0b94e
         !data.deleted.sessionStorage["https://sectest1.example.org"],
Packit f0b94e
         "Nothing got deleted for session storage");
Packit f0b94e
      ok(!data.deleted || !data.deleted.indexedDB ||
Packit f0b94e
         !data.deleted.indexedDB["https://sectest1.example.org"],
Packit f0b94e
         "Nothing got deleted for indexed db");
Packit f0b94e
Packit f0b94e
      if (!Object.keys(shouldBeEmpty).length) {
Packit f0b94e
        info("Everything to be received is received.");
Packit f0b94e
        endTestReloaded();
Packit f0b94e
      }
Packit f0b94e
    };
Packit f0b94e
Packit f0b94e
    let endTestReloaded = () => {
Packit f0b94e
      front.off("stores-update", onStoresUpdate);
Packit f0b94e
      resolve();
Packit f0b94e
    };
Packit f0b94e
Packit f0b94e
    front.on("stores-update", onStoresUpdate);
Packit f0b94e
Packit f0b94e
    // eslint-disable-next-line mozilla/no-cpows-in-tests
Packit f0b94e
    let iframe = gBrowser.contentDocumentAsCPOW.createElement("iframe");
Packit f0b94e
    iframe.src = ALT_DOMAIN_SECURED + "storage-secured-iframe.html";
Packit f0b94e
    // eslint-disable-next-line mozilla/no-cpows-in-tests
Packit f0b94e
    gBrowser.contentDocumentAsCPOW.querySelector("body").appendChild(iframe);
Packit f0b94e
  });
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testRemoveIframe(front) {
Packit f0b94e
  info("Testing if iframe removal works properly");
Packit f0b94e
  return new Promise(resolve => {
Packit f0b94e
    let shouldBeEmpty = {
Packit f0b94e
      localStorage: {
Packit f0b94e
        "http://sectest1.example.org": []
Packit f0b94e
      },
Packit f0b94e
      sessionStorage: {
Packit f0b94e
        "http://sectest1.example.org": []
Packit f0b94e
      },
Packit f0b94e
      Cache: {
Packit f0b94e
        "http://sectest1.example.org": []
Packit f0b94e
      },
Packit f0b94e
      indexedDB: {
Packit f0b94e
        "http://sectest1.example.org": []
Packit f0b94e
      }
Packit f0b94e
    };
Packit f0b94e
Packit f0b94e
    let onStoresUpdate = data => {
Packit f0b94e
      info("checking if the hosts list is correct for this iframe deletion");
Packit f0b94e
Packit f0b94e
      markOutMatched(shouldBeEmpty, data.deleted, true);
Packit f0b94e
Packit f0b94e
      ok(!data.deleted.cookies || !data.deleted.cookies["sectest1.example.org"],
Packit f0b94e
        "Nothing got deleted for Cookies as " +
Packit f0b94e
        "the same hostname is still present");
Packit f0b94e
Packit f0b94e
      ok(!data.changed || !data.changed.cookies ||
Packit f0b94e
         !data.changed.cookies["http://sectest1.example.org"],
Packit f0b94e
         "Nothing got changed for cookies");
Packit f0b94e
      ok(!data.changed || !data.changed.localStorage ||
Packit f0b94e
         !data.changed.localStorage["http://sectest1.example.org"],
Packit f0b94e
         "Nothing got changed for local storage");
Packit f0b94e
      ok(!data.changed || !data.changed.sessionStorage ||
Packit f0b94e
         !data.changed.sessionStorage["http://sectest1.example.org"],
Packit f0b94e
         "Nothing got changed for session storage");
Packit f0b94e
Packit f0b94e
      ok(!data.added || !data.added.cookies ||
Packit f0b94e
         !data.added.cookies["http://sectest1.example.org"],
Packit f0b94e
         "Nothing got added for cookies");
Packit f0b94e
      ok(!data.added || !data.added.localStorage ||
Packit f0b94e
         !data.added.localStorage["http://sectest1.example.org"],
Packit f0b94e
         "Nothing got added for local storage");
Packit f0b94e
      ok(!data.added || !data.added.sessionStorage ||
Packit f0b94e
         !data.added.sessionStorage["http://sectest1.example.org"],
Packit f0b94e
         "Nothing got added for session storage");
Packit f0b94e
Packit f0b94e
      if (!Object.keys(shouldBeEmpty).length) {
Packit f0b94e
        info("Everything to be received is received.");
Packit f0b94e
        endTestReloaded();
Packit f0b94e
      }
Packit f0b94e
    };
Packit f0b94e
Packit f0b94e
    let endTestReloaded = () => {
Packit f0b94e
      front.off("stores-update", onStoresUpdate);
Packit f0b94e
      resolve();
Packit f0b94e
    };
Packit f0b94e
Packit f0b94e
    front.on("stores-update", onStoresUpdate);
Packit f0b94e
Packit f0b94e
    ContentTask.spawn(gBrowser.selectedBrowser, {}, () => {
Packit f0b94e
      for (let iframe of content.document.querySelectorAll("iframe")) {
Packit f0b94e
        if (iframe.src.startsWith("http:")) {
Packit f0b94e
          iframe.remove();
Packit f0b94e
          break;
Packit f0b94e
        }
Packit f0b94e
      }
Packit f0b94e
    });
Packit f0b94e
  });
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
add_task(async function () {
Packit f0b94e
  await openTabAndSetupStorage(MAIN_DOMAIN + "storage-dynamic-windows.html");
Packit f0b94e
Packit f0b94e
  initDebuggerServer();
Packit f0b94e
  let client = new DebuggerClient(DebuggerServer.connectPipe());
Packit f0b94e
  let form = await connectDebuggerClient(client);
Packit f0b94e
  let front = StorageFront(client, form);
Packit f0b94e
  let data = await front.listStores();
Packit f0b94e
  await testStores(data, front);
Packit f0b94e
Packit f0b94e
  await clearStorage();
Packit f0b94e
Packit f0b94e
  // Forcing GC/CC to get rid of docshells and windows created by this test.
Packit f0b94e
  forceCollections();
Packit f0b94e
  await client.close();
Packit f0b94e
  forceCollections();
Packit f0b94e
  DebuggerServer.destroy();
Packit f0b94e
  forceCollections();
Packit f0b94e
});