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()) return; RenderBox* scrollable = RenderBox::findAutoscrollable(renderer); if (!scrollable) return; m_autoscrollType = AutoscrollForSelection; m_autoscrollRenderer = scrollable; startAutoscrollTimer(); }
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()) return; m_autoscrollType = AutoscrollForPan; m_autoscrollRenderer = scrollable; m_panScrollStartPos = lastKnownMousePosition; if (FrameView* view = scrollable->frame()->view()) view->addPanScrollIcon(lastKnownMousePosition); startAutoscrollTimer(); }
void AutoscrollController::updateDragAndDrop(Node* dropTargetNode, const IntPoint& eventPosition, double eventTime) { if (!dropTargetNode) { stopAutoscrollTimer(); return; } RenderBox* scrollable = RenderBox::findAutoscrollable(dropTargetNode->renderer()); if (!scrollable) { stopAutoscrollTimer(); return; } Frame& frame = scrollable->frame(); Page* page = frame.page(); if (!page || !page->settings().autoscrollForDragAndDropEnabled()) { stopAutoscrollTimer(); return; } IntSize offset = scrollable->calculateAutoscrollDirection(eventPosition); if (offset.isZero()) { stopAutoscrollTimer(); return; } m_dragAndDropAutoscrollReferencePosition = eventPosition + offset; if (m_autoscrollType == NoAutoscroll) { m_autoscrollType = AutoscrollForDragAndDrop; m_autoscrollRenderer = scrollable; m_dragAndDropAutoscrollStartTime = eventTime; startAutoscrollTimer(); } else if (m_autoscrollRenderer != scrollable) { m_dragAndDropAutoscrollStartTime = eventTime; m_autoscrollRenderer = scrollable; } }