test_input_modify_by_wheel.html (4692B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=1261673 5 https://bugzilla.mozilla.org/show_bug.cgi?id=1970030 6 --> 7 <head> 8 <meta charset="utf-8"> 9 <title>Test change number and range input value through wheel event</title> 10 <script src="/tests/SimpleTest/SimpleTest.js"></script> 11 <script src="/tests/SimpleTest/EventUtils.js"></script> 12 <script src="/tests/SimpleTest/paint_listener.js"></script> 13 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 14 </head> 15 <body> 16 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1261673">Mozilla Bug 1261673</a> 17 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1970030">Mozilla Bug 1970030</a> 18 <p id="display"></p> 19 <div id="content" style="display: none"> 20 </div> 21 <input id="test_number" type="number" value=5> 22 <script type="text/javascript"> 23 24 SimpleTest.waitForExplicitFinish(); 25 SimpleTest.waitForFocus(runTests); 26 27 function runTests() { 28 let input = window.document.getElementById("test_number"); 29 30 // focus: whether the target input element is focused 31 // deltaY: deltaY of WheelEvent 32 // deltaMode: deltaMode of WheelEvent 33 // valueChanged: expected value changes after input element handled the wheel event 34 let params = [ 35 {focus: true, deltaY: 1.0, deltaMode: WheelEvent.DOM_DELTA_LINE, valueChanged: -1}, 36 {focus: true, deltaY: -1.0, deltaMode: WheelEvent.DOM_DELTA_LINE, valueChanged: 1}, 37 {focus: true, deltaY: 1.0, deltaMode: WheelEvent.DOM_DELTA_PAGE, valueChanged: -1}, 38 {focus: true, deltaY: -1.0, deltaMode: WheelEvent.DOM_DELTA_PAGE, valueChanged: 1}, 39 {focus: true, deltaY: 1.0, deltaMode: WheelEvent.DOM_DELTA_PIXEL, valueChanged: 0}, 40 {focus: true, deltaY: -1.0, deltaMode: WheelEvent.DOM_DELTA_PIXEL, valueChanged: 0}, 41 {focus: false, deltaY: 1.0, deltaMode: WheelEvent.DOM_DELTA_LINE, valueChanged: 0}, 42 {focus: false, deltaY: -1.0, deltaMode: WheelEvent.DOM_DELTA_LINE, valueChanged: 0} 43 ]; 44 45 let testIdx = 0; 46 47 // The expected value of the number field; used in is() check below. 48 // Initialized to the value that the field starts out with; subtests will 49 // modify this if they expect to modify the value. 50 let expectedValue = parseInt(input.value); 51 52 // Actual/expected number of mutations to the number field's value: 53 let actualChangeCount = 0; 54 let expectedChangeCount = 0; 55 56 const prefName = "dom.input.number_and_range_modified_by_mousewheel"; 57 let didFlipPref = false; 58 let isPrefEnabled = SpecialPowers.getBoolPref(prefName); 59 is(isPrefEnabled, false, "Expecting pref to be disabled by default"); 60 input.addEventListener("change", () => { 61 ++actualChangeCount; 62 }); 63 64 function runNext() { 65 let p = params[testIdx]; 66 (p.focus) ? input.focus() : input.blur(); 67 if (isPrefEnabled && p.valueChanged != 0) { 68 expectedChangeCount++; 69 expectedValue += p.valueChanged; 70 } 71 72 const wheelEventPromise = new Promise(res => { 73 input.addEventListener("wheel", e => res(e), { passive: true, once: true }); 74 }) 75 76 sendWheelAndPaint(input, 1, 1, { deltaY: p.deltaY, deltaMode: p.deltaMode }, 77 async () => { 78 is(parseInt(input.value), expectedValue, 79 "Handle wheel in number input test-" + testIdx + 80 " with pref " + (isPrefEnabled ? "en" : "dis") + "abled"); 81 82 info(`actualChangeCount ${actualChangeCount}, expectedChangeCount ${expectedChangeCount}`); 83 is(actualChangeCount, expectedChangeCount, 84 "UA should fire change event when input's value changed"); 85 86 // Need to wrap event to see if it was default prevented by system 87 const wheelEvent = SpecialPowers.wrap(await wheelEventPromise); 88 89 const shouldScroll = !(isPrefEnabled && p.valueChanged); 90 if (shouldScroll) { 91 ok(!wheelEvent.defaultPrevented, "Wheel event should not be default prevented"); 92 } else { 93 ok(wheelEvent.defaultPrevented, "Wheel event should be default prevented"); 94 } 95 96 if (++testIdx < params.length) { 97 // More subtests remain; kick off the next one. 98 runNext(); 99 } else if (!didFlipPref) { 100 // Reached the end of the subtest list. Flip the pref 101 // and restart our iteration over the subtests. 102 await SpecialPowers.pushPrefEnv({ 103 set: [[prefName, !isPrefEnabled]], 104 }); 105 isPrefEnabled = !isPrefEnabled; 106 didFlipPref = true; 107 testIdx = actualChangeCount = expectedChangeCount = 0; 108 runNext(); 109 } else { 110 // Reached the end of the subtest list, for both pref settings. 111 // We're done! 112 SimpleTest.finish(); 113 } 114 }); 115 } 116 runNext(); 117 } 118 119 </script> 120 </body> 121 </html>