Changeset 144519 in webkit
- Timestamp:
- Mar 1, 2013 5:08:22 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 8 added
- 15 edited
- 4 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r144516 r144519 1 2013-03-01 Terry Anderson <tdanderson@chromium.org> 2 3 EventHandler::handleGestureScrollUpdate() should invoke the user-generated scroll routines 4 so its behavior matches other user-initiated scrolls 5 https://bugs.webkit.org/show_bug.cgi?id=109769 6 7 Reviewed by James Robinson. 8 9 Four new layout tests have been added and touch-gesture-scroll-page.html has been 10 modified to demonstrate that this patch fixes two existing bugs. See the inline 11 comments below for details. 12 13 Because I am now using the existing user-generated scroll logic, the delta for a single 14 GestureScrollUpdate event will not be propagated to the parent of the targeted node 15 unless the targeted node has no remaining scrollable area. So the changes to the 16 existing layout tests have been made to ensure that the targeted node has been fully 17 scrolled before subsequent GestureScrollUpdate events will scroll the parent(s) of 18 the targeted node. 19 20 I have also removed the function recordScroll() from the existing layout tests 21 because this function already exists in the included file resources/gesture-helpers.js. 22 23 * fast/events/touch/gesture/touch-gesture-noscroll-body-expected.txt: Added. 24 * fast/events/touch/gesture/touch-gesture-noscroll-body-propagated-expected.txt: Added. 25 * fast/events/touch/gesture/touch-gesture-noscroll-body-propagated.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html. 26 * fast/events/touch/gesture/touch-gesture-noscroll-body-xhidden-expected.txt: Added. 27 * fast/events/touch/gesture/touch-gesture-noscroll-body-xhidden.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html. 28 * fast/events/touch/gesture/touch-gesture-noscroll-body-yhidden-expected.txt: Added. 29 * fast/events/touch/gesture/touch-gesture-noscroll-body-yhidden.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html. 30 * fast/events/touch/gesture/touch-gesture-noscroll-body.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html. 31 * fast/events/touch/gesture/touch-gesture-scroll-div-not-propagated.html: 32 * fast/events/touch/gesture/touch-gesture-scroll-div-propagated.html: 33 * fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated.html: 34 * fast/events/touch/gesture/touch-gesture-scroll-iframe-not-propagated.html: 35 * fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated.html: 36 * fast/events/touch/gesture/touch-gesture-scroll-page-not-propagated.html: 37 * fast/events/touch/gesture/touch-gesture-scroll-page-propagated.html: 38 * fast/events/touch/gesture/touch-gesture-scroll-page.html: 39 I modified this layout test in order to add test coverage for another bug 40 which is fixed by this patch: if the hit test performed on a GestureScrollBegin 41 does not target a specific node, the subsequent GestureScrollUpdate events should 42 still attempt to scroll the page itself. This is consistent with how mousewheel 43 events behave. 44 * platform/chromium/fast/events/touch/gesture/touch-gesture-noscroll-body-expected.txt: Added. 45 * platform/chromium/fast/events/touch/gesture/touch-gesture-noscroll-body-propagated-expected.txt: Added. 46 * platform/chromium/fast/events/touch/gesture/touch-gesture-noscroll-body-xhidden-expected.txt: Added. 47 * platform/chromium/fast/events/touch/gesture/touch-gesture-noscroll-body-yhidden-expected.txt: Added. 48 These four new layout tests verify that a non-scrollable body will not scroll, 49 as reported in https://bugs.webkit.org/show_bug.cgi?id=109316. 50 1 51 2013-03-01 Roger Fong <roger_fong@apple.com> 2 52 -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-noscroll-body-propagated.html
r144518 r144519 1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">1 <!DOCTYPE html> 2 2 <html> 3 3 <head> … … 6 6 <script src="resources/gesture-helpers.js"></script> 7 7 <style type="text/css"> 8 #touchtarget { 9 width: 100px; 10 height: 100px; 11 background: white; 12 overflow:scroll; 13 } 14 8 15 ::-webkit-scrollbar { 9 16 width: 0px; … … 18 25 margin: 0px; 19 26 } 27 20 28 #redbox { 21 29 width: 100px; … … 31 39 </style> 32 40 </head> 33 <body style="margin:0" onload="runTest();"> 41 <body style="margin:0; overflow-y:hidden;" onload="runTest();"> 42 43 <div id="touchtarget"> 44 <table border="0" cellspacing="0px" id="tablefoo"> 45 <tr> 46 <td><div id="redbox"></div></td> 47 <td><div id="greenbox"></div></td> 48 </tr> 49 <tr> 50 <td><div id="greenbox"></div></td> 51 <td><div id="greenbox"></div></td> 52 </tr> 53 </table> 54 </div> 34 55 35 56 <table id="table_to_fill"> … … 45 66 var gesturesOccurred = 0; 46 67 var scrollAmountX = ['0', '0']; 47 var scrollAmountY = [' 70', '130'];68 var scrollAmountY = ['0', '0']; 48 69 var wheelEventsOccurred = 0; 49 70 var expectedWheelEventsOccurred = ['0', '0']; 50 71 var scrollEventsOccurred = 0; 72 var expectedScrollEventsOccurred = '0'; 51 73 var scrolledElement = 'document.body' 52 var scrollEventsOccurred = 0;53 var expectedScrollEventsOccurred = '1';54 55 function recordScroll(event) {56 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);57 scrollEventsOccurred++;58 59 if (window.eventSender) {60 // Because scroll events arrive asynchronously, only one will arrive.61 if (gesturesOccurred == expectedGesturesTotal) {62 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);63 // If we've got here, we've passed.64 successfullyParsed = true;65 isSuccessfullyParsed();66 if (window.testRunner)67 testRunner.notifyDone();68 }69 }70 }71 74 72 75 // Always construct a page larger than the vertical height of the window. … … 94 97 { 95 98 debug("first gesture"); 96 eventSender.gestureScrollBegin( 10, 72);97 eventSender.gestureScrollUpdate(0, - 30);98 eventSender.gestureScrollUpdate(0, - 40);99 eventSender.gestureScrollBegin(95, 12); 100 eventSender.gestureScrollUpdate(0, -100); 101 eventSender.gestureScrollUpdate(0, -10); 99 102 eventSender.gestureScrollEnd(0, 0); 100 103 … … 106 109 { 107 110 debug("second gesture"); 108 eventSender.gestureScrollBegin(12, 40);109 eventSender.gestureScrollUpdate(0, - 30);110 eventSender.gestureScrollUpdate(0, - 30);111 eventSender.gestureScrollBegin(12, 97); 112 eventSender.gestureScrollUpdate(0, -95); 113 eventSender.gestureScrollUpdate(0, -200); 111 114 eventSender.gestureScrollEnd(0, 0); 112 115 113 116 // Wait for layout. 114 117 checkScrollOffset(); 118 119 // In this test we do not expect any scroll events to 120 // be received by the event listener, so we signal 121 // the end of the test by calling this function instead 122 // of relying on recordScroll() to do it. 123 finishTest(); 115 124 } 116 125 … … 122 131 buildPage(); 123 132 if (window.eventSender) { 124 description('This tests scroll gesture event scrolling on a whole page.'); 133 description('This tests that a page cannot be scrolled vertically with touch if its body has style overflow-y:hidden ' + 134 'and the scroll event is propogated from a scrollable child div.'); 135 125 136 if (checkTestDependencies()) 126 137 firstGestureScroll(); … … 128 139 exitIfNecessary(); 129 140 } else { 130 debug("This test requires DumpRenderTree. Gesture-scroll the page to validate the implementation."); 141 debug("This test requires DumpRenderTree. Touch scroll the red rect to log."); 142 } 143 } 144 145 function finishTest() 146 { 147 if (window.eventSender) { 148 if (gesturesOccurred == expectedGesturesTotal) { 149 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred); 150 successfullyParsed = true; 151 isSuccessfullyParsed(); 152 if (window.testRunner) 153 testRunner.notifyDone(); 154 } 131 155 } 132 156 } 133 157 </script> 134 135 136 137 158 </body> 138 159 </html> -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-noscroll-body-xhidden.html
r144518 r144519 1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">1 <!DOCTYPE html> 2 2 <html> 3 3 <head> … … 6 6 <script src="resources/gesture-helpers.js"></script> 7 7 <style type="text/css"> 8 #touchtarget { 9 width: 100px; 10 height: 100px; 11 background: white; 12 overflow:hidden; 13 } 14 8 15 ::-webkit-scrollbar { 9 16 width: 0px; … … 18 25 margin: 0px; 19 26 } 27 20 28 #redbox { 21 29 width: 100px; … … 31 39 </style> 32 40 </head> 33 <body style="margin:0 " onload="runTest();">41 <body style="margin:0; overflow-x:hidden;" onload="runTest();"> 34 42 35 <table id="table_to_fill"> 43 <table id="horizontal_table_to_fill"> 44 <tr id="firstrow"> 45 <td><div id="redbox"></div></td> 46 <td><div id="greenbox"></div></td> 47 </tr> 48 </table> 49 50 <table id="vertical_table_to_fill"> 36 51 <tr><td><div id="greenbox"></div></td></tr> 37 52 <tr><td><div id="redbox"></div></td></tr> … … 45 60 var gesturesOccurred = 0; 46 61 var scrollAmountX = ['0', '0']; 47 var scrollAmountY = [' 70', '130'];62 var scrollAmountY = ['110', '205']; 48 63 var wheelEventsOccurred = 0; 49 64 var expectedWheelEventsOccurred = ['0', '0']; 50 65 var scrollEventsOccurred = 0; 66 var expectedScrollEventsOccurred = '1'; 51 67 var scrolledElement = 'document.body' 52 var scrollEventsOccurred = 0;53 var expectedScrollEventsOccurred = '1';54 55 function recordScroll(event) {56 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);57 scrollEventsOccurred++;58 59 if (window.eventSender) {60 // Because scroll events arrive asynchronously, only one will arrive.61 if (gesturesOccurred == expectedGesturesTotal) {62 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);63 // If we've got here, we've passed.64 successfullyParsed = true;65 isSuccessfullyParsed();66 if (window.testRunner)67 testRunner.notifyDone();68 }69 }70 }71 68 72 69 // Always construct a page larger than the vertical height of the window. 73 70 function buildPage() 74 71 { 75 var table = document.getElementById('table_to_fill'); 72 // build vertical table 73 var table = document.getElementById('vertical_table_to_fill'); 76 74 var targetHeight = document.body.offsetHeight; 77 75 var cellPairHeight = table.offsetHeight; … … 87 85 } 88 86 87 // build horizontal table 88 var horizontalTable = document.getElementById('horizontal_table_to_fill'); 89 var tableRow = document.getElementById('firstrow'); 90 var targetWidth = document.body.offsetWidth; 91 var cellPairWidth = horizontalTable.offsetWidth; 92 numberOfReps = targetWidth / cellPairWidth * 2; 93 for (i = 0; i < numberOfReps; i++) { 94 var p = document.createElement('td'); 95 p.innerHTML = '<div id="redbox"></div>'; 96 tableRow.appendChild(p); 97 var p = document.createElement('td'); 98 p.innerHTML = '<div id="greenbox"></div>'; 99 tableRow.appendChild(p); 100 } 101 89 102 window.addEventListener("scroll", recordScroll); 90 103 window.addEventListener("mousewheel", recordWheel); … … 94 107 { 95 108 debug("first gesture"); 96 eventSender.gestureScrollBegin(10, 72); 97 eventSender.gestureScrollUpdate(0, -30); 98 eventSender.gestureScrollUpdate(0, -40); 109 eventSender.gestureScrollBegin(95, 12); 110 eventSender.gestureScrollUpdate(-55, -110); 99 111 eventSender.gestureScrollEnd(0, 0); 100 112 … … 106 118 { 107 119 debug("second gesture"); 108 eventSender.gestureScrollBegin(12, 40); 109 eventSender.gestureScrollUpdate(0, -30); 110 eventSender.gestureScrollUpdate(0, -30); 120 eventSender.gestureScrollBegin(12, 97); 121 eventSender.gestureScrollUpdate(-42, -95); 111 122 eventSender.gestureScrollEnd(0, 0); 112 123 … … 122 133 buildPage(); 123 134 if (window.eventSender) { 124 description('This tests scroll gesture event scrolling on a whole page.'); 135 description('This tests that a page cannot be scrolled horizontally with touch ' + 136 '(but can still be scrolled vertically) if its body has style overflow-x:hidden. ' + 137 'The scroll events in this test have both an x and y component.'); 138 125 139 if (checkTestDependencies()) 126 140 firstGestureScroll(); … … 128 142 exitIfNecessary(); 129 143 } else { 130 debug("This test requires DumpRenderTree. Gesture-scroll the page to validate the implementation.");144 debug("This test requires DumpRenderTree. Touch scroll the red rect to log."); 131 145 } 132 146 } 133 147 </script> 134 135 136 137 148 </body> 138 149 </html> -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-noscroll-body-yhidden.html
r144518 r144519 1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">1 <!DOCTYPE html> 2 2 <html> 3 3 <head> … … 6 6 <script src="resources/gesture-helpers.js"></script> 7 7 <style type="text/css"> 8 #touchtarget { 9 width: 100px; 10 height: 100px; 11 background: white; 12 overflow:hidden; 13 } 14 8 15 ::-webkit-scrollbar { 9 16 width: 0px; … … 18 25 margin: 0px; 19 26 } 27 20 28 #redbox { 21 29 width: 100px; … … 31 39 </style> 32 40 </head> 33 <body style="margin:0 " onload="runTest();">41 <body style="margin:0; overflow-y:hidden;" onload="runTest();"> 34 42 35 <table id="table_to_fill"> 43 <table id="horizontal_table_to_fill"> 44 <tr id="firstrow"> 45 <td><div id="redbox"></div></td> 46 <td><div id="greenbox"></div></td> 47 </tr> 48 </table> 49 50 <table id="vertical_table_to_fill"> 36 51 <tr><td><div id="greenbox"></div></td></tr> 37 52 <tr><td><div id="redbox"></div></td></tr> … … 44 59 var expectedGesturesTotal = 2; 45 60 var gesturesOccurred = 0; 46 var scrollAmountX = [' 0', '0'];47 var scrollAmountY = [' 70', '130'];61 var scrollAmountX = ['55', '97']; 62 var scrollAmountY = ['0', '0']; 48 63 var wheelEventsOccurred = 0; 49 64 var expectedWheelEventsOccurred = ['0', '0']; 50 65 var scrollEventsOccurred = 0; 66 var expectedScrollEventsOccurred = '1'; 51 67 var scrolledElement = 'document.body' 52 var scrollEventsOccurred = 0;53 var expectedScrollEventsOccurred = '1';54 55 function recordScroll(event) {56 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);57 scrollEventsOccurred++;58 59 if (window.eventSender) {60 // Because scroll events arrive asynchronously, only one will arrive.61 if (gesturesOccurred == expectedGesturesTotal) {62 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);63 // If we've got here, we've passed.64 successfullyParsed = true;65 isSuccessfullyParsed();66 if (window.testRunner)67 testRunner.notifyDone();68 }69 }70 }71 68 72 69 // Always construct a page larger than the vertical height of the window. 73 70 function buildPage() 74 71 { 75 var table = document.getElementById('table_to_fill'); 72 // build vertical table 73 var table = document.getElementById('vertical_table_to_fill'); 76 74 var targetHeight = document.body.offsetHeight; 77 75 var cellPairHeight = table.offsetHeight; … … 87 85 } 88 86 87 // build horizontal table 88 var horizontalTable = document.getElementById('horizontal_table_to_fill'); 89 var tableRow = document.getElementById('firstrow'); 90 var targetWidth = document.body.offsetWidth; 91 var cellPairWidth = horizontalTable.offsetWidth; 92 numberOfReps = targetWidth / cellPairWidth * 2; 93 for (i = 0; i < numberOfReps; i++) { 94 var p = document.createElement('td'); 95 p.innerHTML = '<div id="redbox"></div>'; 96 tableRow.appendChild(p); 97 var p = document.createElement('td'); 98 p.innerHTML = '<div id="greenbox"></div>'; 99 tableRow.appendChild(p); 100 } 101 89 102 window.addEventListener("scroll", recordScroll); 90 103 window.addEventListener("mousewheel", recordWheel); … … 94 107 { 95 108 debug("first gesture"); 96 eventSender.gestureScrollBegin(10, 72); 97 eventSender.gestureScrollUpdate(0, -30); 98 eventSender.gestureScrollUpdate(0, -40); 109 eventSender.gestureScrollBegin(195, 12); 110 eventSender.gestureScrollUpdate(-55, -110); 99 111 eventSender.gestureScrollEnd(0, 0); 100 112 … … 106 118 { 107 119 debug("second gesture"); 108 eventSender.gestureScrollBegin(12, 40); 109 eventSender.gestureScrollUpdate(0, -30); 110 eventSender.gestureScrollUpdate(0, -30); 120 eventSender.gestureScrollBegin(120, 255); 121 eventSender.gestureScrollUpdate(-42, -95); 111 122 eventSender.gestureScrollEnd(0, 0); 112 123 … … 122 133 buildPage(); 123 134 if (window.eventSender) { 124 description('This tests scroll gesture event scrolling on a whole page.'); 135 description('This tests that a page cannot be scrolled vertically with touch ' + 136 '(but can still be scrolled horizontally) if its body has style overflow-y:hidden. ' + 137 'The scroll events in this test have both an x and y component.'); 138 125 139 if (checkTestDependencies()) 126 140 firstGestureScroll(); … … 128 142 exitIfNecessary(); 129 143 } else { 130 debug("This test requires DumpRenderTree. Gesture-scroll the page to validate the implementation.");144 debug("This test requires DumpRenderTree. Touch scroll the red rect to log."); 131 145 } 132 146 } 133 147 </script> 134 135 136 137 148 </body> 138 149 </html> -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-noscroll-body.html
r144518 r144519 1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">1 <!DOCTYPE html> 2 2 <html> 3 3 <head> … … 6 6 <script src="resources/gesture-helpers.js"></script> 7 7 <style type="text/css"> 8 #touchtarget { 9 width: 100px; 10 height: 100px; 11 background: white; 12 overflow:hidden; 13 } 14 8 15 ::-webkit-scrollbar { 9 16 width: 0px; … … 18 25 margin: 0px; 19 26 } 27 20 28 #redbox { 21 29 width: 100px; … … 31 39 </style> 32 40 </head> 33 <body style="margin:0 " onload="runTest();">41 <body style="margin:0; overflow:hidden;" onload="runTest();"> 34 42 35 <table id="table_to_fill"> 43 <table id="horizontal_table_to_fill"> 44 <tr id="firstrow"> 45 <td><div id="redbox"></div></td> 46 <td><div id="greenbox"></div></td> 47 </tr> 48 </table> 49 50 <table id="vertical_table_to_fill"> 36 51 <tr><td><div id="greenbox"></div></td></tr> 37 52 <tr><td><div id="redbox"></div></td></tr> … … 45 60 var gesturesOccurred = 0; 46 61 var scrollAmountX = ['0', '0']; 47 var scrollAmountY = [' 70', '130'];62 var scrollAmountY = ['0', '0']; 48 63 var wheelEventsOccurred = 0; 49 64 var expectedWheelEventsOccurred = ['0', '0']; 50 65 var scrollEventsOccurred = 0; 66 var expectedScrollEventsOccurred = '0'; 51 67 var scrolledElement = 'document.body' 52 var scrollEventsOccurred = 0;53 var expectedScrollEventsOccurred = '1';54 55 function recordScroll(event) {56 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);57 scrollEventsOccurred++;58 59 if (window.eventSender) {60 // Because scroll events arrive asynchronously, only one will arrive.61 if (gesturesOccurred == expectedGesturesTotal) {62 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);63 // If we've got here, we've passed.64 successfullyParsed = true;65 isSuccessfullyParsed();66 if (window.testRunner)67 testRunner.notifyDone();68 }69 }70 }71 68 72 69 // Always construct a page larger than the vertical height of the window. 73 70 function buildPage() 74 71 { 75 var table = document.getElementById('table_to_fill'); 72 // build vertical table 73 var table = document.getElementById('vertical_table_to_fill'); 76 74 var targetHeight = document.body.offsetHeight; 77 75 var cellPairHeight = table.offsetHeight; … … 87 85 } 88 86 87 // build horizontal table 88 var horizontalTable = document.getElementById('horizontal_table_to_fill'); 89 var tableRow = document.getElementById('firstrow'); 90 var targetWidth = document.body.offsetWidth; 91 var cellPairWidth = horizontalTable.offsetWidth; 92 numberOfReps = targetWidth / cellPairWidth * 2; 93 for (i = 0; i < numberOfReps; i++) { 94 var p = document.createElement('td'); 95 p.innerHTML = '<div id="redbox"></div>'; 96 tableRow.appendChild(p); 97 var p = document.createElement('td'); 98 p.innerHTML = '<div id="greenbox"></div>'; 99 tableRow.appendChild(p); 100 } 101 89 102 window.addEventListener("scroll", recordScroll); 90 103 window.addEventListener("mousewheel", recordWheel); … … 94 107 { 95 108 debug("first gesture"); 96 eventSender.gestureScrollBegin(10, 72); 97 eventSender.gestureScrollUpdate(0, -30); 98 eventSender.gestureScrollUpdate(0, -40); 109 eventSender.gestureScrollBegin(95, 12); 110 eventSender.gestureScrollUpdate(-55, -110); 99 111 eventSender.gestureScrollEnd(0, 0); 100 112 … … 106 118 { 107 119 debug("second gesture"); 108 eventSender.gestureScrollBegin(12, 40); 109 eventSender.gestureScrollUpdate(0, -30); 110 eventSender.gestureScrollUpdate(0, -30); 120 eventSender.gestureScrollBegin(12, 97); 121 eventSender.gestureScrollUpdate(-42, -95); 111 122 eventSender.gestureScrollEnd(0, 0); 112 123 113 124 // Wait for layout. 114 125 checkScrollOffset(); 126 127 // In this test we do not expect any scroll events to 128 // be received by the event listener, so we signal 129 // the end of the test by calling this function instead 130 // of relying on recordScroll() to do it. 131 finishTest(); 115 132 } 116 133 … … 122 139 buildPage(); 123 140 if (window.eventSender) { 124 description('This tests scroll gesture event scrolling on a whole page.'); 141 description('This tests that a page cannot be scrolled with touch if its body has style overflow:hidden.'); 142 125 143 if (checkTestDependencies()) 126 144 firstGestureScroll(); … … 128 146 exitIfNecessary(); 129 147 } else { 130 debug("This test requires DumpRenderTree. Gesture-scroll the page to validate the implementation."); 148 debug("This test requires DumpRenderTree. Touch scroll the red rect to log."); 149 } 150 } 151 152 function finishTest() 153 { 154 if (window.eventSender) { 155 if (gesturesOccurred == expectedGesturesTotal) { 156 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred); 157 successfullyParsed = true; 158 isSuccessfullyParsed(); 159 if (window.testRunner) 160 testRunner.notifyDone(); 161 } 131 162 } 132 163 } 133 164 </script> 134 135 136 137 165 </body> 138 166 </html> -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-div-not-propagated.html
r142057 r144519 93 93 var expectedScrollEventsOccurred = '1'; 94 94 95 96 function recordScroll(event) {97 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);98 scrollEventsOccurred++;99 100 if (window.eventSender) {101 // Because scroll events arrive asynchronously, only one will arrive.102 if (gesturesOccurred == expectedGesturesTotal) {103 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);104 // If we've got here, we've passed.105 successfullyParsed = true;106 isSuccessfullyParsed();107 if (window.testRunner)108 testRunner.notifyDone();109 }110 }111 }112 113 114 95 function firstGestureScroll() 115 96 { … … 127 108 debug("second gesture"); 128 109 eventSender.gestureScrollBegin(12, 40); 129 eventSender.gestureScrollUpdateWithoutPropagation(0, -60); 110 eventSender.gestureScrollUpdateWithoutPropagation(0, -50); 111 eventSender.gestureScrollUpdateWithoutPropagation(0, -10); 130 112 eventSender.gestureScrollEnd(0, 0); 131 113 -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-div-propagated.html
r140177 r144519 93 93 var expectedScrollEventsOccurred = '1'; 94 94 95 96 function recordScroll(event) {97 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);98 scrollEventsOccurred++;99 100 if (window.eventSender) {101 // Because scroll events arrive asynchronously, only one will arrive.102 if (gesturesOccurred == expectedGesturesTotal) {103 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);104 // If we've got here, we've passed.105 successfullyParsed = true;106 isSuccessfullyParsed();107 if (window.testRunner)108 testRunner.notifyDone();109 }110 }111 }112 113 114 95 function firstGestureScroll() 115 96 { … … 127 108 debug("second gesture"); 128 109 eventSender.gestureScrollBegin(12, 40); 129 eventSender.gestureScrollUpdate(0, -60); 110 eventSender.gestureScrollUpdate(0, -50); 111 eventSender.gestureScrollUpdate(0, -10); 130 112 eventSender.gestureScrollEnd(0, 0); 131 113 -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated.html
r140177 r144519 117 117 var expectedScrollEventsOccurred = '1'; 118 118 119 120 function recordScroll(event) {121 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);122 scrollEventsOccurred++;123 124 if (window.eventSender) {125 // Because scroll events arrive asynchronously, only one will arrive.126 if (gesturesOccurred == expectedGesturesTotal) {127 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);128 // If we've got here, we've passed.129 successfullyParsed = true;130 isSuccessfullyParsed();131 if (window.testRunner)132 testRunner.notifyDone();133 }134 }135 }136 137 138 119 function firstGestureScroll() 139 120 { 140 121 debug("first gesture"); 141 122 eventSender.gestureScrollBegin(10, 72); 142 eventSender.gestureScrollUpdate(0, -230); 123 eventSender.gestureScrollUpdate(0, -200); 124 eventSender.gestureScrollUpdate(0, -30); 143 125 eventSender.gestureScrollEnd(0, 0); 144 126 … … 151 133 debug("second gesture"); 152 134 eventSender.gestureScrollBegin(12, 40); 153 eventSender.gestureScrollUpdate(0, -45); 135 eventSender.gestureScrollUpdate(0, -20); 136 eventSender.gestureScrollUpdate(0, -25); 154 137 eventSender.gestureScrollEnd(0, 0); 155 138 -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-iframe-not-propagated.html
r142057 r144519 72 72 var expectedScrollEventsOccurred = '1'; 73 73 74 75 function recordScroll(event) {76 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);77 scrollEventsOccurred++;78 79 if (window.eventSender) {80 // Because scroll events arrive asynchronously, only one will arrive.81 if (gesturesOccurred == expectedGesturesTotal) {82 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);83 // If we've got here, we've passed.84 successfullyParsed = true;85 isSuccessfullyParsed();86 if (window.testRunner)87 testRunner.notifyDone();88 }89 }90 }91 92 93 74 function firstGestureScroll() 94 75 { … … 106 87 debug("second gesture"); 107 88 eventSender.gestureScrollBegin(12, 40); 108 eventSender.gestureScrollUpdateWithoutPropagation(0, -100); 89 eventSender.gestureScrollUpdateWithoutPropagation(0, -10); 90 eventSender.gestureScrollUpdateWithoutPropagation(0, -50); 109 91 eventSender.gestureScrollEnd(0, 0); 110 92 -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated.html
r140177 r144519 72 72 var expectedScrollEventsOccurred = '1'; 73 73 74 75 function recordScroll(event) {76 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);77 scrollEventsOccurred++;78 79 if (window.eventSender) {80 // Because scroll events arrive asynchronously, only one will arrive.81 if (gesturesOccurred == expectedGesturesTotal) {82 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);83 // If we've got here, we've passed.84 successfullyParsed = true;85 isSuccessfullyParsed();86 if (window.testRunner)87 testRunner.notifyDone();88 }89 }90 }91 92 93 74 function firstGestureScroll() 94 75 { … … 106 87 debug("second gesture"); 107 88 eventSender.gestureScrollBegin(12, 40); 108 eventSender.gestureScrollUpdate(0, -100); 89 eventSender.gestureScrollUpdate(0, -10); 90 eventSender.gestureScrollUpdate(0, -50); 109 91 eventSender.gestureScrollEnd(0, 0); 110 92 -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page-not-propagated.html
r142057 r144519 87 87 var expectedScrollEventsOccurred = '1'; 88 88 89 function recordScroll(event) {90 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);91 scrollEventsOccurred++;92 93 if (window.eventSender) {94 // Because scroll events arrive asynchronously, only one will arrive.95 if (gesturesOccurred == expectedGesturesTotal) {96 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);97 // If we've got here, we've passed.98 successfullyParsed = true;99 isSuccessfullyParsed();100 if (window.testRunner)101 testRunner.notifyDone();102 }103 }104 }105 106 89 // Always construct a page larger than the vertical height of the window. 107 90 function buildPage() … … 137 120 debug("second gesture"); 138 121 eventSender.gestureScrollBegin(12, 40); 139 eventSender.gestureScrollUpdateWithoutPropagation(0, -250); 122 eventSender.gestureScrollUpdateWithoutPropagation(0, -200); 123 eventSender.gestureScrollUpdateWithoutPropagation(0, -160); 140 124 eventSender.gestureScrollEnd(0, 0); 141 125 -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page-propagated.html
r140177 r144519 87 87 var expectedScrollEventsOccurred = '1'; 88 88 89 function recordScroll(event) {90 debug('scroll event ' + scrollEventsOccurred + '+> ' + event.target);91 scrollEventsOccurred++;92 93 if (window.eventSender) {94 // Because scroll events arrive asynchronously, only one will arrive.95 if (gesturesOccurred == expectedGesturesTotal) {96 shouldBe('scrollEventsOccurred', expectedScrollEventsOccurred);97 // If we've got here, we've passed.98 successfullyParsed = true;99 isSuccessfullyParsed();100 if (window.testRunner)101 testRunner.notifyDone();102 }103 }104 }105 106 89 // Always construct a page larger than the vertical height of the window. 107 90 function buildPage() … … 137 120 debug("second gesture"); 138 121 eventSender.gestureScrollBegin(12, 40); 139 eventSender.gestureScrollUpdate(0, -250); 122 eventSender.gestureScrollUpdate(0, -200); 123 eventSender.gestureScrollUpdate(0, -160); 140 124 eventSender.gestureScrollEnd(0, 0); 141 125 -
trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html
r140177 r144519 1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">1 <!DOCTYPE html> 2 2 <html> 3 3 <head> … … 106 106 { 107 107 debug("second gesture"); 108 eventSender.gestureScrollBegin( 12, 40);108 eventSender.gestureScrollBegin(800, 40); 109 109 eventSender.gestureScrollUpdate(0, -30); 110 110 eventSender.gestureScrollUpdate(0, -30); -
trunk/Source/WebCore/ChangeLog
r144517 r144519 1 2013-03-01 Terry Anderson <tdanderson@chromium.org> 2 3 EventHandler::handleGestureScrollUpdate() should invoke the user-generated scroll routines 4 so its behavior matches other user-initiated scrolls 5 https://bugs.webkit.org/show_bug.cgi?id=109769 6 7 Reviewed by James Robinson. 8 9 To ensure that the scrolling behavior of GestureScrollUpdate events are consistent with 10 the scrolling behavior of mousewheel events, use the existing user-generated scroll logic 11 instead of calling into RenderLayer::scrollByRecursively(). This patch fixes the bug 12 reported in https://bugs.webkit.org/show_bug.cgi?id=109316, where the example page can 13 be scrolled using touch but cannot be scrolled using mousewheels. 14 15 Note that this patch does not use any of the mousewheel event-handling code. 16 17 Tests: fast/events/touch/gesture/touch-gesture-noscroll-body-propagated.html 18 fast/events/touch/gesture/touch-gesture-noscroll-body-xhidden.html 19 fast/events/touch/gesture/touch-gesture-noscroll-body-yhidden.html 20 fast/events/touch/gesture/touch-gesture-noscroll-body.html 21 22 * page/EventHandler.cpp: 23 (WebCore::EventHandler::clear): 24 (WebCore::EventHandler::handleGestureEvent): 25 (WebCore::EventHandler::handleGestureScrollBegin): 26 (WebCore::EventHandler::handleGestureScrollUpdate): 27 (WebCore::EventHandler::sendScrollEventToView): 28 By calling this function at the start of handleGestureScrollUpdate() in the case 29 where |m_scrollGestureHandlingNode| is null, we ensure that the scroll updates 30 can still scroll the page itself, if possible. 31 (WebCore): 32 (WebCore::EventHandler::clearGestureScrollNodes): 33 * page/EventHandler.h: 34 (EventHandler): 35 * platform/PlatformWheelEvent.h: 36 (WebCore::PlatformWheelEvent::setHasPreciseScrollingDeltas): 37 1 38 2013-03-01 Alec Flett <alecflett@chromium.org> 2 39 -
trunk/Source/WebCore/page/EventHandler.cpp
r143727 r144519 404 404 m_scrollGestureHandlingNode = 0; 405 405 m_lastHitTestResultOverWidget = false; 406 m_previousGestureScrolledNode = 0; 406 407 m_scrollbarHandlingScrollGesture = 0; 407 408 #endif … … 2477 2478 case PlatformEvent::GestureScrollUpdateWithoutPropagation: 2478 2479 return handleGestureScrollUpdate(gestureEvent); 2480 case PlatformEvent::GestureScrollEnd: 2481 clearGestureScrollNodes(); 2482 return true; 2479 2483 case PlatformEvent::GestureTap: 2480 2484 return handleGestureTap(gestureEvent); … … 2487 2491 case PlatformEvent::GestureTwoFingerTap: 2488 2492 return handleGestureTwoFingerTap(gestureEvent); 2489 case PlatformEvent::GestureScrollEnd:2490 2493 case PlatformEvent::GestureDoubleTap: 2491 2494 case PlatformEvent::GesturePinchBegin: … … 2615 2618 } 2616 2619 2617 static const Node* closestScrollableNodeCandidate(const Node* node)2618 {2619 for (EventPathWalker walker(node); walker.node(); walker.moveToParent()) {2620 Node* scrollableNode = walker.node();2621 if (scrollableNode->isDocumentNode())2622 return scrollableNode;2623 RenderObject* renderer = scrollableNode->renderer();2624 if (renderer && renderer->isBox() && toRenderBox(renderer)->canBeScrolledAndHasScrollableArea())2625 return scrollableNode;2626 }2627 return node;2628 }2629 2630 2620 bool EventHandler::handleGestureScrollBegin(const PlatformGestureEvent& gestureEvent) 2631 2621 { … … 2646 2636 m_lastHitTestResultOverWidget = result.isOverWidget(); 2647 2637 m_scrollGestureHandlingNode = result.innerNode(); 2638 m_previousGestureScrolledNode = 0; 2648 2639 2649 2640 Node* node = m_scrollGestureHandlingNode.get(); … … 2656 2647 bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gestureEvent) 2657 2648 { 2658 // Ignore this event if we don't already have a targeted node with a valid renderer. 2659 const Node* node = m_scrollGestureHandlingNode.get(); 2660 if (!node) 2661 return false; 2662 2663 RenderObject* latchedRenderer = node->renderer(); 2664 if (!latchedRenderer) 2665 return false; 2666 2667 IntSize delta(-gestureEvent.deltaX(), -gestureEvent.deltaY()); 2649 FloatSize delta(gestureEvent.deltaX(), gestureEvent.deltaY()); 2668 2650 if (delta.isZero()) 2669 2651 return false; 2670 2671 RefPtr<FrameView> protector(m_frame->view());2672 2673 // Try to send the event to the correct view.2674 if (passGestureEventToWidgetIfPossible(gestureEvent, latchedRenderer))2675 return true;2676 2677 // Otherwise if this is the correct view for the event, find the closest scrollable2678 // ancestor of the targeted node and scroll the layer that contains this node's renderer.2679 node = closestScrollableNodeCandidate(node);2680 if (!node)2681 return false;2682 2683 latchedRenderer = node->renderer();2684 if (!latchedRenderer)2685 return false;2686 2687 RenderLayer::ScrollPropagation shouldPropagate = RenderLayer::ShouldPropagateScroll;2688 if (gestureEvent.type() == PlatformEvent::GestureScrollUpdateWithoutPropagation)2689 shouldPropagate = RenderLayer::DontPropagateScroll;2690 2652 2691 2653 const float scaleFactor = m_frame->pageZoomFactor() * m_frame->frameScaleFactor(); 2692 2654 delta.scale(1 / scaleFactor, 1 / scaleFactor); 2693 2655 2694 bool result = latchedRenderer->enclosingLayer()->scrollBy(delta, RenderLayer::ScrollOffsetClamped, shouldPropagate); 2695 2696 if (result) 2656 Node* node = m_scrollGestureHandlingNode.get(); 2657 if (!node) 2658 return sendScrollEventToView(gestureEvent, delta); 2659 2660 // Ignore this event if the targeted node does not have a valid renderer. 2661 RenderObject* renderer = node->renderer(); 2662 if (!renderer) 2663 return false; 2664 2665 RefPtr<FrameView> protector(m_frame->view()); 2666 2667 // Try to send the event to the correct view. 2668 if (passGestureEventToWidgetIfPossible(gestureEvent, renderer)) 2669 return true; 2670 2671 Node* stopNode = 0; 2672 bool scrollShouldNotPropagate = gestureEvent.type() == PlatformEvent::GestureScrollUpdateWithoutPropagation; 2673 if (scrollShouldNotPropagate) 2674 stopNode = m_previousGestureScrolledNode.get(); 2675 2676 // First try to scroll the closest scrollable RenderBox ancestor of |node|. 2677 ScrollGranularity granularity = ScrollByPixel; 2678 bool horizontalScroll = scrollNode(delta.width(), granularity, ScrollLeft, ScrollRight, node, &stopNode); 2679 bool verticalScroll = scrollNode(delta.height(), granularity, ScrollUp, ScrollDown, node, &stopNode); 2680 2681 if (scrollShouldNotPropagate) 2682 m_previousGestureScrolledNode = stopNode; 2683 2684 if (horizontalScroll || verticalScroll) { 2697 2685 setFrameWasScrolledByUser(); 2698 2699 return result; 2686 return true; 2687 } 2688 2689 // Otherwise try to scroll the view. 2690 return sendScrollEventToView(gestureEvent, delta); 2691 } 2692 2693 bool EventHandler::sendScrollEventToView(const PlatformGestureEvent& gestureEvent, const FloatSize& scaledDelta) 2694 { 2695 FrameView* view = m_frame->view(); 2696 if (!view) 2697 return false; 2698 2699 const float tickDivisor = static_cast<float>(WheelEvent::TickMultiplier); 2700 IntPoint point(gestureEvent.position().x(), gestureEvent.position().y()); 2701 IntPoint globalPoint(gestureEvent.globalPosition().x(), gestureEvent.globalPosition().y()); 2702 PlatformWheelEvent syntheticWheelEvent(point, globalPoint, 2703 scaledDelta.width(), scaledDelta.height(), 2704 scaledDelta.width() / tickDivisor, scaledDelta.height() / tickDivisor, 2705 ScrollByPixelWheelEvent, 2706 gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey()); 2707 #if PLATFORM(MAC) || PLATFORM(CHROMIUM) 2708 syntheticWheelEvent.setHasPreciseScrollingDeltas(true); 2709 #endif 2710 2711 bool scrolledFrame = view->wheelEvent(syntheticWheelEvent); 2712 if (scrolledFrame) 2713 setFrameWasScrolledByUser(); 2714 2715 return scrolledFrame; 2716 } 2717 2718 void EventHandler::clearGestureScrollNodes() 2719 { 2720 m_scrollGestureHandlingNode = 0; 2721 m_previousGestureScrolledNode = 0; 2700 2722 } 2701 2723 -
trunk/Source/WebCore/page/EventHandler.h
r142977 r144519 182 182 bool handleGestureScrollUpdate(const PlatformGestureEvent&); 183 183 bool handleGestureScrollBegin(const PlatformGestureEvent&); 184 void clearGestureScrollNodes(); 184 185 bool isScrollbarHandlingGestures() const; 185 186 #endif … … 379 380 bool passGestureEventToWidget(const PlatformGestureEvent&, Widget*); 380 381 bool passGestureEventToWidgetIfPossible(const PlatformGestureEvent&, RenderObject*); 382 bool sendScrollEventToView(const PlatformGestureEvent&, const FloatSize&); 381 383 #endif 382 384 … … 470 472 RefPtr<Node> m_scrollGestureHandlingNode; 471 473 bool m_lastHitTestResultOverWidget; 474 RefPtr<Node> m_previousGestureScrolledNode; 472 475 RefPtr<Scrollbar> m_scrollbarHandlingScrollGesture; 473 476 #endif -
trunk/Source/WebCore/platform/PlatformWheelEvent.h
r135638 r144519 158 158 #if PLATFORM(MAC) || PLATFORM(CHROMIUM) 159 159 bool hasPreciseScrollingDeltas() const { return m_hasPreciseScrollingDeltas; } 160 void setHasPreciseScrollingDeltas(bool b) { m_hasPreciseScrollingDeltas = b; } 160 161 #endif 161 162 #if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN)) -
trunk/Source/WebKit/chromium/ChangeLog
r144518 r144519 1 2013-03-01 Terry Anderson <tdanderson@chromium.org> 2 3 EventHandler::handleGestureScrollUpdate() should invoke the user-generated scroll routines 4 so its behavior matches other user-initiated scrolls 5 https://bugs.webkit.org/show_bug.cgi?id=109769 6 7 Reviewed by James Robinson. 8 9 Clear the nodes corresponding to a fling scroll event when the event ends. 10 11 * src/WebViewImpl.cpp: 12 (WebKit::WebViewImpl::updateAnimations): 13 1 14 2013-03-01 David Dorwin <ddorwin@chromium.org> 2 15 -
trunk/Source/WebKit/chromium/src/WebViewImpl.cpp
r144332 r144519 1847 1847 if (m_layerTreeView) 1848 1848 m_layerTreeView->didStopFlinging(); 1849 1850 mainFrameImpl()->frame()->eventHandler()->clearGestureScrollNodes(); 1849 1851 } 1850 1852 }
Note: See TracChangeset
for help on using the changeset viewer.