Bug 1219296 - Ship scroll snap information to the compositor. r=kats
MozReview-Commit-ID: 2aCaAEC5Csu
--- a/gfx/ipc/GfxMessageUtils.h
+++ b/gfx/ipc/GfxMessageUtils.h
@@ -772,30 +772,58 @@ struct ParamTraits<mozilla::layers::Fram
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetAllowVerticalScrollWithWheel) &&
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetIsLayersIdRoot) &&
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetUsesContainerScrolling) &&
ReadBoolForBitfield(aMsg, aIter, aResult, ¶mType::SetIsScrollInfoLayer));
}
};
template <>
+struct ParamTraits<mozilla::layers::ScrollSnapInfo>
+{
+ typedef mozilla::layers::ScrollSnapInfo paramType;
+
+ static void Write(Message* aMsg, const paramType& aParam)
+ {
+ WriteParam(aMsg, aParam.mScrollSnapTypeX);
+ WriteParam(aMsg, aParam.mScrollSnapTypeY);
+ WriteParam(aMsg, aParam.mScrollSnapIntervalX);
+ WriteParam(aMsg, aParam.mScrollSnapIntervalY);
+ WriteParam(aMsg, aParam.mScrollSnapDestination);
+ WriteParam(aMsg, aParam.mScrollSnapCoordinates);
+ }
+
+ static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
+ {
+ return (ReadParam(aMsg, aIter, &aResult->mScrollSnapTypeX) &&
+ ReadParam(aMsg, aIter, &aResult->mScrollSnapTypeY) &&
+ ReadParam(aMsg, aIter, &aResult->mScrollSnapIntervalX) &&
+ ReadParam(aMsg, aIter, &aResult->mScrollSnapIntervalY) &&
+ ReadParam(aMsg, aIter, &aResult->mScrollSnapDestination) &&
+ ReadParam(aMsg, aIter, &aResult->mScrollSnapCoordinates));
+ }
+};
+
+template <>
struct ParamTraits<mozilla::layers::ScrollMetadata>
{
typedef mozilla::layers::ScrollMetadata paramType;
static void Write(Message* aMsg, const paramType& aParam)
{
WriteParam(aMsg, aParam.mMetrics);
+ WriteParam(aMsg, aParam.mSnapInfo);
WriteParam(aMsg, aParam.mMaskLayerIndex);
WriteParam(aMsg, aParam.mClipRect);
}
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
{
return (ReadParam(aMsg, aIter, &aResult->mMetrics) &&
+ ReadParam(aMsg, aIter, &aResult->mSnapInfo) &&
ReadParam(aMsg, aIter, &aResult->mMaskLayerIndex) &&
ReadParam(aMsg, aIter, &aResult->mClipRect));
}
};
template<>
struct ParamTraits<mozilla::layers::TextureFactoryIdentifier>
{
--- a/gfx/layers/FrameMetrics.h
+++ b/gfx/layers/FrameMetrics.h
@@ -786,22 +786,24 @@ struct ScrollSnapInfo {
*/
struct ScrollMetadata {
friend struct IPC::ParamTraits<mozilla::layers::ScrollMetadata>;
public:
static StaticAutoPtr<const ScrollMetadata> sNullMetadata; // We sometimes need an empty metadata
ScrollMetadata()
: mMetrics()
+ , mSnapInfo()
, mMaskLayerIndex()
, mClipRect()
{}
bool operator==(const ScrollMetadata& aOther) const
{
+ // TODO(botond): Should we include mSnapInfo in the comparison?
return mMetrics == aOther.mMetrics &&
mMaskLayerIndex == aOther.mMaskLayerIndex &&
mClipRect == aOther.mClipRect;
}
bool operator!=(const ScrollMetadata& aOther) const
{
return !operator==(aOther);
@@ -813,16 +815,21 @@ public:
def.mMetrics.SetPresShellId(mMetrics.GetPresShellId());
return (def == *this);
}
FrameMetrics& GetMetrics() { return mMetrics; }
const FrameMetrics& GetMetrics() const { return mMetrics; }
+ void SetSnapInfo(ScrollSnapInfo&& aSnapInfo) {
+ mSnapInfo = Move(aSnapInfo);
+ }
+ const ScrollSnapInfo& GetSnapInfo() const { return mSnapInfo; }
+
void SetMaskLayerIndex(const Maybe<size_t>& aIndex) {
mMaskLayerIndex = aIndex;
}
const Maybe<size_t>& GetMaskLayerIndex() const {
return mMaskLayerIndex;
}
void SetClipRect(const Maybe<ParentLayerIntRect>& aClipRect)
@@ -837,16 +844,19 @@ public:
return mClipRect.isSome();
}
const ParentLayerIntRect& ClipRect() const {
return mClipRect.ref();
}
private:
FrameMetrics mMetrics;
+ // Information used to determine where to snap to for a given scroll.
+ ScrollSnapInfo mSnapInfo;
+
// An extra clip mask layer to use when compositing a layer with this
// FrameMetrics. This is an index into the MetricsMaskLayers array on
// the Layer.
Maybe<size_t> mMaskLayerIndex;
// The clip rect to use when compositing a layer with this FrameMetrics.
Maybe<ParentLayerIntRect> mClipRect;
};
--- a/gfx/layers/apz/src/AsyncPanZoomController.cpp
+++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp
@@ -3430,16 +3430,17 @@ void AsyncPanZoomController::NotifyLayer
}
mFrameMetrics.SetCompositionBounds(aLayerMetrics.GetCompositionBounds());
mFrameMetrics.SetRootCompositionSize(aLayerMetrics.GetRootCompositionSize());
mFrameMetrics.SetPresShellResolution(aLayerMetrics.GetPresShellResolution());
mFrameMetrics.SetCumulativeResolution(aLayerMetrics.GetCumulativeResolution());
mFrameMetrics.SetHasScrollgrab(aLayerMetrics.GetHasScrollgrab());
mFrameMetrics.SetLineScrollAmount(aLayerMetrics.GetLineScrollAmount());
mFrameMetrics.SetPageScrollAmount(aLayerMetrics.GetPageScrollAmount());
+ mScrollMetadata.SetSnapInfo(ScrollSnapInfo(aScrollMetadata.GetSnapInfo()));
mScrollMetadata.SetClipRect(aScrollMetadata.GetClipRect());
mScrollMetadata.SetMaskLayerIndex(aScrollMetadata.GetMaskLayerIndex());
mFrameMetrics.SetIsLayersIdRoot(aLayerMetrics.IsLayersIdRoot());
mFrameMetrics.SetUsesContainerScrolling(aLayerMetrics.UsesContainerScrolling());
mFrameMetrics.SetIsScrollInfoLayer(aLayerMetrics.IsScrollInfoLayer());
if (scrollOffsetUpdated) {
APZC_LOG("%p updating scroll offset from %s to %s\n", this,
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -8661,16 +8661,18 @@ nsLayoutUtils::ComputeScrollMetadata(nsI
if (!aScrollFrame->GetParent() ||
EventStateManager::CanVerticallyScrollFrameWithWheel(aScrollFrame->GetParent()))
{
metrics.SetAllowVerticalScrollWithWheel(true);
}
metrics.SetUsesContainerScrolling(scrollableFrame->UsesContainerScrolling());
+
+ metadata.SetSnapInfo(scrollableFrame->GetScrollSnapInfo());
}
// If we have the scrollparent being the same as the scroll id, the
// compositor-side code could get into an infinite loop while building the
// overscroll handoff chain.
MOZ_ASSERT(aScrollParentId == FrameMetrics::NULL_SCROLL_ID || scrollId != aScrollParentId);
metrics.SetScrollId(scrollId);
metrics.SetIsRootContent(aIsRootContent);
--- a/layout/generic/nsGfxScrollFrame.h
+++ b/layout/generic/nsGfxScrollFrame.h
@@ -1008,16 +1008,20 @@ public:
}
void SetScrollableByAPZ(bool aScrollable) override {
mHelper.SetScrollableByAPZ(aScrollable);
}
void SetZoomableByAPZ(bool aZoomable) override {
mHelper.SetZoomableByAPZ(aZoomable);
}
+ ScrollSnapInfo GetScrollSnapInfo() const override {
+ return mHelper.GetScrollSnapInfo();
+ }
+
#ifdef DEBUG_FRAME_DUMP
virtual nsresult GetFrameName(nsAString& aResult) const override;
#endif
#ifdef ACCESSIBILITY
virtual mozilla::a11y::AccType AccessibleType() override;
#endif
@@ -1427,16 +1431,20 @@ public:
}
virtual bool GetDisplayPortAtLastApproximateFrameVisibilityUpdate(nsRect* aDisplayPort) override {
return mHelper.GetDisplayPortAtLastApproximateFrameVisibilityUpdate(aDisplayPort);
}
void TriggerDisplayPortExpiration() override {
mHelper.TriggerDisplayPortExpiration();
}
+ ScrollSnapInfo GetScrollSnapInfo() const override {
+ return mHelper.GetScrollSnapInfo();
+ }
+
#ifdef DEBUG_FRAME_DUMP
virtual nsresult GetFrameName(nsAString& aResult) const override;
#endif
protected:
nsXULScrollFrame(nsStyleContext* aContext, bool aIsRoot,
bool aClipAllDescendants);
--- a/layout/generic/nsIScrollableFrame.h
+++ b/layout/generic/nsIScrollableFrame.h
@@ -43,16 +43,17 @@ class Layer;
* APIs for examining scroll state, observing changes to scroll state,
* and triggering scrolling.
*/
class nsIScrollableFrame : public nsIScrollbarMediator {
public:
typedef mozilla::CSSIntPoint CSSIntPoint;
typedef mozilla::ContainerLayerParameters ContainerLayerParameters;
typedef mozilla::layers::FrameMetrics FrameMetrics;
+ typedef mozilla::layers::ScrollSnapInfo ScrollSnapInfo;
NS_DECL_QUERYFRAME_TARGET(nsIScrollableFrame)
/**
* Get the frame for the content that we are scrolling within
* this scrollable frame.
*/
virtual nsIFrame* GetScrolledFrame() const = 0;
@@ -465,11 +466,16 @@ public:
virtual bool GetDisplayPortAtLastApproximateFrameVisibilityUpdate(nsRect* aDisplayPort) = 0;
/**
* This is called when a descendant scrollframe's has its displayport expired.
* This function will check to see if this scrollframe may safely expire its
* own displayport and schedule a timer to do that if it is safe.
*/
virtual void TriggerDisplayPortExpiration() = 0;
+
+ /**
+ * Returns information required to determine where to snap to after a scroll.
+ */
+ virtual ScrollSnapInfo GetScrollSnapInfo() const = 0;
};
#endif