blob: 5ccd32d66cd47bda4d54ca73538f333db7a755ef [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "core/page/scrolling/ScrollState.h"
#include "core/dom/Element.h"
#include "core/dom/ExceptionCode.h"
namespace blink {
PassRefPtrWillBeRawPtr<ScrollState> ScrollState::create(double deltaX, double deltaY,
double deltaGranularity, double velocityX, double velocityY, bool inInertialPhase,
bool isBeginning, bool isEnding, bool fromUserInput, bool shouldPropagate,
bool deltaConsumedForScrollSequence)
{
return adoptRefWillBeNoop(new ScrollState(
deltaX, deltaY, deltaGranularity, velocityX, velocityY,
inInertialPhase, isBeginning, isEnding, fromUserInput, shouldPropagate,
deltaConsumedForScrollSequence));
}
ScrollState::ScrollState(double deltaX, double deltaY, double deltaGranularity,
double velocityX, double velocityY, bool inInertialPhase, bool isBeginning,
bool isEnding, bool fromUserInput, bool shouldPropagate,
bool deltaConsumedForScrollSequence)
: m_deltaX(deltaX)
, m_deltaY(deltaY)
, m_deltaGranularity(deltaGranularity)
, m_velocityX(velocityX)
, m_velocityY(velocityY)
, m_inInertialPhase(inInertialPhase)
, m_isBeginning(isBeginning)
, m_isEnding(isEnding)
, m_fromUserInput(fromUserInput)
, m_shouldPropagate(shouldPropagate)
, m_deltaConsumedForScrollSequence(deltaConsumedForScrollSequence)
{
}
void ScrollState::consumeDelta(double x, double y, ExceptionState& exceptionState)
{
if ((m_deltaX > 0 && 0 > x) || (m_deltaX < 0 && 0 < x) || (m_deltaY > 0 && 0 > y) || (m_deltaY < 0 && 0 < y)) {
exceptionState.throwDOMException(InvalidModificationError, "Can't increase delta using consumeDelta");
return;
}
if (fabs(x) > fabs(m_deltaX) || fabs(y) > fabs(m_deltaY)) {
exceptionState.throwDOMException(InvalidModificationError, "Can't change direction of delta using consumeDelta");
return;
}
consumeDeltaNative(x, y);
}
void ScrollState::distributeToScrollChainDescendant()
{
if (!m_scrollChain.isEmpty())
m_scrollChain.takeFirst()->callDistributeScroll(*this);
}
void ScrollState::consumeDeltaNative(double x, double y)
{
m_deltaX -= x;
m_deltaY -= y;
if (x || y)
m_deltaConsumedForScrollSequence = true;
}
} // namespace blink