| Index: Source/core/page/EventHandler.cpp
 | 
| diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp
 | 
| index 530cae3a1d43a9a4888662dc67a9f314cd0b1532..95680b0a9bd6e621fc9d8f355720928109031b08 100644
 | 
| --- a/Source/core/page/EventHandler.cpp
 | 
| +++ b/Source/core/page/EventHandler.cpp
 | 
| @@ -57,6 +57,7 @@
 | 
|  #include "core/html/HTMLInputElement.h"
 | 
|  #include "core/loader/FrameLoader.h"
 | 
|  #include "core/loader/FrameLoaderClient.h"
 | 
| +#include "core/page/AutoscrollController.h"
 | 
|  #include "core/page/BackForwardClient.h"
 | 
|  #include "core/page/Chrome.h"
 | 
|  #include "core/page/DragController.h"
 | 
| @@ -702,8 +703,8 @@ bool EventHandler::handleMouseDraggedEvent(const MouseEventWithHitTestResults& e
 | 
|      m_mouseDownMayStartDrag = false;
 | 
|  
 | 
|      if (m_mouseDownMayStartAutoscroll && !panScrollInProgress()) {
 | 
| -        if (Page* page = m_frame->page()) {
 | 
| -            page->startAutoscrollForSelection(renderer);
 | 
| +        if (AutoscrollController* controller = autoscrollController()) {
 | 
| +            controller->startAutoscrollForSelection(renderer);
 | 
|              m_mouseDownMayStartAutoscroll = false;
 | 
|          }
 | 
|      }
 | 
| @@ -800,9 +801,9 @@ void EventHandler::updateSelectionForMouseDrag(const HitTestResult& hitTestResul
 | 
|  
 | 
|  bool EventHandler::handleMouseReleaseEvent(const MouseEventWithHitTestResults& event)
 | 
|  {
 | 
| -    Page* page = m_frame->page();
 | 
| -    if (page && page->autoscrollInProgress())
 | 
| -        stopAutoscrollTimer();
 | 
| +    AutoscrollController* controller = autoscrollController();
 | 
| +    if (controller && controller->autoscrollInProgress())
 | 
| +        stopAutoscroll();
 | 
|  
 | 
|      // Used to prevent mouseMoveEvent from initiating a drag before
 | 
|      // the mouse is pressed again.
 | 
| @@ -854,19 +855,25 @@ void EventHandler::startPanScrolling(RenderObject* renderer)
 | 
|  {
 | 
|      if (!renderer->isBox())
 | 
|          return;
 | 
| -    Page* page = m_frame->page();
 | 
| -    if (!page)
 | 
| +    AutoscrollController* controller = autoscrollController();
 | 
| +    if (!controller)
 | 
|          return;
 | 
| -    page->startPanScrolling(toRenderBox(renderer), lastKnownMousePosition());
 | 
| +    controller->startPanScrolling(toRenderBox(renderer), lastKnownMousePosition());
 | 
|      invalidateClick();
 | 
|  }
 | 
|  
 | 
|  #endif // OS(WIN)
 | 
|  
 | 
| +AutoscrollController* EventHandler::autoscrollController() const
 | 
| +{
 | 
| +    if (Page* page = m_frame->page())
 | 
| +        return &page->autoscrollController();
 | 
| +    return 0;
 | 
| +}
 | 
| +
 | 
|  bool EventHandler::panScrollInProgress() const
 | 
|  {
 | 
| -    Page* page = m_frame->page();
 | 
| -    return page && page->panScrollInProgress();
 | 
| +    return autoscrollController() && autoscrollController()->panScrollInProgress();
 | 
|  }
 | 
|  
 | 
|  HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTestRequest::HitTestRequestType hitType, const LayoutSize& padding)
 | 
| @@ -908,12 +915,10 @@ HitTestResult EventHandler::hitTestResultAtPoint(const LayoutPoint& point, HitTe
 | 
|      return result;
 | 
|  }
 | 
|  
 | 
| -void EventHandler::stopAutoscrollTimer()
 | 
| +void EventHandler::stopAutoscroll()
 | 
|  {
 | 
| -    Page* page = m_frame->page();
 | 
| -    if (!page)
 | 
| -        return;
 | 
| -    page->stopAutoscrollTimer();
 | 
| +    if (AutoscrollController* controller = autoscrollController())
 | 
| +        controller->stopAutoscroll();
 | 
|  }
 | 
|  
 | 
|  Node* EventHandler::mousePressNode() const
 | 
| @@ -1354,10 +1359,10 @@ bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
 | 
|      }
 | 
|  
 | 
|  #if OS(WIN)
 | 
| -    // We store whether pan scrolling is in progress before calling stopAutoscrollTimer()
 | 
| +    // We store whether pan scrolling is in progress before calling stopAutoscroll()
 | 
|      // because it will set m_autoscrollType to NoAutoscroll on return.
 | 
|      bool isPanScrollInProgress = panScrollInProgress();
 | 
| -    stopAutoscrollTimer();
 | 
| +    stopAutoscroll();
 | 
|      if (isPanScrollInProgress) {
 | 
|          // We invalidate the click when exiting pan scrolling so that we don't inadvertently navigate
 | 
|          // away from the current page (e.g. the click was on a hyperlink). See <rdar://problem/6095023>.
 | 
| @@ -1652,7 +1657,7 @@ bool EventHandler::handleMouseReleaseEvent(const PlatformMouseEvent& mouseEvent)
 | 
|  
 | 
|  #if OS(WIN)
 | 
|      if (Page* page = m_frame->page())
 | 
| -        page->handleMouseReleaseForPanScrolling(m_frame, mouseEvent);
 | 
| +        page->autoscrollController().handleMouseReleaseForPanScrolling(m_frame, mouseEvent);
 | 
|  #endif
 | 
|  
 | 
|      m_mousePressed = false;
 | 
| @@ -1823,8 +1828,8 @@ bool EventHandler::updateDragAndDrop(const PlatformMouseEvent& event, Clipboard*
 | 
|      if (newTarget && newTarget->isTextNode())
 | 
|          newTarget = EventPath::parent(newTarget.get());
 | 
|  
 | 
| -    if (Page* page = m_frame->page())
 | 
| -        page->updateDragAndDrop(newTarget.get(), event.position(), event.timestamp());
 | 
| +    if (AutoscrollController* controller = autoscrollController())
 | 
| +        controller->updateDragAndDrop(newTarget.get(), event.position(), event.timestamp());
 | 
|  
 | 
|      if (m_dragTarget != newTarget) {
 | 
|          // FIXME: this ordering was explicitly chosen to match WinIE. However,
 | 
| @@ -1909,7 +1914,7 @@ bool EventHandler::performDragAndDrop(const PlatformMouseEvent& event, Clipboard
 | 
|  
 | 
|  void EventHandler::clearDragState()
 | 
|  {
 | 
| -    stopAutoscrollTimer();
 | 
| +    stopAutoscroll();
 | 
|      m_dragTarget = 0;
 | 
|      m_capturingMouseEventsNode = 0;
 | 
|      m_shouldOnlyFireDragOverEvent = false;
 | 
| @@ -3018,7 +3023,7 @@ bool EventHandler::keyEvent(const PlatformKeyboardEvent& initialKeyEvent)
 | 
|      if (panScrollInProgress()) {
 | 
|          // If a key is pressed while the panScroll is in progress then we want to stop
 | 
|          if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent.type() == PlatformEvent::RawKeyDown)
 | 
| -            stopAutoscrollTimer();
 | 
| +            stopAutoscroll();
 | 
|  
 | 
|          // If we were in panscroll mode, we swallow the key event
 | 
|          return true;
 | 
| 
 |