Bug 951793 - Store the overscroll behavior in ScrollMetadata and propagate it to APZ. r=mstange

MozReview-Commit-ID: J7Vkd941QxK
This commit is contained in:
Botond Ballo 2017-10-18 20:13:19 -04:00 коммит произвёл Emilio Cobos Álvarez
Родитель 4554e0cd08
Коммит 41aac0b97c
6 изменённых файлов: 108 добавлений и 2 удалений

Просмотреть файл

@ -6,6 +6,7 @@
#include "FrameMetrics.h"
#include "gfxPrefs.h"
#include "nsStyleConsts.h"
namespace mozilla {
namespace layers {
@ -18,6 +19,31 @@ ScrollMetadata::SetUsesContainerScrolling(bool aValue) {
mUsesContainerScrolling = aValue;
}
static OverscrollBehavior
ToOverscrollBehavior(StyleOverscrollBehavior aBehavior)
{
switch (aBehavior) {
case StyleOverscrollBehavior::Auto:
return OverscrollBehavior::Auto;
case StyleOverscrollBehavior::Contain:
return OverscrollBehavior::Contain;
case StyleOverscrollBehavior::None:
return OverscrollBehavior::None;
}
MOZ_ASSERT_UNREACHABLE("Invalid overscroll behavior");
return OverscrollBehavior::Auto;
}
OverscrollBehaviorInfo
OverscrollBehaviorInfo::FromStyleConstants(StyleOverscrollBehavior aBehaviorX,
StyleOverscrollBehavior aBehaviorY)
{
OverscrollBehaviorInfo result;
result.mBehaviorX = ToOverscrollBehavior(aBehaviorX);
result.mBehaviorY = ToOverscrollBehavior(aBehaviorY);
return result;
}
StaticAutoPtr<const ScrollMetadata> ScrollMetadata::sNullMetadata;
}

Просмотреть файл

@ -721,6 +721,32 @@ struct ScrollSnapInfo {
nsTArray<nsPoint> mScrollSnapCoordinates;
};
MOZ_DEFINE_ENUM_CLASS_WITH_BASE(
OverscrollBehavior, uint8_t, (
Auto,
Contain,
None
));
struct OverscrollBehaviorInfo {
OverscrollBehaviorInfo()
: mBehaviorX(OverscrollBehavior::Auto)
, mBehaviorY(OverscrollBehavior::Auto)
{}
// Construct from StyleOverscrollBehavior values.
static OverscrollBehaviorInfo FromStyleConstants(StyleOverscrollBehavior aBehaviorX,
StyleOverscrollBehavior aBehaviorY);
bool operator==(const OverscrollBehaviorInfo& aOther) const {
return mBehaviorX == aOther.mBehaviorX &&
mBehaviorY == aOther.mBehaviorY;
}
OverscrollBehavior mBehaviorX;
OverscrollBehavior mBehaviorY;
};
/**
* A clip that applies to a layer, that may be scrolled by some of the
* scroll frames associated with the layer.
@ -797,6 +823,7 @@ public:
, mIsLayersIdRoot(false)
, mUsesContainerScrolling(false)
, mForceDisableApz(false)
, mOverscrollBehavior()
{}
bool operator==(const ScrollMetadata& aOther) const
@ -813,7 +840,8 @@ public:
mAllowVerticalScrollWithWheel == aOther.mAllowVerticalScrollWithWheel &&
mIsLayersIdRoot == aOther.mIsLayersIdRoot &&
mUsesContainerScrolling == aOther.mUsesContainerScrolling &&
mForceDisableApz == aOther.mForceDisableApz;
mForceDisableApz == aOther.mForceDisableApz &&
mOverscrollBehavior == aOther.mOverscrollBehavior;
}
bool operator!=(const ScrollMetadata& aOther) const
@ -923,6 +951,13 @@ public:
return mForceDisableApz;
}
void SetOverscrollBehavior(const OverscrollBehaviorInfo& aOverscrollBehavior) {
mOverscrollBehavior = aOverscrollBehavior;
}
const OverscrollBehaviorInfo& GetOverscrollBehavior() const {
return mOverscrollBehavior;
}
private:
FrameMetrics mMetrics;
@ -972,6 +1007,9 @@ private:
// scrollframe.
bool mForceDisableApz:1;
// The overscroll behavior for this scroll frame.
OverscrollBehaviorInfo mOverscrollBehavior;
// WARNING!!!!
//
// When adding new fields to ScrollMetadata, the following places should be

Просмотреть файл

@ -3859,6 +3859,7 @@ void AsyncPanZoomController::NotifyLayersUpdated(const ScrollMetadata& aScrollMe
mScrollMetadata.SetUsesContainerScrolling(aScrollMetadata.UsesContainerScrolling());
mFrameMetrics.SetIsScrollInfoLayer(aLayerMetrics.IsScrollInfoLayer());
mScrollMetadata.SetForceDisableApz(aScrollMetadata.IsApzForceDisabled());
mScrollMetadata.SetOverscrollBehavior(aScrollMetadata.GetOverscrollBehavior());
if (scrollOffsetUpdated) {
APZC_LOG("%p updating scroll offset from %s to %s\n", this,

Просмотреть файл

@ -78,6 +78,14 @@ struct ParamTraits<mozilla::layers::FrameMetrics::ScrollOffsetUpdateType>
mozilla::layers::FrameMetrics::sHighestScrollOffsetUpdateType>
{};
template <>
struct ParamTraits<mozilla::layers::OverscrollBehavior>
: public ContiguousEnumSerializerInclusive<
mozilla::layers::OverscrollBehavior,
mozilla::layers::OverscrollBehavior::Auto,
mozilla::layers::kHighestOverscrollBehavior>
{};
template<>
struct ParamTraits<mozilla::layers::LayerHandle>
{
@ -224,6 +232,27 @@ struct ParamTraits<mozilla::layers::ScrollSnapInfo>
}
};
template <>
struct ParamTraits<mozilla::layers::OverscrollBehaviorInfo>
{
// Not using PlainOldDataSerializer so we get enum validation
// for the members.
typedef mozilla::layers::OverscrollBehaviorInfo paramType;
static void Write(Message* aMsg, const paramType& aParam)
{
WriteParam(aMsg, aParam.mBehaviorX);
WriteParam(aMsg, aParam.mBehaviorY);
}
static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
{
return (ReadParam(aMsg, aIter, &aResult->mBehaviorX) &&
ReadParam(aMsg, aIter, &aResult->mBehaviorY));
}
};
template <>
struct ParamTraits<mozilla::layers::LayerClip>
{
@ -263,6 +292,7 @@ struct ParamTraits<mozilla::layers::ScrollMetadata>
WriteParam(aMsg, aParam.mIsLayersIdRoot);
WriteParam(aMsg, aParam.mUsesContainerScrolling);
WriteParam(aMsg, aParam.mForceDisableApz);
WriteParam(aMsg, aParam.mOverscrollBehavior);
}
static bool ReadContentDescription(const Message* aMsg, PickleIterator* aIter, paramType* aResult)
@ -289,7 +319,8 @@ struct ParamTraits<mozilla::layers::ScrollMetadata>
ReadBoolForBitfield(aMsg, aIter, aResult, &paramType::SetAllowVerticalScrollWithWheel) &&
ReadBoolForBitfield(aMsg, aIter, aResult, &paramType::SetIsLayersIdRoot) &&
ReadBoolForBitfield(aMsg, aIter, aResult, &paramType::SetUsesContainerScrolling) &&
ReadBoolForBitfield(aMsg, aIter, aResult, &paramType::SetForceDisableApz));
ReadBoolForBitfield(aMsg, aIter, aResult, &paramType::SetForceDisableApz) &&
ReadParam(aMsg, aIter, &aResult->mOverscrollBehavior));
}
};

Просмотреть файл

@ -256,6 +256,11 @@ struct BitFlagsEnumSerializer
* structure's members.
*
* Derive ParamTraits<T> from PlainOldDataSerializer<T> if T is POD.
*
* Note: For POD structures with enumeration fields, this will not do
* validation of the enum values the way serializing the fields
* individually would. Prefer serializing the fields individually
* in such cases.
*/
template <typename T>
struct PlainOldDataSerializer

Просмотреть файл

@ -9357,6 +9357,11 @@ nsLayoutUtils::ComputeScrollMetadata(nsIFrame* aForFrame,
metadata.SetUsesContainerScrolling(scrollableFrame->UsesContainerScrolling());
metadata.SetSnapInfo(scrollableFrame->GetScrollSnapInfo());
ScrollbarStyles scrollbarStyles = scrollableFrame->GetScrollbarStyles();
metadata.SetOverscrollBehavior(OverscrollBehaviorInfo::FromStyleConstants(
scrollbarStyles.mOverscrollBehaviorX,
scrollbarStyles.mOverscrollBehaviorY));
}
// If we have the scrollparent being the same as the scroll id, the