зеркало из https://github.com/mozilla/gecko-dev.git
Bug 951793 - Store the overscroll behavior in ScrollMetadata and propagate it to APZ. r=mstange
MozReview-Commit-ID: J7Vkd941QxK
This commit is contained in:
Родитель
4554e0cd08
Коммит
41aac0b97c
|
@ -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, ¶mType::SetAllowVerticalScrollWithWheel) &&
|
||||
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetIsLayersIdRoot) &&
|
||||
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetUsesContainerScrolling) &&
|
||||
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetForceDisableApz));
|
||||
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::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
|
||||
|
|
Загрузка…
Ссылка в новой задаче