test_bug784410.html (2877B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test bug 784410</title> 5 <script src="/tests/SimpleTest/SimpleTest.js"></script> 6 <script src="/tests/SimpleTest/EventUtils.js"></script> 7 <script src="/tests/SimpleTest/paint_listener.js"></script> 8 <script src="/tests/gfx/layers/apz/test/mochitest/apz_test_utils.js"></script> 9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 10 </head> 11 <body> 12 <p id="display"></p> 13 <div id="outer" style="overflow:auto; height:200px; border:2px dotted black; transform: translateY(1px)" onscroll="doneScroll()"> 14 <div id="d" style="overflow:auto; height:102px;" onscroll="doneScroll()"> 15 <div id="inner" style="height:100.1px; border:1px solid black; background:yellow;">Hello</div> 16 </div> 17 <div style="height:500px;"></div> 18 </div> 19 <pre id="test"> 20 <script class="testbody" type="text/javascript"> 21 var sel = window.getSelection(); 22 var outer = document.getElementById("outer"); 23 var d = document.getElementById("d"); 24 var inner = document.getElementById("inner"); 25 var smoothScrollPref = "general.smoothScroll"; 26 27 function innerScrollOffset() { 28 return inner.getBoundingClientRect().top - d.getBoundingClientRect().top; 29 } 30 var innerStartScrollOffset = innerScrollOffset(); 31 32 var step = 0; 33 var wheelAndPaintDone = false; 34 async function doneScroll() { 35 ++step; 36 switch (step) { 37 case 1: 38 is(innerScrollOffset(), innerStartScrollOffset, "Inner element should not have scrolled down"); 39 ok(outer.scrollTop > 0, "Outer element should have scrolled down"); 40 41 outer.scrollTop = 0; 42 break; 43 case 2: 44 // wait until APZ is ready to handle the wheel event, then send it 45 await promiseApzFlushedRepaints(); 46 // Wait for paints to flush, so APZ is notified of the new scroll offset. 47 sendWheelAndPaint(inner, 4, 4, 48 { deltaMode: WheelEvent.DOM_DELTA_LINE, deltaY: 1 }, 49 function() { 50 wheelAndPaintDone = true; 51 doneTest(); 52 }); 53 break; 54 case 3: 55 is(innerScrollOffset(), innerStartScrollOffset, "Inner element should not have scrolled down"); 56 ok(outer.scrollTop > 0, "Outer element should have scrolled down"); 57 58 doneTest(); 59 break; 60 } 61 } 62 63 function doneTest() { 64 // wait until wheelAndPaintDone has invoked its callback before we end the 65 // test, otherwise we might get calls to advanceTimeAndRefresh after we 66 // restore normal refresh, and that will screw up the next test. 67 if (wheelAndPaintDone && step == 3) { 68 SpecialPowers.DOMWindowUtils.restoreNormalRefresh(); 69 SimpleTest.finish(); 70 } 71 } 72 73 function test() { 74 sel.collapse(inner.firstChild, 2); 75 synthesizeKey("KEY_PageDown"); 76 } 77 78 SimpleTest.waitForExplicitFinish(); 79 SimpleTest.waitForFocus(function() { 80 SpecialPowers.pushPrefEnv({"set":[[smoothScrollPref, false], 81 ["test.events.async.enabled", true]]}, test); 82 }); 83 </script> 84 </pre> 85 </body> 86 </html>