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>