tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_zoom_restore_bfcache.html (4944B)


      1 <!doctype html>
      2 <meta charset="utf-8">
      3 <title>Test for zoom restoration when coming from the bfcache</title>
      4 <script src="/tests/SimpleTest/SimpleTest.js"></script>
      5 <script src="/tests/SimpleTest/paint_listener.js"></script>
      6 <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
      7 <script>
      8 SimpleTest.waitForExplicitFinish();
      9 
     10 /**
     11 * - main page (this one) opens file_zoom_restore_bfcache.html
     12 * - file_zoom_restore_bfcache.html sends "handlePageShow" to main page
     13 * - main page sends file_zoom_restore_bfcache.html "case1sendData"
     14 * - file_zoom_restore_bfcache.html sends "case1data" to main page
     15 * - main page sends "case1click" to file_zoom_restore_bfcache.html
     16 * - file_zoom_restore_bfcache.html clicks on <a> element, navigating to uri
     17 *   file_zoom_restore_bfcache.html?2, and gets bfcached
     18 * - file_zoom_restore_bfcache.html?2 sends "handlePageShow" to main page
     19 * - main page sends "case2sendData" to file_zoom_restore_bfcache.html?2
     20 * - file_zoom_restore_bfcache.html?2 sends "case2data" to main page
     21 * - main page sends "case2action" to file_zoom_restore_bfcache.html?2
     22 * - file_zoom_restore_bfcache.html?2 sends "case2dataAnimationFrame" to main page
     23 * - main page sends "case2back" to file_zoom_restore_bfcache.html?2
     24 * - file_zoom_restore_bfcache.html?2 navigates back to file_zoom_restore_bfcache.html
     25 * - file_zoom_restore_bfcache.html sends "handlePageShow" to main page
     26 * - main page sends "case3sendData to file_zoom_restore_bfcache.html
     27 * - file_zoom_restore_bfcache.html sends "case3data" to main page
     28 * - main page sends "close to file_zoom_restore_bfcache.html
     29 * - file_zoom_restore_bfcache.html closes bc and window and sends back "closed"
     30 */
     31 
     32 const originalDPR = window.devicePixelRatio;
     33 let loadCount = 0;
     34 var bc = new BroadcastChannel("zoomRestoreBfcache");
     35 var bcPage2 = new BroadcastChannel("zoomRestoreBfcache?2");
     36 bc.onmessage = (msgEvent) => {
     37  var msg = msgEvent.data;
     38  var command = msg.command;
     39  info(`Main page, received command from normal bc=${command}`);
     40  switch (command) {
     41    case "handlePageShow": {
     42      handlePageShow(msgEvent.data.eventPersisted);
     43      break;
     44    }
     45    case "case1data": {
     46      is(loadCount, 1, "Case 1");
     47      is(msg.devicePixelRatio, originalDPR, "No zoom");
     48      bc.postMessage({command: "case1click"});
     49      // The end of case 1
     50      break;
     51    }
     52    case "case3data": {
     53      is(loadCount, 2, "Case 3");
     54      is(msg.devicePixelRatio, originalDPR * 2, "Should preserve zoom when restored");
     55      let is_if_ship = SpecialPowers.Services.appinfo.sessionHistoryInParent ? is : todo_is;
     56      is_if_ship(msg.frameDevicePixelRatio, originalDPR * 2, "Should preserve zoom on frames too");
     57      bc.postMessage({command: "close"});
     58      // Now we wait for "closed"
     59      break;
     60    }
     61    case "closed": {
     62      is(loadCount, 2, "Case 3");
     63      bc.close();
     64      SimpleTest.finish();
     65      break;
     66    }
     67    default:
     68      ok(false, "should not receive extra messages via BroadcastChannel");
     69  }
     70 }
     71 bcPage2.onmessage = (msgEvent) => {
     72  var msg = msgEvent.data;
     73  var command = msg.command;
     74  info(`Main page, received command from bc?2=${command}`);
     75  switch (command) {
     76    case "handlePageShow": {
     77      handlePageShow(msgEvent.data.eventPersisted);
     78      break;
     79    }
     80    case "case2data": {
     81      is(loadCount, 2, "Case 2");
     82      is(msg.devicePixelRatio, originalDPR, "No zoom (yet)")
     83      is(msg.frameDevicePixelRatio, originalDPR, "No zoom on frame either");
     84      bcPage2.postMessage({command: "case2action"});
     85      // Now we wait for "case2dataAnimationFrame"
     86      break;
     87    }
     88    case "case2dataAnimationFrame": {
     89      is(loadCount, 2, "Case 2");
     90      is(msg.devicePixelRatio, originalDPR * 2, "Zoomed");
     91      is(msg.frameDevicePixelRatio, originalDPR * 2, "Zoomed iframe too");
     92      bcPage2.postMessage({command: "case2back"});
     93      bcPage2.close();
     94      // The end of case 2
     95      break;
     96    }
     97    default:
     98      ok(false, "should not receive extra messages via BroadcastChannel");
     99  }
    100 }
    101 function handlePageShow(persisted) {
    102  ok(typeof persisted == "boolean", "Should get the persisted state from the pageshow event");
    103  if (loadCount == 2) {
    104    ok(persisted,  "Should've gone into the bfcache after the back navigation");
    105  } else {
    106    ok(!persisted,  "Should NOT be retrieved from bfcache");
    107  }
    108 
    109  if (loadCount == 0) {
    110    loadCount++;
    111    bc.postMessage({command: "case1sendData"});
    112    // Now we wait for the "case1data" message
    113  } else if (loadCount == 1) {
    114    loadCount++;
    115    bcPage2.postMessage({command: "case2sendData"});
    116    // Now we wait for the "case2data" message
    117  } else {
    118    bc.postMessage({command: "case3sendData"});
    119    // Now we wait for the "case3data" message
    120  }
    121 }
    122 
    123 // We want to test Gecko's zoom handling, not the front-end's.
    124 SpecialPowers.pushPrefEnv({set: [["browser.zoom.siteSpecific", false]]}, () => {
    125  window.open('file_zoom_restore_bfcache.html', '_blank', 'noopener');
    126 });
    127 </script>