/* 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/. */

/* import-globals-from head.js */

"use strict";

requestLongerTimeout(3);

// test without target switching
add_task(async function() {
  await testNavigation(true);
});

// test with target switching enabled
add_task(async function() {
  enableTargetSwitching();
  await testNavigation();
});

async function testNavigation(shallCleanup = false) {
  const URL1 = URL_ROOT_COM_SSL + "storage-indexeddb-simple.html";
  const URL2 = URL_ROOT_NET_SSL + "storage-indexeddb-simple-alt.html";

  // open tab
  await openTabAndSetupStorage(URL1);
  const doc = gPanelWindow.document;

  // Check first domain
  // check that host appears in the storage tree
  checkTree(doc, ["indexedDB", "https://example.com"]);
  // check the table for values
  await selectTreeItem([
    "indexedDB",
    "https://example.com",
    "db (default)",
    "store",
  ]);
  checkStorageData("lorem", JSON.stringify({ key: "lorem", value: "ipsum" }));

  // clear db before navigating to a new domain
  info("Removing database…");
  await clearStorage();

  // Check second domain
  await navigateTo(URL2);
  info("Creating database in the second domain…");
  await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() {
    const win = content.wrappedJSObject;
    await win.setup();
  });
  // wait for storage tree refresh, and check host
  info("Checking storage tree…");
  await waitUntil(() => isInTree(doc, ["indexedDB", "https://example.net"]));

  ok(
    !isInTree(doc, ["indexedDB", "https://example.com"]),
    "example.com item is not in the tree anymore"
  );

  // TODO: select tree and check on storage data.
  // We cannot do it yet since we do not detect newly created indexed db's when
  // navigating. See Bug 1273802

  // reload the current tab, and check again
  await reloadBrowser();
  // wait for storage tree refresh, and check host
  info("Checking storage tree…");
  await waitUntil(() => isInTree(doc, ["indexedDB", "https://example.net"]));

  info("Check that the indexedDB node still has the expected label");
  is(
    getTreeNodeLabel(doc, ["indexedDB"]),
    "Indexed DB",
    "indexedDB item is properly displayed"
  );

  // clean up if needed
  if (shallCleanup) {
    await clearStorage();
  }
}

async function clearStorage() {
  await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() {
    const win = content.wrappedJSObject;
    await win.clear();
  });
}
