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

/* Ensure that clicking the button in the Offline mode neterror page makes the browser go online. See bug 435325. */

add_task(async function checkSwitchPageToOnlineMode() {

  // Go offline and disable the proxy and cache, then try to load the test URL.
  Services.io.offline = true;

  // Tests always connect to localhost, and per bug 87717, localhost is now
  // reachable in offline mode.  To avoid this, disable any proxy.
  let proxyPrefValue = SpecialPowers.getIntPref("network.proxy.type");
  await SpecialPowers.pushPrefEnv({"set": [
    ["network.proxy.type", 0],
    ["browser.cache.disk.enable", false],
    ["browser.cache.memory.enable", false],
  ]});

  await BrowserTestUtils.withNewTab("about:blank", async function(browser) {
    let netErrorLoaded = BrowserTestUtils.waitForErrorPage(browser);

    await BrowserTestUtils.loadURI(browser, "http://example.com/");
    await netErrorLoaded;

    // Re-enable the proxy so example.com is resolved to localhost, rather than
    // the actual example.com.
    await SpecialPowers.pushPrefEnv({"set": [["network.proxy.type", proxyPrefValue]]});
    let changeObserved = TestUtils.topicObserved("network:offline-status-changed");

    // Click on the 'Try again' button.
    await ContentTask.spawn(browser, null, async function() {
      ok(content.document.documentURI.startsWith("about:neterror?e=netOffline"), "Should be showing error page");
      content.document.getElementById("errorTryAgain").click();
    });

    await changeObserved;
    ok(!Services.io.offline, "After clicking the 'Try Again' button, we're back online.");
  });
});

registerCleanupFunction(function() {
  Services.io.offline = false;
});
