Changeset 140177 in webkit


Ignore:
Timestamp:
Jan 18, 2013 10:28:42 AM (11 years ago)
Author:
tdanderson@chromium.org
Message:

Scroll gestures should not create wheel events
https://bugs.webkit.org/show_bug.cgi?id=103952

Reviewed by James Robinson.

Source/WebCore:

Tests: fast/events/touch/gesture/touch-gesture-scroll-div-propagated.html

fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated.html
fast/events/touch/gesture/touch-gesture-scroll-iframe-editable.html
fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated.html
fast/events/touch/gesture/touch-gesture-scroll-page-propagated.html

In EventHandler::handleGestureEvent(), scroll gestures should not be handled by synthesizing
and dispatching wheel events; we should instead scroll the relevant layer directly.

Note that this patch should be landed together with the patch for
https://bugs.webkit.org/show_bug.cgi?id=106589.

  • page/EventHandler.cpp:

(WebCore::EventHandler::EventHandler):
(WebCore::EventHandler::clear):
(WebCore::EventHandler::handleGestureEvent):
(WebCore::EventHandler::passGestureEventToWidget):
(WebCore::EventHandler::passGestureEventToWidgetIfPossible):
(WebCore):
(WebCore::closestScrollableNodeInDocumentIfPossibleOrSelfIfNotScrollable):
(WebCore::EventHandler::handleGestureScrollBegin):
(WebCore::EventHandler::handleGestureScrollUpdate):
(WebCore::EventHandler::isScrollbarHandlingGestures):

  • page/EventHandler.h:

(EventHandler):

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::scrollByRecursively):

  • rendering/RenderLayer.h:

LayoutTests:

Added five new layout tests to check that scroll gestures will correctly scroll
nested divs and iframes. Also modified existing layout tests to no longer
expect mousewheel events.

  • fast/events/touch/gesture/resources/scroll-inside-editable-iframe.html: Added.
  • fast/events/touch/gesture/touch-gesture-scroll-div-propagated-expected.txt: Added.
  • fast/events/touch/gesture/touch-gesture-scroll-div-propagated.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html.
  • fast/events/touch/gesture/touch-gesture-scroll-div-scaled.html:
  • fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated-expected.txt: Added.
  • fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html.
  • fast/events/touch/gesture/touch-gesture-scroll-div.html:
  • fast/events/touch/gesture/touch-gesture-scroll-iframe-editable-expected.txt: Copied from LayoutTests/platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-iframe-expected.txt.
  • fast/events/touch/gesture/touch-gesture-scroll-iframe-editable.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-iframe.html.
  • fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated-expected.txt: Added.
  • fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html.
  • fast/events/touch/gesture/touch-gesture-scroll-iframe.html:
  • fast/events/touch/gesture/touch-gesture-scroll-page-propagated-expected.txt: Added.
  • fast/events/touch/gesture/touch-gesture-scroll-page-propagated.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html.
  • fast/events/touch/gesture/touch-gesture-scroll-page.html:
  • fast/events/touch/gesture/touch-gesture-scroll-shy-target.html:
  • platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-expected.txt:
  • platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-propagated-expected.txt: Added.
  • platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-scaled-expected.txt:
  • platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated-expected.txt: Added.
  • platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-iframe-expected.txt:
  • platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated-expected.txt: Added.
  • platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-page-expected.txt:
  • platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-page-propagated-expected.txt: Added.
  • platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-shy-target-expected.txt:
  • platform/chromium/plugins/gesture-events-expected.txt:
  • platform/chromium/plugins/gesture-events-scrolled-expected.txt:
Location:
trunk
Files:
9 added
18 edited
6 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r140174 r140177  
     12013-01-18  Terry Anderson  <tdanderson@chromium.org>
     2
     3        Scroll gestures should not create wheel events
     4        https://bugs.webkit.org/show_bug.cgi?id=103952
     5
     6        Reviewed by James Robinson.
     7
     8        Added five new layout tests to check that scroll gestures will correctly scroll
     9        nested divs and iframes. Also modified existing layout tests to no longer
     10        expect mousewheel events.
     11
     12        * fast/events/touch/gesture/resources/scroll-inside-editable-iframe.html: Added.
     13        * fast/events/touch/gesture/touch-gesture-scroll-div-propagated-expected.txt: Added.
     14        * fast/events/touch/gesture/touch-gesture-scroll-div-propagated.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html.
     15        * fast/events/touch/gesture/touch-gesture-scroll-div-scaled.html:
     16        * fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated-expected.txt: Added.
     17        * fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html.
     18        * fast/events/touch/gesture/touch-gesture-scroll-div.html:
     19        * fast/events/touch/gesture/touch-gesture-scroll-iframe-editable-expected.txt: Copied from LayoutTests/platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-iframe-expected.txt.
     20        * fast/events/touch/gesture/touch-gesture-scroll-iframe-editable.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-iframe.html.
     21        * fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated-expected.txt: Added.
     22        * fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html.
     23        * fast/events/touch/gesture/touch-gesture-scroll-iframe.html:
     24        * fast/events/touch/gesture/touch-gesture-scroll-page-propagated-expected.txt: Added.
     25        * fast/events/touch/gesture/touch-gesture-scroll-page-propagated.html: Copied from LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html.
     26        * fast/events/touch/gesture/touch-gesture-scroll-page.html:
     27        * fast/events/touch/gesture/touch-gesture-scroll-shy-target.html:
     28        * platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-expected.txt:
     29        * platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-propagated-expected.txt: Added.
     30        * platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-scaled-expected.txt:
     31        * platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated-expected.txt: Added.
     32        * platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-iframe-expected.txt:
     33        * platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated-expected.txt: Added.
     34        * platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-page-expected.txt:
     35        * platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-page-propagated-expected.txt: Added.
     36        * platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-shy-target-expected.txt:
     37        * platform/chromium/plugins/gesture-events-expected.txt:
     38        * platform/chromium/plugins/gesture-events-scrolled-expected.txt:
     39
    1402013-01-18  Nate Chapin  <japhet@chromium.org>
    241
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-div-propagated.html

    r140174 r140177  
    1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
     1<!DOCTYPE html>
    22<html>
    33<head>
     
    66<script src="resources/gesture-helpers.js"></script>
    77<style type="text/css">
     8
    89::-webkit-scrollbar {
    910    width: 0px;
     
    1819  margin: 0px;
    1920}
     21
    2022#redbox {
    2123  width: 100px;
     
    2628}
    2729
     30#bluebox {
     31  width: 100px;
     32  height: 100px;
     33  background: blue;
     34  padding: 0px;
     35  margin: 0px;
     36}
     37
     38#innerdiv {
     39    width: 200px;
     40    height: 200px;
     41    overflow-y: scroll;
     42    overflow-x: scroll;
     43}
     44
     45#outerdiv {
     46    width: 250px;
     47    height: 250px;
     48    overflow-y: scroll;
     49    overflow-x: scroll;
     50}
     51
    2852td {
    2953  padding: 0px;
    3054}
     55
    3156</style>
    3257</head>
    3358<body style="margin:0" onload="runTest();">
    3459
    35 <table id="table_to_fill">
    36     <tr><td><div id="greenbox"></div></td></tr>
    37     <tr><td><div id="redbox"></div></td></tr>
    38 </table>
     60<div id="outerdiv">
     61  <table border="0" cellspacing="0px" >
     62    <tr><td>
     63      <div id="innerdiv">
     64        <table border="0" cellspacing="0px" >
     65          <tr><td><div id="greenbox"></div></td></tr>
     66          <tr><td><div id="redbox"></div></td></tr>
     67          <tr><td><div id="greenbox"></div></td></tr>
     68          <tr><td><div id="redbox"></div></td></tr>
     69        </table>
     70      </div>
     71    </td></tr>
     72    <tr><td>
     73      <div id="bluebox"></div>
     74    </td></tr>
     75  </table>
     76</div>
    3977
    4078<p id="description"></p>
     
    4280<script type="text/javascript">
    4381
     82var movedbox;
     83var touchtarget;
    4484var expectedGesturesTotal = 2;
    4585var gesturesOccurred = 0;
    4686var scrollAmountX = ['0', '0'];
    47 var scrollAmountY = ['70', '130'];
     87var scrollAmountY = ['0', '10'];
    4888var wheelEventsOccurred = 0;
    49 var expectedWheelEventsOccurred = ['2', '2'];
     89var expectedWheelEventsOccurred = ['0', '0'];
    5090var scrollEventsOccurred = 0;
    51 var scrolledElement = 'document.body'
     91var scrolledElement = 'movedbox'
    5292var scrollEventsOccurred = 0;
    5393var expectedScrollEventsOccurred = '1';
     94
    5495
    5596function recordScroll(event) {
     
    70111}
    71112
    72 // Always construct a page larger than the vertical height of the window.
    73 function buildPage()
    74 {
    75     var table = document.getElementById('table_to_fill');
    76     var targetHeight = document.body.offsetHeight;
    77     var cellPairHeight = table.offsetHeight;
    78     var numberOfReps = targetHeight / cellPairHeight * 2;
    79     var i;
    80     for (i = 0; i < numberOfReps; i++) {
    81         var p = document.createElement('tr');
    82         p.innerHTML = '<td><div id="greenbox"></div></td>';
    83         table.appendChild(p);
    84         var p = document.createElement('tr');
    85         p.innerHTML = '<td><div id="redbox"></div></td>';
    86         table.appendChild(p);
    87     }
    88 
    89     window.addEventListener("scroll", recordScroll);
    90     window.addEventListener("mousewheel", recordWheel);
    91 }
    92113
    93114function firstGestureScroll()
     
    95116    debug("first gesture");
    96117    eventSender.gestureScrollBegin(10, 72);
    97     eventSender.gestureScrollUpdate(0, -30);
    98     eventSender.gestureScrollUpdate(0, -40);
     118    eventSender.gestureScrollUpdate(0, -150);
    99119    eventSender.gestureScrollEnd(0, 0);
    100120
     
    107127    debug("second gesture");
    108128    eventSender.gestureScrollBegin(12, 40);
    109     eventSender.gestureScrollUpdate(0, -30);
    110     eventSender.gestureScrollUpdate(0, -30);
     129    eventSender.gestureScrollUpdate(0, -60);
    111130    eventSender.gestureScrollEnd(0, 0);
    112131
     
    120139function runTest()
    121140{
    122     buildPage();
     141    movedbox = document.getElementById("outerdiv");
     142    touchtarget = document.getElementById("innerdiv");
     143    touchtarget.addEventListener("scroll", recordScroll);
     144    touchtarget.addEventListener("mousewheel", recordWheel);
     145
    123146    if (window.eventSender) {
    124         description('This tests scroll gesture event scrolling on a whole page.');
     147        description('This tests that a gesture scroll is propagated from an ' +
     148                'inner div to an outer div when the inner div has no ' +
     149                'remaining scroll offset.');
    125150        if (checkTestDependencies())
    126151            firstGestureScroll();
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-div-scaled.html

    r139022 r140177  
    7272var gesturesOccurred = 0;
    7373var scrollAmountX = ['45', '45'];
    74 var scrollAmountY = ['0', '48'];
     74var scrollAmountY = ['0', '47'];
    7575var wheelEventsOccurred = 0;
    76 var expectedWheelEventsOccurred = ['1', '1'];
     76var expectedWheelEventsOccurred = ['0', '0'];
    7777var scrollEventsOccurred = 0;
    7878var expectedScrollEventsOccurred = '1';
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated.html

    r140174 r140177  
    1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
     1<!DOCTYPE html>
    22<html>
    33<head>
     
    66<script src="resources/gesture-helpers.js"></script>
    77<style type="text/css">
     8
    89::-webkit-scrollbar {
    910    width: 0px;
     
    1819  margin: 0px;
    1920}
     21
    2022#redbox {
    2123  width: 100px;
     
    2628}
    2729
     30#bluebox {
     31  width: 100px;
     32  height: 100px;
     33  background: blue;
     34  padding: 0px;
     35  margin: 0px;
     36}
     37
     38#yellowbox {
     39  width: 100px;
     40  height: 100px;
     41  background: yellow;
     42  padding: 0px;
     43  margin: 0px;
     44}
     45
     46#innerdiv {
     47    width: 200px;
     48    height: 200px;
     49    overflow-y: scroll;
     50    overflow-x: scroll;
     51}
     52
     53#outerdiv {
     54    width: 250px;
     55    height: 250px;
     56    overflow-y: scroll;
     57    overflow-x: scroll;
     58}
     59
     60#outermostdiv {
     61    width: 300px;
     62    height: 300px;
     63    overflow-y: scroll;
     64    overflow-x: scroll;
     65}
     66
    2867td {
    2968  padding: 0px;
    3069}
     70
    3171</style>
    3272</head>
    3373<body style="margin:0" onload="runTest();">
    3474
    35 <table id="table_to_fill">
    36     <tr><td><div id="greenbox"></div></td></tr>
    37     <tr><td><div id="redbox"></div></td></tr>
    38 </table>
     75<div id="outermostdiv">
     76  <table border="0" cellspacing="0px" >
     77    <tr><td>
     78      <div id="outerdiv">
     79        <table border="0" cellspacing="0px" >
     80          <tr><td>
     81            <div id="innerdiv">
     82              <table border="0" cellspacing="0px" >
     83                <tr><td><div id="greenbox"></div></td></tr>
     84                <tr><td><div id="redbox"></div></td></tr>
     85                <tr><td><div id="greenbox"></div></td></tr>
     86                <tr><td><div id="redbox"></div></td></tr>
     87              </table>
     88            </div>
     89          </td></tr>
     90          <tr><td>
     91            <div id="bluebox"></div>
     92          </td></tr>
     93        </table>
     94      </div>
     95    </td></tr>
     96    <tr><td>
     97      <div id="yellowbox"></div>
     98    </td></tr>
     99  </table>
     100</div>
    39101
    40102<p id="description"></p>
     
    42104<script type="text/javascript">
    43105
     106var movedbox;
     107var touchtarget;
    44108var expectedGesturesTotal = 2;
    45109var gesturesOccurred = 0;
    46110var scrollAmountX = ['0', '0'];
    47 var scrollAmountY = ['70', '130'];
     111var scrollAmountY = ['0', '25'];
    48112var wheelEventsOccurred = 0;
    49 var expectedWheelEventsOccurred = ['2', '2'];
     113var expectedWheelEventsOccurred = ['0', '0'];
    50114var scrollEventsOccurred = 0;
    51 var scrolledElement = 'document.body'
     115var scrolledElement = 'movedbox'
    52116var scrollEventsOccurred = 0;
    53117var expectedScrollEventsOccurred = '1';
     118
    54119
    55120function recordScroll(event) {
     
    70135}
    71136
    72 // Always construct a page larger than the vertical height of the window.
    73 function buildPage()
    74 {
    75     var table = document.getElementById('table_to_fill');
    76     var targetHeight = document.body.offsetHeight;
    77     var cellPairHeight = table.offsetHeight;
    78     var numberOfReps = targetHeight / cellPairHeight * 2;
    79     var i;
    80     for (i = 0; i < numberOfReps; i++) {
    81         var p = document.createElement('tr');
    82         p.innerHTML = '<td><div id="greenbox"></div></td>';
    83         table.appendChild(p);
    84         var p = document.createElement('tr');
    85         p.innerHTML = '<td><div id="redbox"></div></td>';
    86         table.appendChild(p);
    87     }
    88 
    89     window.addEventListener("scroll", recordScroll);
    90     window.addEventListener("mousewheel", recordWheel);
    91 }
    92137
    93138function firstGestureScroll()
     
    95140    debug("first gesture");
    96141    eventSender.gestureScrollBegin(10, 72);
    97     eventSender.gestureScrollUpdate(0, -30);
    98     eventSender.gestureScrollUpdate(0, -40);
     142    eventSender.gestureScrollUpdate(0, -230);
    99143    eventSender.gestureScrollEnd(0, 0);
    100144
     
    107151    debug("second gesture");
    108152    eventSender.gestureScrollBegin(12, 40);
    109     eventSender.gestureScrollUpdate(0, -30);
    110     eventSender.gestureScrollUpdate(0, -30);
     153    eventSender.gestureScrollUpdate(0, -45);
    111154    eventSender.gestureScrollEnd(0, 0);
    112155
     
    120163function runTest()
    121164{
    122     buildPage();
     165    movedbox = document.getElementById("outermostdiv");
     166    touchtarget = document.getElementById("innerdiv");
     167    touchtarget.addEventListener("scroll", recordScroll);
     168    touchtarget.addEventListener("mousewheel", recordWheel);
     169
    123170    if (window.eventSender) {
    124         description('This tests scroll gesture event scrolling on a whole page.');
     171        description('This tests that a gesture scroll is propagated from an ' +
     172                'inner div to an outer div twice when the scrolled divs have no ' +
     173                'remaining scroll offset.');
    125174        if (checkTestDependencies())
    126175            firstGestureScroll();
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-div.html

    r120792 r140177  
    7474var scrollAmountY = ['0', '95'];
    7575var wheelEventsOccurred = 0;
    76 var expectedWheelEventsOccurred = ['1', '1'];
     76var expectedWheelEventsOccurred = ['0', '0'];
    7777var scrollEventsOccurred = 0;
    7878var expectedScrollEventsOccurred = '1';
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-iframe-editable-expected.txt

    r140174 r140177  
    11
    2 This tests gesture event scrolling in iframes. Red-green strip is scrolled on pass.
     2This tests gesture event scrolling of an iframe in an overflow div. Red-green strip is scrolled on pass.
    33
    44On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
     
    66
    77first gesture
    8 wheel event 0+> [object HTMLDivElement]
    98PASS touchtarget.contentDocument.body.scrollTop is 140
    109PASS touchtarget.contentDocument.body.scrollLeft is 0
    11 PASS wheelEventsOccurred is 1
     10PASS wheelEventsOccurred is 0
    1211second gesture
    13 wheel event 0+> [object HTMLDivElement]
    1412PASS touchtarget.contentDocument.body.scrollTop is 200
    1513PASS touchtarget.contentDocument.body.scrollLeft is 0
    16 PASS wheelEventsOccurred is 1
     14PASS wheelEventsOccurred is 0
    1715scroll event 0+> [object HTMLDocument]
    1816PASS scrollEventsOccurred is 1
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-iframe-editable.html

    r140174 r140177  
    1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
     1<!DOCTYPE html>
    22<html>
    33<head>
     
    77<style type="text/css">
    88#touchtarget {
    9   width: 200px;
    10   height: 200px;
    11   position: relative;
    129  background: white;
    1310}
    14 
     11   
    1512::-webkit-scrollbar {
    1613    width: 0px;
     
    1815}
    1916
     17#container {
     18    width: 200px;
     19    height: 200px;
     20    overflow-y: scroll;
     21    overflow-x: scroll;
     22    display: block;
     23}
     24
    2025</style>
    2126</head>
    2227<body>
    23 <iframe id="touchtarget" src="resources/scroll-inside-iframe.html"></iframe>
     28<div id="container">
     29<iframe id="touchtarget" src="resources/scroll-inside-editable-iframe.html"></iframe>
     30</div>
    2431    <p id="description"></p>
    2532<div id="console"></div>
     
    3239var scrollAmountY = ['140', '200'];
    3340var wheelEventsOccurred = 0;
    34 var expectedWheelEventsOccurred = ['1', '1'];
     41var expectedWheelEventsOccurred = ['0', '0'];
    3542var scrollEventsOccurred = 0;
    3643var expectedScrollEventsOccurred = '1';
     
    5865    checkScrollOffset();
    5966}
    60 
     67       
    6168if (window.testRunner)
    6269    testRunner.waitUntilDone();
    63 
     70   
    6471function runTest()
    6572{
     
    6976
    7077    if (window.eventSender) {
    71         description('This tests gesture event scrolling in iframes. ' +
     78        description('This tests gesture event scrolling of an iframe in an overflow div. ' +
    7279            'Red-green strip is scrolled on pass.');
    7380        if (checkTestDependencies())
     
    7683            exitIfNecessary();
    7784    } else {
    78         debug("This test requires DumpRenderTree .  Touch-scroll the red/green strip.");
     85        debug("This test requires DumpRenderTree.  Touch-scroll the red/green strip.");
    7986    }
    8087}
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated.html

    r140174 r140177  
    1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
     1<!DOCTYPE html>
    22<html>
    33<head>
     
    66<script src="resources/gesture-helpers.js"></script>
    77<style type="text/css">
     8
    89::-webkit-scrollbar {
    910    width: 0px;
     
    1112}
    1213
    13 #greenbox {
     14#bluebox {
    1415  width: 100px;
    1516  height: 100px;
    16   background: green;
     17  background: blue;
    1718  padding: 0px;
    1819  margin: 0px;
    1920}
    20 #redbox {
    21   width: 100px;
    22   height: 100px;
    23   background: red;
    24   padding: 0px;
    25   margin: 0px;
     21
     22#container {
     23    width: 150px;
     24    height: 150px;
     25    overflow-y: scroll;
     26    overflow-x: scroll;
     27}
     28
     29#outerdiv {
     30    width: 200px;
     31    height: 200px;
     32    overflow-y: scroll;
     33    overflow-x: scroll;
    2634}
    2735
     
    2937  padding: 0px;
    3038}
     39
    3140</style>
    3241</head>
    33 <body style="margin:0" onload="runTest();">
     42<body style="margin:0" >
    3443
    35 <table id="table_to_fill">
    36     <tr><td><div id="greenbox"></div></td></tr>
    37     <tr><td><div id="redbox"></div></td></tr>
    38 </table>
     44<div id="outerdiv">
     45  <table border="0" cellspacing="0px" >
     46    <tr><td>
     47      <div id="container">
     48        <iframe id="touchtargetiframe" src="resources/scroll-inside-editable-iframe.html"></iframe>
     49      </div>
     50    </td></tr>
     51    <tr><td>
     52      <div id="bluebox"></div>
     53    </td></tr>
     54  </table>
     55</div>
    3956
    4057<p id="description"></p>
     
    4259<script type="text/javascript">
    4360
     61var movedbox;
     62var touchtarget;
    4463var expectedGesturesTotal = 2;
    4564var gesturesOccurred = 0;
    4665var scrollAmountX = ['0', '0'];
    47 var scrollAmountY = ['70', '130'];
     66var scrollAmountY = ['0', '50'];
    4867var wheelEventsOccurred = 0;
    49 var expectedWheelEventsOccurred = ['2', '2'];
     68var expectedWheelEventsOccurred = ['0', '0'];
    5069var scrollEventsOccurred = 0;
    51 var scrolledElement = 'document.body'
     70var scrolledElement = 'movedbox'
    5271var scrollEventsOccurred = 0;
    5372var expectedScrollEventsOccurred = '1';
     73
    5474
    5575function recordScroll(event) {
     
    7090}
    7191
    72 // Always construct a page larger than the vertical height of the window.
    73 function buildPage()
    74 {
    75     var table = document.getElementById('table_to_fill');
    76     var targetHeight = document.body.offsetHeight;
    77     var cellPairHeight = table.offsetHeight;
    78     var numberOfReps = targetHeight / cellPairHeight * 2;
    79     var i;
    80     for (i = 0; i < numberOfReps; i++) {
    81         var p = document.createElement('tr');
    82         p.innerHTML = '<td><div id="greenbox"></div></td>';
    83         table.appendChild(p);
    84         var p = document.createElement('tr');
    85         p.innerHTML = '<td><div id="redbox"></div></td>';
    86         table.appendChild(p);
    87     }
    88 
    89     window.addEventListener("scroll", recordScroll);
    90     window.addEventListener("mousewheel", recordWheel);
    91 }
    9292
    9393function firstGestureScroll()
     
    9595    debug("first gesture");
    9696    eventSender.gestureScrollBegin(10, 72);
    97     eventSender.gestureScrollUpdate(0, -30);
    98     eventSender.gestureScrollUpdate(0, -40);
     97    eventSender.gestureScrollUpdate(0, -700);
    9998    eventSender.gestureScrollEnd(0, 0);
    10099
     
    107106    debug("second gesture");
    108107    eventSender.gestureScrollBegin(12, 40);
    109     eventSender.gestureScrollUpdate(0, -30);
    110     eventSender.gestureScrollUpdate(0, -30);
     108    eventSender.gestureScrollUpdate(0, -100);
    111109    eventSender.gestureScrollEnd(0, 0);
    112110
     
    120118function runTest()
    121119{
    122     buildPage();
     120    movedbox = document.getElementById("outerdiv");
     121    touchtarget = document.getElementById("touchtargetiframe");
     122    touchtarget.contentDocument.addEventListener("scroll", recordScroll);
     123    touchtarget.contentDocument.body.addEventListener("mousewheel", recordWheel);
     124
    123125    if (window.eventSender) {
    124         description('This tests scroll gesture event scrolling on a whole page.');
     126        description('This tests that a gesture scroll is propagated from an ' +
     127                'iframe to an outer div when the iframe has no remaining ' +
     128                'scroll offset.');
    125129        if (checkTestDependencies())
    126130            firstGestureScroll();
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-iframe.html

    r120792 r140177  
    3232var scrollAmountY = ['140', '200'];
    3333var wheelEventsOccurred = 0;
    34 var expectedWheelEventsOccurred = ['1', '1'];
     34var expectedWheelEventsOccurred = ['0', '0'];
    3535var scrollEventsOccurred = 0;
    3636var expectedScrollEventsOccurred = '1';
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page-propagated.html

    r140174 r140177  
    1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
     1<!DOCTYPE html>
    22<html>
    33<head>
     
    1818  margin: 0px;
    1919}
     20
    2021#redbox {
    2122  width: 100px;
     
    2425  padding: 0px;
    2526  margin: 0px;
     27}
     28
     29#bluebox {
     30  width: 100px;
     31  height: 100px;
     32  background: blue;
     33  padding: 0px;
     34  margin: 0px;
     35}
     36
     37#yellowbox {
     38  width: 100px;
     39  height: 100px;
     40  background: yellow;
     41  padding: 0px;
     42  margin: 0px;
     43}
     44
     45#touchtargetdiv {
     46    width: 200px;
     47    height: 200px;
     48    overflow-y: scroll;
     49    overflow-x: scroll;
    2650}
    2751
     
    3357<body style="margin:0" onload="runTest();">
    3458
    35 <table id="table_to_fill">
    36     <tr><td><div id="greenbox"></div></td></tr>
    37     <tr><td><div id="redbox"></div></td></tr>
     59<div id="touchtargetdiv">
     60  <table border="0" cellspacing="0px" >
     61    <tr><td><div id="yellowbox"></div></td></tr>
     62    <tr><td><div id="bluebox"></div></td></tr>
     63    <tr><td><div id="yellowbox"></div></td></tr>
     64    <tr><td><div id="bluebox"></div></td></tr>
     65  </table>
     66</div>
     67
     68<table id="table_to_fill" border="0" cellspacing="0px">
     69  <tr><td><div id="greenbox"></div></td></tr>
     70  <tr><td><div id="redbox"></div></td></tr>
    3871</table>
    3972
     
    4275<script type="text/javascript">
    4376
     77var touchtarget;
    4478var expectedGesturesTotal = 2;
    4579var gesturesOccurred = 0;
    4680var scrollAmountX = ['0', '0'];
    47 var scrollAmountY = ['70', '130'];
     81var scrollAmountY = ['0', '160'];
    4882var wheelEventsOccurred = 0;
    49 var expectedWheelEventsOccurred = ['2', '2'];
     83var expectedWheelEventsOccurred = ['0', '0'];
    5084var scrollEventsOccurred = 0;
    5185var scrolledElement = 'document.body'
     
    86120        table.appendChild(p);
    87121    }
    88 
    89     window.addEventListener("scroll", recordScroll);
    90     window.addEventListener("mousewheel", recordWheel);
    91122}
    92123
     
    95126    debug("first gesture");
    96127    eventSender.gestureScrollBegin(10, 72);
    97     eventSender.gestureScrollUpdate(0, -30);
    98     eventSender.gestureScrollUpdate(0, -40);
     128    eventSender.gestureScrollUpdate(0, -110);
    99129    eventSender.gestureScrollEnd(0, 0);
    100130
     
    107137    debug("second gesture");
    108138    eventSender.gestureScrollBegin(12, 40);
    109     eventSender.gestureScrollUpdate(0, -30);
    110     eventSender.gestureScrollUpdate(0, -30);
     139    eventSender.gestureScrollUpdate(0, -250);
    111140    eventSender.gestureScrollEnd(0, 0);
    112141
     
    121150{
    122151    buildPage();
     152    touchtarget = document.getElementById('touchtargetdiv');
     153    touchtarget.addEventListener("scroll", recordScroll);
     154    touchtarget.addEventListener("mousewheel", recordWheel);
     155
    123156    if (window.eventSender) {
    124         description('This tests scroll gesture event scrolling on a whole page.');
     157        description('This tests that a gesture scroll is propagated from a div ' +
     158                'to the page when the div has no remaining scroll offset.');
    125159        if (checkTestDependencies())
    126160            firstGestureScroll();
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-page.html

    r120792 r140177  
    4747var scrollAmountY = ['70', '130'];
    4848var wheelEventsOccurred = 0;
    49 var expectedWheelEventsOccurred = ['2', '2'];
     49var expectedWheelEventsOccurred = ['0', '0'];
    5050var scrollEventsOccurred = 0;
    5151var scrolledElement = 'document.body'
  • trunk/LayoutTests/fast/events/touch/gesture/touch-gesture-scroll-shy-target.html

    r120792 r140177  
    7777var scrollAmountY = ['62', '0'];
    7878var wheelEventsOccurred = 0;
    79 var expectedWheelEventsOccurred = ['3', '2'];
     79var expectedWheelEventsOccurred = ['0', '0'];
    8080var scrollEventsOccurred = 0;
    8181var expectedScrollEventsOccurred = '1';
  • trunk/LayoutTests/platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-expected.txt

    r110240 r140177  
    55
    66first gesture
    7 wheel event 0+> [object HTMLDivElement]
    87PASS movingdiv.scrollTop is 0
    98PASS movingdiv.scrollLeft is 90
    10 PASS wheelEventsOccurred is 1
     9PASS wheelEventsOccurred is 0
    1110second gesture
    12 wheel event 0+> [object HTMLDivElement]
    1311PASS movingdiv.scrollTop is 95
    1412PASS movingdiv.scrollLeft is 90
    15 PASS wheelEventsOccurred is 1
     13PASS wheelEventsOccurred is 0
    1614scroll event 0+> [object HTMLDivElement]
    1715PASS scrollEventsOccurred is 1
  • trunk/LayoutTests/platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-div-scaled-expected.txt

    r139022 r140177  
    55
    66first gesture
    7 wheel event 0+> [object HTMLDivElement]
    87PASS movingdiv.scrollTop is 0
    98PASS movingdiv.scrollLeft is 45
    10 PASS wheelEventsOccurred is 1
     9PASS wheelEventsOccurred is 0
    1110second gesture
    12 wheel event 0+> [object HTMLDivElement]
    13 PASS movingdiv.scrollTop is 48
     11PASS movingdiv.scrollTop is 47
    1412PASS movingdiv.scrollLeft is 45
    15 PASS wheelEventsOccurred is 1
     13PASS wheelEventsOccurred is 0
    1614scroll event 0+> [object HTMLDivElement]
    1715PASS scrollEventsOccurred is 1
  • trunk/LayoutTests/platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-iframe-expected.txt

    r110240 r140177  
    66
    77first gesture
    8 wheel event 0+> [object HTMLDivElement]
    98PASS touchtarget.contentDocument.body.scrollTop is 140
    109PASS touchtarget.contentDocument.body.scrollLeft is 0
    11 PASS wheelEventsOccurred is 1
     10PASS wheelEventsOccurred is 0
    1211second gesture
    13 wheel event 0+> [object HTMLDivElement]
    1412PASS touchtarget.contentDocument.body.scrollTop is 200
    1513PASS touchtarget.contentDocument.body.scrollLeft is 0
    16 PASS wheelEventsOccurred is 1
     14PASS wheelEventsOccurred is 0
    1715scroll event 0+> [object HTMLDocument]
    1816PASS scrollEventsOccurred is 1
  • trunk/LayoutTests/platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-page-expected.txt

    r110240 r140177  
    55
    66first gesture
    7 wheel event 0+> [object HTMLDivElement]
    8 wheel event 1+> [object HTMLDivElement]
    97PASS document.body.scrollTop is 70
    108PASS document.body.scrollLeft is 0
    11 PASS wheelEventsOccurred is 2
     9PASS wheelEventsOccurred is 0
    1210second gesture
    13 wheel event 0+> [object HTMLDivElement]
    14 wheel event 1+> [object HTMLDivElement]
    1511PASS document.body.scrollTop is 130
    1612PASS document.body.scrollLeft is 0
    17 PASS wheelEventsOccurred is 2
     13PASS wheelEventsOccurred is 0
    1814scroll event 0+> [object HTMLDocument]
    1915PASS scrollEventsOccurred is 1
  • trunk/LayoutTests/platform/chromium/fast/events/touch/gesture/touch-gesture-scroll-shy-target-expected.txt

    r110371 r140177  
    55
    66first gesture
    7 wheel event 0+> [object HTMLDivElement]
    8 wheel event 1+> [object HTMLDivElement]
    9 wheel event 2+> [object HTMLDivElement]
    107PASS movingdiv.scrollTop is 62
    118PASS movingdiv.scrollLeft is 63
    12 PASS wheelEventsOccurred is 3
     9PASS wheelEventsOccurred is 0
    1310second gesture
    14 wheel event 0+> [object HTMLDivElement]
    15 wheel event 1+> [object HTMLDivElement]
    1611received element removing keypress
    1712PASS movingdiv.scrollTop is 0
    1813PASS movingdiv.scrollLeft is 0
    19 PASS wheelEventsOccurred is 2
     14PASS wheelEventsOccurred is 0
    2015scroll event 0+> [object HTMLDivElement]
    2116PASS scrollEventsOccurred is 1
  • trunk/LayoutTests/platform/chromium/plugins/gesture-events-expected.txt

    r124906 r140177  
    77Plugin received event: GestureScrollBegin
    88Plugin received event: GestureScrollUpdate
    9 Plugin received event: MouseWheel
    109Plugin received event: GestureScrollEnd
    1110
  • trunk/LayoutTests/platform/chromium/plugins/gesture-events-scrolled-expected.txt

    r128615 r140177  
    66Plugin received event: GestureScrollBegin
    77Plugin received event: GestureScrollUpdate
    8 Plugin received event: MouseWheel
    98Plugin received event: GestureScrollEnd
    109
  • trunk/Source/WebCore/ChangeLog

    r140174 r140177  
     12013-01-18  Terry Anderson  <tdanderson@chromium.org>
     2
     3        Scroll gestures should not create wheel events
     4        https://bugs.webkit.org/show_bug.cgi?id=103952
     5
     6        Reviewed by James Robinson.
     7
     8        Tests: fast/events/touch/gesture/touch-gesture-scroll-div-propagated.html
     9               fast/events/touch/gesture/touch-gesture-scroll-div-twice-propagated.html
     10               fast/events/touch/gesture/touch-gesture-scroll-iframe-editable.html
     11               fast/events/touch/gesture/touch-gesture-scroll-iframe-propagated.html
     12               fast/events/touch/gesture/touch-gesture-scroll-page-propagated.html
     13
     14        In EventHandler::handleGestureEvent(), scroll gestures should not be handled by synthesizing
     15        and dispatching wheel events; we should instead scroll the relevant layer directly.
     16
     17        Note that this patch should be landed together with the patch for
     18        https://bugs.webkit.org/show_bug.cgi?id=106589.
     19
     20        * page/EventHandler.cpp:
     21        (WebCore::EventHandler::EventHandler):
     22        (WebCore::EventHandler::clear):
     23        (WebCore::EventHandler::handleGestureEvent):
     24        (WebCore::EventHandler::passGestureEventToWidget):
     25        (WebCore::EventHandler::passGestureEventToWidgetIfPossible):
     26        (WebCore):
     27        (WebCore::closestScrollableNodeInDocumentIfPossibleOrSelfIfNotScrollable):
     28        (WebCore::EventHandler::handleGestureScrollBegin):
     29        (WebCore::EventHandler::handleGestureScrollUpdate):
     30        (WebCore::EventHandler::isScrollbarHandlingGestures):
     31        * page/EventHandler.h:
     32        (EventHandler):
     33        * rendering/RenderLayer.cpp:
     34        (WebCore::RenderLayer::scrollByRecursively):
     35        * rendering/RenderLayer.h:
     36
    1372013-01-18  Nate Chapin  <japhet@chromium.org>
    238
  • trunk/Source/WebCore/page/EventHandler.cpp

    r139939 r140177  
    340340    , m_touchPressed(false)
    341341#endif
     342#if ENABLE(GESTURE_EVENTS)
     343    , m_scrollGestureHandlingNode(0)
     344    , m_lastHitTestResultOverWidget(false)
     345#endif
    342346    , m_maxMouseMovedDuration(0)
    343347    , m_baseEventType(PlatformEvent::NoType)
     
    397401#if ENABLE(GESTURE_EVENTS)
    398402    m_scrollGestureHandlingNode = 0;
     403    m_lastHitTestResultOverWidget = false;
    399404    m_scrollbarHandlingScrollGesture = 0;
    400405#endif
     
    24502455    if (eventTarget) {
    24512456        bool eventSwallowed = eventTarget->dispatchGestureEvent(gestureEvent);
    2452 
    2453         if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) {
     2457        if (gestureEvent.type() == PlatformEvent::GestureScrollBegin || gestureEvent.type() == PlatformEvent::GestureScrollEnd) {
    24542458            if (eventSwallowed)
    24552459                m_scrollGestureHandlingNode = eventTarget;
    2456             else
    2457                 m_scrollGestureHandlingNode = 0;
    24582460        }
    24592461
     
    24682470    switch (gestureEvent.type()) {
    24692471    case PlatformEvent::GestureScrollBegin:
    2470         return handleGestureScrollCore(gestureEvent, ScrollByPixelWheelEvent, false);
     2472        return handleGestureScrollBegin(gestureEvent);
    24712473    case PlatformEvent::GestureScrollUpdate:
    24722474        return handleGestureScrollUpdate(gestureEvent);
     
    25842586}
    25852587
     2588bool EventHandler::passGestureEventToWidget(const PlatformGestureEvent& gestureEvent, Widget* widget)
     2589{
     2590    if (!widget)
     2591        return false;
     2592
     2593    if (!widget->isFrameView())
     2594        return false;
     2595
     2596    return static_cast<FrameView*>(widget)->frame()->eventHandler()->handleGestureEvent(gestureEvent);
     2597}
     2598
     2599bool EventHandler::passGestureEventToWidgetIfPossible(const PlatformGestureEvent& gestureEvent, RenderObject* renderer)
     2600{
     2601    if (m_lastHitTestResultOverWidget && renderer && renderer->isWidget()) {
     2602        Widget* widget = toRenderWidget(renderer)->widget();
     2603        return widget && passGestureEventToWidget(gestureEvent, widget);
     2604    }
     2605    return false;
     2606}
     2607
     2608static const Node* closestScrollableNodeInDocumentIfPossibleOrSelfIfNotScrollable(const Node* node)
     2609{
     2610    for (const Node* scrollableNode = node; scrollableNode; scrollableNode = scrollableNode->parentNode()) {
     2611        if (scrollableNode->isDocumentNode())
     2612            break;
     2613        RenderObject* renderer = scrollableNode->renderer();
     2614        if (renderer && renderer->isBox() && toRenderBox(renderer)->canBeScrolledAndHasScrollableArea())
     2615            return scrollableNode;
     2616    }
     2617    return node;
     2618}
     2619
     2620bool EventHandler::handleGestureScrollBegin(const PlatformGestureEvent& gestureEvent)
     2621{
     2622    Document* document = m_frame->document();
     2623    RenderObject* documentRenderer = document->renderer();
     2624    if (!documentRenderer)
     2625        return false;
     2626
     2627    FrameView* view = m_frame->view();
     2628    if (!view)
     2629        return false;
     2630
     2631    LayoutPoint viewPoint = view->windowToContents(gestureEvent.position());
     2632    HitTestRequest request(HitTestRequest::ReadOnly);
     2633    HitTestResult result(viewPoint);
     2634    document->renderView()->hitTest(request, result);
     2635
     2636    m_lastHitTestResultOverWidget = result.isOverWidget();
     2637    m_scrollGestureHandlingNode = result.innerNode();
     2638
     2639    Node* node = m_scrollGestureHandlingNode.get();
     2640    if (node)
     2641        passGestureEventToWidgetIfPossible(gestureEvent, node->renderer());
     2642   
     2643    return node && node->renderer();
     2644}
     2645
    25862646bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gestureEvent)
    25872647{
    2588     return handleGestureScrollCore(gestureEvent, ScrollByPixelWheelEvent, true);
     2648    // Ignore this event if we don't already have a targeted node with a valid renderer.
     2649    const Node* node = m_scrollGestureHandlingNode.get();
     2650    if (!node)
     2651        return false;
     2652
     2653    RenderObject* latchedRenderer = node->renderer();
     2654    if (!latchedRenderer)
     2655        return false;
     2656
     2657    IntSize delta(-gestureEvent.deltaX(), -gestureEvent.deltaY());
     2658    if (delta.isZero())
     2659        return false;
     2660
     2661    RefPtr<FrameView> protector(m_frame->view());
     2662
     2663    // Try to send the event to the correct view.
     2664    if (passGestureEventToWidgetIfPossible(gestureEvent, latchedRenderer))
     2665        return true;
     2666
     2667    // Otherwise if this is the correct view for the event, find the closest scrollable
     2668    // ancestor of the targeted node and scroll the layer that contains this node's renderer.
     2669    node = closestScrollableNodeInDocumentIfPossibleOrSelfIfNotScrollable(node);
     2670    if (!node)
     2671        return false;
     2672
     2673    latchedRenderer = node->renderer();
     2674    if (!latchedRenderer)
     2675        return false;
     2676
     2677    const float scaleFactor = m_frame->pageZoomFactor() * m_frame->frameScaleFactor();
     2678    delta.scale(1 / scaleFactor, 1 / scaleFactor);
     2679
     2680    bool result = latchedRenderer->enclosingLayer()->scrollByRecursively(delta, RenderLayer::ScrollOffsetClamped);
     2681
     2682    if (result)
     2683        setFrameWasScrolledByUser();
     2684
     2685    return result;
    25892686}
    25902687
     
    25932690    return m_scrollbarHandlingScrollGesture.get();
    25942691}
    2595 
    2596 bool EventHandler::handleGestureScrollCore(const PlatformGestureEvent& gestureEvent, PlatformWheelEventGranularity granularity, bool latchedWheel)
    2597 {
    2598     const float tickDivisor = (float)WheelEvent::tickMultiplier;
    2599     const float scaleFactor = m_frame->pageZoomFactor() * m_frame->frameScaleFactor();
    2600     float scaledDeltaX = gestureEvent.deltaX() / scaleFactor;
    2601     float scaledDeltaY = gestureEvent.deltaY() / scaleFactor;
    2602     IntPoint point(gestureEvent.position().x(), gestureEvent.position().y());
    2603     IntPoint globalPoint(gestureEvent.globalPosition().x(), gestureEvent.globalPosition().y());
    2604     PlatformWheelEvent syntheticWheelEvent(point, globalPoint,
    2605         scaledDeltaX, scaledDeltaY, scaledDeltaX / tickDivisor, scaledDeltaY / tickDivisor,
    2606         granularity,
    2607         gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey());
    2608     syntheticWheelEvent.setUseLatchedEventNode(latchedWheel);
    2609     return handleWheelEvent(syntheticWheelEvent);
    2610 }
    2611 #endif
     2692#endif // ENABLE(GESTURE_EVENTS)
    26122693
    26132694#if ENABLE(TOUCH_ADJUSTMENT)
  • trunk/Source/WebCore/page/EventHandler.h

    r139419 r140177  
    183183    bool handleGestureTwoFingerTap(const PlatformGestureEvent&);
    184184    bool handleGestureScrollUpdate(const PlatformGestureEvent&);
     185    bool handleGestureScrollBegin(const PlatformGestureEvent&);
    185186    bool isScrollbarHandlingGestures() const;
    186187#endif
     
    376377
    377378#if ENABLE(GESTURE_EVENTS)
    378     bool handleGestureScrollCore(const PlatformGestureEvent&, PlatformWheelEventGranularity, bool latchedWheel);
    379379    bool handleGestureTapDown();
    380380    bool handleGestureForTextSelectionOrContextMenu(const PlatformGestureEvent&);
     381    bool passGestureEventToWidget(const PlatformGestureEvent&, Widget*);
     382    bool passGestureEventToWidgetIfPossible(const PlatformGestureEvent&, RenderObject*);
    381383#endif
    382384
     
    469471#if ENABLE(GESTURE_EVENTS)
    470472    RefPtr<Node> m_scrollGestureHandlingNode;
     473    bool m_lastHitTestResultOverWidget;
    471474    RefPtr<Scrollbar> m_scrollbarHandlingScrollGesture;
    472475#endif
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r140075 r140177  
    19631963}
    19641964
    1965 void RenderLayer::scrollByRecursively(const IntSize& delta, ScrollOffsetClamping clamp)
     1965bool RenderLayer::scrollByRecursively(const IntSize& delta, ScrollOffsetClamping clamp)
    19661966{
    19671967    if (delta.isZero())
    1968         return;
     1968        return false;
    19691969
    19701970    bool restrictedByLineClamp = false;
     
    19781978        // If this layer can't do the scroll we ask the next layer up that can scroll to try
    19791979        IntSize remainingScrollOffset = newScrollOffset - scrollOffset();
     1980        bool didScroll = true;
    19801981        if (!remainingScrollOffset.isZero() && renderer()->parent()) {
    19811982            if (RenderLayer* scrollableLayer = enclosingScrollableLayer())
    1982                 scrollableLayer->scrollByRecursively(remainingScrollOffset);
     1983                didScroll = scrollableLayer->scrollByRecursively(remainingScrollOffset, clamp);
    19831984
    19841985            Frame* frame = renderer()->frame();
     
    19861987                frame->eventHandler()->updateAutoscrollRenderer();
    19871988        }
     1989        return didScroll;
    19881990    } else if (renderer()->view()->frameView()) {
    19891991        // If we are here, we were called on a renderer that can be programmatically scrolled, but doesn't
    19901992        // have an overflow clip. Which means that it is a document node that can be scrolled.
    1991         renderer()->view()->frameView()->scrollBy(delta);
     1993        FrameView* view = renderer()->view()->frameView();
     1994        IntPoint scrollPositionBefore = view->scrollPosition();
     1995        view->scrollBy(delta);
     1996        IntPoint scrollPositionAfter = view->scrollPosition();
     1997        return scrollPositionBefore != scrollPositionAfter;
     1998
    19921999        // FIXME: If we didn't scroll the whole way, do we want to try looking at the frames ownerElement?
    19932000        // https://bugs.webkit.org/show_bug.cgi?id=28237
    19942001    }
     2002
     2003    return false;
    19952004}
    19962005
  • trunk/Source/WebCore/rendering/RenderLayer.h

    r140068 r140177  
    330330
    331331    // Scrolling methods for layers that can scroll their overflow.
    332     void scrollByRecursively(const IntSize&, ScrollOffsetClamping = ScrollOffsetUnclamped);
     332    bool scrollByRecursively(const IntSize&, ScrollOffsetClamping = ScrollOffsetUnclamped);
    333333    void scrollToOffset(const IntSize&, ScrollOffsetClamping = ScrollOffsetUnclamped);
    334334    void scrollToXOffset(int x, ScrollOffsetClamping clamp = ScrollOffsetUnclamped) { scrollToOffset(IntSize(x, scrollYOffset()), clamp); }
Note: See TracChangeset for help on using the changeset viewer.