Title: [140489] branches/chromium/1364
Revision
140489
Author
[email protected]
Date
2013-01-22 17:33:55 -0800 (Tue, 22 Jan 2013)

Log Message

Merge 140104
> REGRESSION(r137726): Spring Loaded Pan Scrolling doesn't stop
> https://bugs.webkit.org/show_bug.cgi?id=107205
> 
> Reviewed by Hajime Morita.
> 
> Source/WebCore:
> 
> The bug is caused by forgetting to set true m_panScrollButtonPressed
> in AutoscrollController::startPanScroll().
> 
> This patch changes state management during pan scroll by replacing
> m_panScrollButtonPressed and m_springLoadedPanScrollInProgress by
> m_autoscrollType with introducing new AutoscrollController state
> AutoscrollForPanCanStop.
> 
> Tests: platform/chromium-win/fast/events/panScroll-click.html
>        platform/chromium-win/fast/events/panScroll-drag.html
> 
> * page/AutoscrollController.cpp:
> (WebCore::AutoscrollController::AutoscrollController): Changed to remove initialization of m_panScrollButtonPressed and m_springLoadedPanScrollInProgress.
> (WebCore::AutoscrollController::stopAutoscrollTimer): Changed to remove resetting m_panScrollButtonPressed and m_springLoadedPanScrollInProgress.
> (WebCore::AutoscrollController::handleMouseReleaseEvent): Changed to handle AutoscrollForPan and AutoscrollForPanCanStop.
> (WebCore::AutoscrollController::panScrollInProgress): Changed to check AutoscrollForPanCanStop too.
> (WebCore::AutoscrollController::startPanScrolling): Changed to remove setting of m_springLoadedPanScrollInProgress.
> (WebCore::AutoscrollController::autoscrollTimerFired): Changed to add case for AutoscrollForPanCanStop.
> (WebCore::AutoscrollController::updatePanScrollState): Chagned to use AutoscrollForPan and AutoscrollForPanCanStop.
> * page/AutoscrollController.h:
> (AutoscrollController): Changed to add AutoscrollForPanCanStop to AutoscrollType.
> 
> LayoutTests:
> 
> * platform/chromium-win/fast/events/panScroll-click-expected.txt: Added.
> * platform/chromium-win/fast/events/panScroll-click.html: Added.
> * platform/chromium-win/fast/events/panScroll-drag-expected.txt: Added.
> * platform/chromium-win/fast/events/panScroll-drag.html: Added.
> * platfrom/chromium/TestExpectations: Skip panScroll-{click,drag}.html for Android, Linux, and Mac.
> 

[email protected]
Review URL: https://codereview.chromium.org/12040032

Modified Paths

Added Paths

Diff

Modified: branches/chromium/1364/LayoutTests/platform/chromium/TestExpectations (140488 => 140489)


--- branches/chromium/1364/LayoutTests/platform/chromium/TestExpectations	2013-01-23 01:15:13 UTC (rev 140488)
+++ branches/chromium/1364/LayoutTests/platform/chromium/TestExpectations	2013-01-23 01:33:55 UTC (rev 140489)
@@ -2069,6 +2069,9 @@
 webkit.org/b/104991 [ Android Linux Mac ] platform/chromium-win/fast/events/panScroll-event-fired.html [ Skip ]
 webkit.org/b/104991 [ Android Linux Mac ] platform/chromium-win/fast/events/panScroll-nested-divs.html [ Skip ]
 
+webkit.org/b/107205 [ Android Linux Mac ] platform/chromium-win/fast/events/panScroll-click.html [ Skip ]
+webkit.org/b/107205 [ Android Linux Mac ] platform/chromium-win/fast/events/panScroll-drag.html [ Skip ]
+
 crbug.com/31623 [ SnowLeopard Win ] http/tests/appcache/remove-cache.html [ Failure Pass Timeout ]
 
 # V8's implementation of getOwnPropertyNames has different results for built-in

Copied: branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-click-expected.txt (from rev 140104, trunk/LayoutTests/platform/chromium-win/fast/events/panScroll-click-expected.txt) (0 => 140489)


--- branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-click-expected.txt	                        (rev 0)
+++ branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-click-expected.txt	2013-01-23 01:33:55 UTC (rev 140489)
@@ -0,0 +1,9 @@
+For manual testing, hold middle button in scrollable and move aroudn mouse pointer for scrolling, then release middle button to stop scrolling.
+Check pan scroll by click mouse
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS scrollable.scrollTop > 0
+PASS autoscroll stopped
+

Copied: branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-click.html (from rev 140104, trunk/LayoutTests/platform/chromium-win/fast/events/panScroll-click.html) (0 => 140489)


--- branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-click.html	                        (rev 0)
+++ branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-click.html	2013-01-23 01:33:55 UTC (rev 140489)
@@ -0,0 +1,123 @@
+<html>
+<head>
+<style type="text/css">
+#draggable {
+  padding: 5pt;
+  border: 3px solid #00cc00;
+  background: #00cccc;
+  width: 80px;
+  cursor: hand;
+}
+
+#scrollable {
+    height: 200px;
+    overflow: auto;
+    border: solid 3px #cc0000;
+    font-size: 80px;
+}
+</style>
+<script>
+function $(id) { return document.getElementById(id); }
+var MIDDLE_BUTTON = 1;
+var PAN_SCROLL_RADIUS = 15; // from WebCore/platform/ScrollView.h
+
+function finishTest() {
+    $('container').innerHTML = '';
+    window.testRunner.notifyDone();
+}
+
+function testIt() {
+    var scrollable = $('scrollable');
+
+    if (!window.eventSender)
+        return;
+
+    // Start pan scroll by click
+    eventSender.mouseMoveTo(scrollable.offsetLeft + 5, scrollable.offsetTop + 5);
+    eventSender.mouseDown(MIDDLE_BUTTON);
+    eventSender.mouseUp(MIDDLE_BUTTON);
+    eventSender.mouseMoveTo(scrollable.offsetLeft + 5, scrollable.offsetTop + PAN_SCROLL_RADIUS + 6);
+
+    var retryCount = 0;
+    var lastScrollTop = 0;
+
+    function checkScrolled()
+    {
+        if (scrollable.scrollTop > 0) {
+            testPassed('scrollable.scrollTop > 0');
+            // Stop spring loaded pan scroll
+            eventSender.mouseDown(MIDDLE_BUTTON);
+            eventSender.mouseUp(MIDDLE_BUTTON);
+            retryCount = 0;
+            window.setTimeout(checkStopped, 50);
+            return;
+        }
+
+        ++retryCount;
+        if (retryCount > 10) {
+            testFailed('No autoscroll');
+            finishTest();
+            return;
+        }
+
+        // Autoscroll is occurred evey 0.05 sec.
+        window.setTimeout(checkScrolled, 50);
+    }
+
+    function checkStopped()
+    {
+        if (lastScrollTop == scrollable.scrollTop) {
+            testPassed('autoscroll stopped');
+            finishTest();
+            return;
+        }
+
+        ++retryCount;
+        if (retryCount > 10) {
+            testFailed('still autoscroll');
+            finishTest();
+            return;
+        }
+
+        lastScrollTop = scrollable.scrollTop;
+        window.setTimeout(checkStopped, 50);
+    }
+
+    checkScrolled();
+}
+
+function setUpTest()
+{
+    var scrollable = $('scrollable');
+    for (var i = 0; i < 100; ++i) {
+      var line = document.createElement('div');
+      line.innerHTML = "line " + i;
+      scrollable.appendChild(line);
+    }
+
+    if (!window.eventSender) {
+        console.log('Please run within DumpRenderTree');
+        return;
+    }
+
+    window.jsTestIsAsync = true;
+    window.setTimeout(testIt, 0);
+}
+</script>
+</head>
+<body>
+For manual testing, hold middle button in scrollable and move aroudn mouse pointer for scrolling, then release middle button to stop scrolling.
+<div id="container">
+Scrollable
+<div id="scrollable">
+</div>
+</div>
+<div id="console"></div>
+<script src=""
+<script>
+description('Check pan scroll by click mouse');
+setUpTest();
+</script>
+<script src=""
+</body>
+</html>

Copied: branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-drag-expected.txt (from rev 140104, trunk/LayoutTests/platform/chromium-win/fast/events/panScroll-drag-expected.txt) (0 => 140489)


--- branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-drag-expected.txt	                        (rev 0)
+++ branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-drag-expected.txt	2013-01-23 01:33:55 UTC (rev 140489)
@@ -0,0 +1,9 @@
+For manual testing, hold middle button in scrollable and move aroudn mouse pointer for scrolling, then release middle button to stop scrolling.
+Check pan scroll by drag mouse
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS scrollable.scrollTop > 0
+PASS autoscroll stopped
+

Copied: branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-drag.html (from rev 140104, trunk/LayoutTests/platform/chromium-win/fast/events/panScroll-drag.html) (0 => 140489)


--- branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-drag.html	                        (rev 0)
+++ branches/chromium/1364/LayoutTests/platform/chromium-win/fast/events/panScroll-drag.html	2013-01-23 01:33:55 UTC (rev 140489)
@@ -0,0 +1,121 @@
+<html>
+<head>
+<style type="text/css">
+#draggable {
+  padding: 5pt;
+  border: 3px solid #00cc00;
+  background: #00cccc;
+  width: 80px;
+  cursor: hand;
+}
+
+#scrollable {
+    height: 200px;
+    overflow: auto;
+    border: solid 3px #cc0000;
+    font-size: 80px;
+}
+</style>
+<script>
+function $(id) { return document.getElementById(id); }
+var MIDDLE_BUTTON = 1;
+var PAN_SCROLL_RADIUS = 15; // from WebCore/platform/ScrollView.h
+
+function finishTest() {
+    $('container').innerHTML = '';
+    window.testRunner.notifyDone();
+}
+
+function testIt() {
+    var scrollable = $('scrollable');
+
+    if (!window.eventSender)
+        return;
+
+    // Start pan scroll by drag
+    eventSender.mouseMoveTo(scrollable.offsetLeft + 5, scrollable.offsetTop + 5);
+    eventSender.mouseDown(MIDDLE_BUTTON);
+    eventSender.mouseMoveTo(scrollable.offsetLeft + 5, scrollable.offsetTop + PAN_SCROLL_RADIUS + 6);
+
+    var retryCount = 0;
+    var lastScrollTop = 0;
+
+    function checkScrolled()
+    {
+        if (scrollable.scrollTop > 0) {
+            testPassed('scrollable.scrollTop > 0');
+            // Stop spring loaded pan scroll
+            eventSender.mouseUp(MIDDLE_BUTTON);
+            retryCount = 0;
+            window.setTimeout(checkStopped, 50);
+            return;
+        }
+
+        ++retryCount;
+        if (retryCount > 10) {
+            testFailed('No autoscroll');
+            finishTest();
+            return;
+        }
+
+        // Autoscroll is occurred evey 0.05 sec.
+        window.setTimeout(checkScrolled, 50);
+    }
+
+    function checkStopped()
+    {
+        if (lastScrollTop == scrollable.scrollTop) {
+            testPassed('autoscroll stopped');
+            finishTest();
+            return;
+        }
+
+        ++retryCount;
+        if (retryCount > 10) {
+            testFailed('still autoscroll');
+            finishTest();
+            return;
+        }
+
+        lastScrollTop = scrollable.scrollTop;
+        window.setTimeout(checkStopped, 50);
+    }
+
+    checkScrolled();
+}
+
+function setUpTest()
+{
+    var scrollable = $('scrollable');
+    for (var i = 0; i < 100; ++i) {
+      var line = document.createElement('div');
+      line.innerHTML = "line " + i;
+      scrollable.appendChild(line);
+    }
+
+    if (!window.eventSender) {
+        console.log('Please run within DumpRenderTree');
+        return;
+    }
+
+    window.jsTestIsAsync = true;
+    window.setTimeout(testIt, 0);
+}
+</script>
+</head>
+<body>
+For manual testing, hold middle button in scrollable and move aroudn mouse pointer for scrolling, then release middle button to stop scrolling.
+<div id="container">
+Scrollable
+<div id="scrollable">
+</div>
+</div>
+<div id="console"></div>
+<script src=""
+<script>
+description('Check pan scroll by drag mouse');
+setUpTest();
+</script>
+<script src=""
+</body>
+</html>

Modified: branches/chromium/1364/Source/WebCore/page/AutoscrollController.cpp (140488 => 140489)


--- branches/chromium/1364/Source/WebCore/page/AutoscrollController.cpp	2013-01-23 01:15:13 UTC (rev 140488)
+++ branches/chromium/1364/Source/WebCore/page/AutoscrollController.cpp	2013-01-23 01:33:55 UTC (rev 140489)
@@ -53,10 +53,6 @@
     : m_autoscrollTimer(this, &AutoscrollController::autoscrollTimerFired)
     , m_autoscrollRenderer(0)
     , m_autoscrollType(NoAutoscroll)
-#if ENABLE(PAN_SCROLLING)
-    , m_panScrollButtonPressed(false)
-    , m_springLoadedPanScrollInProgress(false)
-#endif
 {
 }
 
@@ -89,10 +85,6 @@
     m_autoscrollTimer.stop();
     m_autoscrollType = NoAutoscroll;
     m_autoscrollRenderer = 0;
-#if ENABLE(PAN_SCROLLING)
-    m_panScrollButtonPressed = false;
-    m_springLoadedPanScrollInProgress = false;
-#endif
 
     if (!scrollable)
         return;
@@ -157,15 +149,20 @@
 
 void AutoscrollController::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent)
 {
-    if (mouseEvent.button() == MiddleButton)
-        m_panScrollButtonPressed = false;
-    if (m_springLoadedPanScrollInProgress)
+    switch (m_autoscrollType) {
+    case AutoscrollForPan:
+        if (mouseEvent.button() == MiddleButton)
+            m_autoscrollType = AutoscrollForPanCanStop;
+        break;
+    case AutoscrollForPanCanStop:
         stopAutoscrollTimer();
+        break;
+    }
 }
 
 bool AutoscrollController::panScrollInProgress() const
 {
-    return m_autoscrollType == AutoscrollForPan;
+    return m_autoscrollType == AutoscrollForPan || m_autoscrollType == AutoscrollForPanCanStop;
 }
 
 void AutoscrollController::startPanScrolling(RenderBox* scrollable, const IntPoint& lastKnownMousePosition)
@@ -177,7 +174,6 @@
     m_autoscrollType = AutoscrollForPan;
     m_autoscrollRenderer = scrollable;
     m_panScrollStartPos = lastKnownMousePosition;
-    m_springLoadedPanScrollInProgress = false;
 
     if (FrameView* view = scrollable->frame()->view())
         view->addPanScrollIcon(lastKnownMousePosition);
@@ -210,6 +206,7 @@
     case NoAutoscroll:
         break;
 #if ENABLE(PAN_SCROLLING)
+    case AutoscrollForPanCanStop:
     case AutoscrollForPan:
         // we verify that the main frame hasn't received the order to stop the panScroll
         if (Frame* mainFrame = getMainFrame(frame)) {
@@ -241,8 +238,8 @@
     bool north = m_panScrollStartPos.y() > (lastKnownMousePosition.y() + ScrollView::noPanScrollRadius);
     bool south = m_panScrollStartPos.y() < (lastKnownMousePosition.y() - ScrollView::noPanScrollRadius);
 
-    if ((east || west || north || south) && m_panScrollButtonPressed)
-        m_springLoadedPanScrollInProgress = true;
+    if (m_autoscrollType == AutoscrollForPan && (east || west || north || south))
+        m_autoscrollType = AutoscrollForPanCanStop;
 
     if (north) {
         if (east)

Modified: branches/chromium/1364/Source/WebCore/page/AutoscrollController.h (140488 => 140489)


--- branches/chromium/1364/Source/WebCore/page/AutoscrollController.h	2013-01-23 01:15:13 UTC (rev 140488)
+++ branches/chromium/1364/Source/WebCore/page/AutoscrollController.h	2013-01-23 01:33:55 UTC (rev 140489)
@@ -42,6 +42,7 @@
     NoAutoscroll,
     AutoscrollForSelection,
 #if ENABLE(PAN_SCROLLING)
+    AutoscrollForPanCanStop,
     AutoscrollForPan,
 #endif
 };
@@ -76,8 +77,6 @@
     AutoscrollType m_autoscrollType;
 #if ENABLE(PAN_SCROLLING)
     IntPoint m_panScrollStartPos;
-    bool m_panScrollButtonPressed;
-    bool m_springLoadedPanScrollInProgress;
 #endif
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to