| <!DOCTYPE html> |
| <html> |
| <head> |
| <style> |
| #pane { |
| display:inline-block; |
| width:200px; |
| height:500px; |
| } |
| #boxup { |
| position: absolute; |
| top:0px; |
| width:200px; |
| height:230px; |
| background-color: #000; |
| opacity:.4; |
| } |
| #boxdown { |
| position: absolute; |
| top:270px; |
| width:200px; |
| height:230px; |
| background-color: #000; |
| opacity:.4; |
| } |
| #objectBack { |
| position: absolute; |
| top:200px; |
| width:200px; |
| height:100px; |
| background-color: #6c6; |
| } |
| #targetElement { |
| position: absolute; |
| top:30px; |
| width:200px; |
| height:40px; |
| background-color: #c66; |
| } |
| </style> |
| <script src="../../resources/js-test-pre.js"></script> |
| <script src="../../resources/ui-helper.js"></script> |
| </head> |
| <body onload="setupTopLevel();"> |
| <script> |
| window.jsTestIsAsync = true; |
| |
| var pageScrollPositionBeforeGesture; |
| var divElement; |
| var divScrollPositionBeforeGesture; |
| |
| var deleteThreshhold = 40; |
| |
| function locationInWindowCoordinates(element) |
| { |
| var position = {}; |
| position.x = element.offsetLeft; |
| position.y = element.offsetTop; |
| |
| while (element.offsetParent) { |
| position.x = position.x + element.offsetParent.offsetLeft; |
| position.y = position.y + element.offsetParent.offsetTop; |
| if (element == document.getElementsByTagName("body")[0]) |
| break; |
| |
| element = element.offsetParent; |
| } |
| |
| return position; |
| } |
| |
| document.addEventListener("DOMContentLoaded", function() { |
| var objectBack = document.getElementById("objectBack"); |
| var targetElement = document.getElementById("targetElement"); |
| var inIFrame = window.parent !== window; |
| var pos = 0; |
| |
| |
| document.addEventListener("wheel", function(event) { |
| pos = pos - event.deltaY ; |
| move(objectBack, pos); |
| if (Math.abs(pos) > deleteThreshhold) { |
| // don't remove it twice |
| if (targetElement.parentNode) { |
| var parent = targetElement.parentNode; |
| parent.removeChild(targetElement); |
| testPassed("Removed the target element"); |
| } |
| } |
| event.preventDefault(); |
| }); |
| |
| // Setup |
| targetElement.innerHTML = "Put cursor here. Scroll up/down"; |
| |
| function move(element, pos) { |
| element.style.transform = "translateY(" + pos + "px)"; |
| } |
| }); |
| |
| function checkForScroll() |
| { |
| var pageScrollPositionAfterGesture = document.scrollingElement.scrollTop; |
| |
| // The page should not have scrolled |
| if (pageScrollPositionBeforeGesture != pageScrollPositionAfterGesture) |
| testFailed("Page received scroll events, when it should not have. Expected " + pageScrollPositionBeforeGesture + ", but got " + pageScrollPositionAfterGesture); |
| else |
| testPassed("Page did not scroll"); |
| |
| var divScrollPositionAfterGesture = divElement.getBoundingClientRect().top; |
| |
| // The div should have continued moving after the element was deleted |
| if (divScrollPositionAfterGesture > (divScrollPositionBeforeGesture - deleteThreshhold - 10)) |
| testFailed("div did not scroll to proper location. Expected " + divScrollPositionBeforeGesture + ", but got " + divScrollPositionAfterGesture); |
| else |
| testPassed("div continued scrolling after target element was deleted."); |
| |
| finishJSTest(); |
| } |
| |
| async function scrollTest() |
| { |
| pageScrollPositionBeforeGesture = document.scrollingElement.scrollTop; |
| |
| divElement = document.getElementById('objectBack'); |
| |
| divScrollPositionBeforeGesture = divElement.getBoundingClientRect().top; |
| |
| const windowPosition = locationInWindowCoordinates(divElement); |
| const startPosX = windowPosition.x + 0.5 * divElement.clientWidth; |
| const startPosY = windowPosition.y + 0.5 * divElement.clientHeight; |
| |
| const events = [ |
| { |
| type : "wheel", |
| viewX : startPosX, |
| viewY : startPosY, |
| deltaY : -10, |
| phase : "began" |
| }, |
| { |
| type : "wheel", |
| deltaY : -10, |
| phase : "changed" |
| }, |
| { |
| type : "wheel", |
| deltaY : -10, |
| phase : "changed" |
| }, |
| { |
| type : "wheel", |
| phase : "ended" |
| }, |
| { |
| type : "wheel", |
| deltaY : -10, |
| momentumPhase : "began" |
| }, |
| { |
| type : "wheel", |
| deltaY : -10, |
| momentumPhase : "changed" |
| }, |
| { |
| type : "wheel", |
| momentumPhase : "ended" |
| } |
| ]; |
| |
| await UIHelper.mouseWheelSequence({ events: events }); |
| checkForScroll(); |
| } |
| |
| function setupTopLevel() |
| { |
| if (window.eventSender) { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| setTimeout(scrollTest, 0); |
| } else { |
| var messageLocation = document.getElementById('parent'); |
| var message = document.createElement('div'); |
| message.innerHTML = "<p>This test is better run under DumpRenderTree. To manually test it, place the mouse pointer<br/>" |
| + "at the top of the page, and then use the mouse wheel or a two-finger swipe to scroll the<br/>" |
| + "down past the iframe.<br/><br/>" |
| + "The iframe should not scroll.</p>"; |
| messageLocation.appendChild(message); |
| } |
| } |
| </script> |
| <div id="parent" style="height: 2000px;"> |
| <div id="pane"> |
| <h3>Container</h3> |
| <div id="objectBack"><div id="targetElement"></div></div> |
| <div id="boxup"></div> |
| <div id="boxdown"></div> |
| </div> |
| <p class="description">After moving 40px up or down we remove the initial target element of wheel event from<br/> |
| the dom. In safari this causes the wheel event to stop firing on the current frame, but it<br/> |
| then starts firing on the parent frame.</p> |
| </div> |
| <div id="console"></div> |
| <script> |
| description("Tests that iframe doesn't consume wheel events when scrolling a select in an iframe."); |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |