Index: Source/core/page/AutoscrollController.cpp |
diff --git a/Source/core/page/AutoscrollController.cpp b/Source/core/page/AutoscrollController.cpp |
index 25eaf8a28b538b47a431f4f6ecea66d109a63936..6050c54432a6a6175d9159120df022ee245e0657 100644 |
--- a/Source/core/page/AutoscrollController.cpp |
+++ b/Source/core/page/AutoscrollController.cpp |
@@ -1,4 +1,5 @@ |
/* |
+ * Copyright (C) 2013 Google Inc. All rights reserved. |
* Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. |
* Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
* Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) |
@@ -31,6 +32,7 @@ |
#include "core/page/EventHandler.h" |
#include "core/frame/Frame.h" |
#include "core/frame/FrameView.h" |
+#include "core/page/Chrome.h" |
#include "core/page/Page.h" |
#include "core/rendering/HitTestResult.h" |
#include "core/rendering/RenderBox.h" |
@@ -41,16 +43,13 @@ namespace WebCore { |
// Delay time in second for start autoscroll if pointer is in border edge of scrollable element. |
static double autoscrollDelay = 0.2; |
-// When the autoscroll or the panScroll is triggered when do the scroll every 0.05s to make it smooth |
-static const double autoscrollInterval = 0.05; |
- |
-PassOwnPtr<AutoscrollController> AutoscrollController::create() |
+PassOwnPtr<AutoscrollController> AutoscrollController::create(Page& page) |
{ |
- return adoptPtr(new AutoscrollController()); |
+ return adoptPtr(new AutoscrollController(page)); |
} |
-AutoscrollController::AutoscrollController() |
- : m_autoscrollTimer(this, &AutoscrollController::autoscrollTimerFired) |
+AutoscrollController::AutoscrollController(Page& page) |
+ : m_page(page) |
, m_autoscrollRenderer(0) |
, m_autoscrollType(NoAutoscroll) |
, m_dragAndDropAutoscrollStartTime(0) |
@@ -70,20 +69,19 @@ bool AutoscrollController::autoscrollInProgress(const RenderBox* renderer) const |
void AutoscrollController::startAutoscrollForSelection(RenderObject* renderer) |
{ |
// We don't want to trigger the autoscroll or the panScroll if it's already active |
- if (m_autoscrollTimer.isActive()) |
+ if (m_autoscrollType != NoAutoscroll) |
return; |
RenderBox* scrollable = RenderBox::findAutoscrollable(renderer); |
if (!scrollable) |
return; |
m_autoscrollType = AutoscrollForSelection; |
m_autoscrollRenderer = scrollable; |
- startAutoscrollTimer(); |
+ startAutoscroll(); |
} |
-void AutoscrollController::stopAutoscrollTimer() |
+void AutoscrollController::stopAutoscroll() |
{ |
RenderBox* scrollable = m_autoscrollRenderer; |
- m_autoscrollTimer.stop(); |
m_autoscrollRenderer = 0; |
if (!scrollable) |
@@ -108,7 +106,6 @@ void AutoscrollController::stopAutoscrollIfNeeded(RenderObject* renderer) |
return; |
m_autoscrollRenderer = 0; |
m_autoscrollType = NoAutoscroll; |
- m_autoscrollTimer.stop(); |
} |
void AutoscrollController::updateAutoscrollRenderer() |
@@ -133,7 +130,7 @@ void AutoscrollController::updateAutoscrollRenderer() |
void AutoscrollController::updateDragAndDrop(Node* dropTargetNode, const IntPoint& eventPosition, double eventTime) |
{ |
if (!dropTargetNode || !dropTargetNode->renderer()) { |
- stopAutoscrollTimer(); |
+ stopAutoscroll(); |
return; |
} |
@@ -142,19 +139,19 @@ void AutoscrollController::updateDragAndDrop(Node* dropTargetNode, const IntPoin |
RenderBox* scrollable = RenderBox::findAutoscrollable(dropTargetNode->renderer()); |
if (!scrollable) { |
- stopAutoscrollTimer(); |
+ stopAutoscroll(); |
return; |
} |
Page* page = scrollable->frame() ? scrollable->frame()->page() : 0; |
if (!page) { |
- stopAutoscrollTimer(); |
+ stopAutoscroll(); |
return; |
} |
IntSize offset = scrollable->calculateAutoscrollDirection(eventPosition); |
if (offset.isZero()) { |
- stopAutoscrollTimer(); |
+ stopAutoscroll(); |
return; |
} |
@@ -164,7 +161,7 @@ void AutoscrollController::updateDragAndDrop(Node* dropTargetNode, const IntPoin |
m_autoscrollType = AutoscrollForDragAndDrop; |
m_autoscrollRenderer = scrollable; |
m_dragAndDropAutoscrollStartTime = eventTime; |
- startAutoscrollTimer(); |
+ startAutoscroll(); |
} else if (m_autoscrollRenderer != scrollable) { |
m_dragAndDropAutoscrollStartTime = eventTime; |
m_autoscrollRenderer = scrollable; |
@@ -183,7 +180,7 @@ void AutoscrollController::handleMouseReleaseForPanScrolling(Frame* frame, const |
m_autoscrollType = AutoscrollForPanCanStop; |
break; |
case AutoscrollForPanCanStop: |
- stopAutoscrollTimer(); |
+ stopAutoscroll(); |
break; |
} |
} |
@@ -196,7 +193,7 @@ bool AutoscrollController::panScrollInProgress() const |
void AutoscrollController::startPanScrolling(RenderBox* scrollable, const IntPoint& lastKnownMousePosition) |
{ |
// We don't want to trigger the autoscroll or the panScroll if it's already active |
- if (m_autoscrollTimer.isActive()) |
+ if (m_autoscrollType != NoAutoscroll) |
return; |
m_autoscrollType = AutoscrollForPan; |
@@ -205,7 +202,7 @@ void AutoscrollController::startPanScrolling(RenderBox* scrollable, const IntPoi |
if (FrameView* view = scrollable->frame()->view()) |
view->addPanScrollIcon(lastKnownMousePosition); |
- startAutoscrollTimer(); |
+ startAutoscroll(); |
} |
#else |
bool AutoscrollController::panScrollInProgress() const |
@@ -214,10 +211,12 @@ bool AutoscrollController::panScrollInProgress() const |
} |
#endif |
-void AutoscrollController::autoscrollTimerFired(Timer<AutoscrollController>*) |
+// FIXME: This would get get better animation fidelity if it used the monotonicFrameBeginTime instead |
+// of WTF::currentTime(). |
+void AutoscrollController::animate(double) |
{ |
if (!m_autoscrollRenderer) { |
- stopAutoscrollTimer(); |
+ stopAutoscroll(); |
return; |
} |
@@ -229,7 +228,7 @@ void AutoscrollController::autoscrollTimerFired(Timer<AutoscrollController>*) |
break; |
case AutoscrollForSelection: |
if (!eventHandler.mousePressed()) { |
- stopAutoscrollTimer(); |
+ stopAutoscroll(); |
return; |
} |
eventHandler.updateSelectionForMouseDrag(); |
@@ -241,7 +240,7 @@ void AutoscrollController::autoscrollTimerFired(Timer<AutoscrollController>*) |
case AutoscrollForPanCanStop: |
case AutoscrollForPan: |
if (!panScrollInProgress()) { |
- stopAutoscrollTimer(); |
+ stopAutoscroll(); |
return; |
} |
if (FrameView* view = m_autoscrollRenderer->frame()->view()) |
@@ -250,11 +249,13 @@ void AutoscrollController::autoscrollTimerFired(Timer<AutoscrollController>*) |
break; |
#endif |
} |
+ if (m_autoscrollType != NoAutoscroll) |
+ m_page.chrome().scheduleAnimation(); |
} |
-void AutoscrollController::startAutoscrollTimer() |
+void AutoscrollController::startAutoscroll() |
{ |
- m_autoscrollTimer.startRepeating(autoscrollInterval); |
+ m_page.chrome().scheduleAnimation(); |
} |
#if OS(WIN) |