/**
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

const URL = "http://mochi.test:8888/browser/browser/base/content/test/general/test_offline_gzip.html"

registerCleanupFunction(function() {
  // Clean up after ourself
  let uri = Services.io.newURI(URL, null, null);
  let principal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
  Services.perms.removeFromPrincipal(principal, "offline-app");
  Services.prefs.clearUserPref("offline-apps.allow_by_default");
});

var cacheCount = 0;
var intervalID = 0;

//
// Handle "message" events which are posted from the iframe upon
// offline cache events.
//
function handleMessageEvents(event) {
  cacheCount++;
  switch (cacheCount) {
    case 1:
      // This is the initial caching off offline data.
      is(event.data, "oncache", "Child was successfully cached.");
      // Reload the frame; this will generate an error message
      // in the case of bug 501422.
      event.source.location.reload();
      // Use setInterval to repeatedly call a function which
      // checks that one of two things has occurred:  either
      // the offline cache is udpated (which means our iframe
      // successfully reloaded), or the string "error" appears
      // in the iframe, as in the case of bug 501422.
      intervalID = setInterval(function() {
        // Sometimes document.body may not exist, and trying to access
        // it will throw an exception, so handle this case.
        try {
          var bodyInnerHTML = event.source.document.body.innerHTML;
        } catch (e) {
          bodyInnerHTML = "";
        }
        if (cacheCount == 2 || bodyInnerHTML.includes("error")) {
          clearInterval(intervalID);
          is(cacheCount, 2, "frame not reloaded successfully");
          if (cacheCount != 2) {
            finish();
          }
        }
      }, 100);
      break;
    case 2:
      is(event.data, "onupdate", "Child was successfully updated.");
      clearInterval(intervalID);
      finish();
      break;
    default:
      // how'd we get here?
      ok(false, "cacheCount not 1 or 2");
  }
}

function test() {
  waitForExplicitFinish();

  Services.prefs.setBoolPref("offline-apps.allow_by_default", true);

  // Open a new tab.
  gBrowser.selectedTab = gBrowser.addTab(URL);
  registerCleanupFunction(() => gBrowser.removeCurrentTab());

  BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
    let window = gBrowser.selectedBrowser.contentWindow;

    window.addEventListener("message", handleMessageEvents, false);
  });
}
