docshell/test/navigation/test_ship_beforeunload_fired.html
author Dana Keeler <dkeeler@mozilla.com>
Sat, 12 Jul 2025 15:57:37 +0000 (14 hours ago)
changeset 796342 3a804f83c6b282c3c6b6ed9b67bacbc277bfb300
parent 777967 60d24ed8df06fb04edaeefde1f20005ff2e44857
permissions -rw-r--r--
Bug 1976779 - rsclientcerts: make each backend responsible for rate-limiting calls to find_objects r=jschanck Before this patch, `rsclientcerts::manager` would rate-limit calls to `find_objects` to once every 3 seconds because the underlying operation can be time-consuming (in particular, on macOS and Windows, if there are many certificates/keys available). On Android, keys aren't available until the user selects one, which means that if a call to `find_objects` happened before the selection prompt was shown (which is what happens) and the user chose one in less than 3 seconds, the backend wouldn't search again, thus making it seem like no keys were available, which would cause Firefox to not send a client certificate. This patch makes each backend implementation responsible for this rate-limiting, because only they know if it's appropriate to do so (in particular, on Android, `find_objects` doesn't have the same performance concern as on macOS and Windows because rather than searching for certificates and keys, it asks `ClientAuthCertificateManager` for the cached list of certificates and keys that have already been approved for use by the user). Differential Revision: https://phabricator.services.mozilla.com/D257065
<html>
  <head>
    <title>
      Test that ensures beforeunload is fired when session-history-in-parent is enabled
    </title>
    <script src="/tests/SimpleTest/SimpleTest.js"></script>
    <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
  </head>
  <script>
    SimpleTest.waitForExplicitFinish();

    /*
     * This test ensures beforeunload is fired on the current page
     * when it is entering BFCache and the next page is coming out
     * from BFCache
     *
     * (1) The controller page opens a new window, and page A is loaded there.
     * (2) Page A then navigates to page B, and a beforeunload event
     *     listener is registered on page B.
     * (3) Page B then navigates back to page A, and the beforeunload handler
     *     should send a message to the controller page.
     * (4) Page A then navigates back to page B to check if page B has
     *     been successfully added to BFCache.
     */

    var bc = SpecialPowers.wrap(BroadcastChannel).unpartitionedTestingChannel("ship_beforeunload");
    var pageshowCount = 0;
    var beforeUnloadFired = false;
    bc.onmessage = function(event) {
      if (event.data.type == "pageshow") {
        ++pageshowCount;
        if (pageshowCount == 1) {
          bc.postMessage({action: "navigate_to_page_b"});
        } else if (pageshowCount == 2) {
          ok(!event.data.persisted, "?pageb shouldn't in BFCache because it's the first navigation");
          bc.postMessage({action: "register_beforeunload", loadNextPageFromSessionHistory: true});
        } else if (pageshowCount == 3) {
          ok(event.data.persisted, "navigated back to page A that was in BFCacache from page B");
          ok(beforeUnloadFired, "beforeunload has fired on page B");
          bc.postMessage({action: "back_to_page_b", forwardNavigateToPageB: true});
        } else if (pageshowCount == 4) {
          ok(event.data.persisted, "page B has beforeunload fired and also entered BFCache");
          bc.postMessage({action: "close"});
          SimpleTest.finish();
        }
      } else if (event.data == "beforeunload_fired") {
        beforeUnloadFired = true;
      }
    }

    function runTest() {
      SpecialPowers.pushPrefEnv({"set": [
          ["fission.bfcacheInParent", true],
          ["docshell.shistory.bfcache.ship_allow_beforeunload_listeners", true]
        ]},
        function() {
          window.open("file_ship_beforeunload_fired.html", "", "noopener");
        }
      );
    }
  </script>
  <body onload="runTest()"></body>
</html>