Bug 1166301 - Store a flag on Layer to tell fixed background layers apart from fixed position layers. r=mattwoodrow

This commit is contained in:
Botond Ballo 2015-09-04 17:26:33 -04:00
parent 088b8a66ec
commit a5a6088b91
9 changed files with 37 additions and 14 deletions

View File

@ -1737,9 +1737,10 @@ Layer::PrintInfo(std::stringstream& aStream, const char* aPrefix)
}
if (GetIsFixedPosition()) {
LayerPoint anchor = GetFixedPositionAnchor();
aStream << nsPrintfCString(" [isFixedPosition scrollId=%lld anchor=%s]",
aStream << nsPrintfCString(" [isFixedPosition scrollId=%lld anchor=%s%s]",
GetFixedPositionScrollContainerId(),
ToString(anchor).c_str()).get();
ToString(anchor).c_str(),
IsClipFixed() ? "" : " scrollingClip").get();
}
if (GetIsStickyPosition()) {
aStream << nsPrintfCString(" [isStickyPosition scrollId=%d outer=%f,%f %fx%f "

View File

@ -1161,19 +1161,27 @@ public:
* point, that is, the point which remains in the same position when
* compositing the layer tree with a transformation (such as when
* asynchronously scrolling and zooming).
*
* - |aIsClipFixed| is true if this layer's clip rect and mask layer
* should also remain fixed during async scrolling/animations.
* This is the case for fixed position layers, but not for
* fixed background layers.
*/
void SetFixedPositionData(FrameMetrics::ViewID aScrollId,
const LayerPoint& aAnchor)
const LayerPoint& aAnchor,
bool aIsClipFixed)
{
if (!mFixedPositionData ||
mFixedPositionData->mScrollId != aScrollId ||
mFixedPositionData->mAnchor != aAnchor) {
mFixedPositionData->mAnchor != aAnchor ||
mFixedPositionData->mIsClipFixed != aIsClipFixed) {
MOZ_LAYERS_LOG_IF_SHADOWABLE(this, ("Layer::Mutated(%p) FixedPositionData", this));
if (!mFixedPositionData) {
mFixedPositionData = MakeUnique<FixedPositionData>();
}
mFixedPositionData->mScrollId = aScrollId;
mFixedPositionData->mAnchor = aAnchor;
mFixedPositionData->mIsClipFixed = aIsClipFixed;
Mutated();
}
}
@ -1267,6 +1275,7 @@ public:
bool GetIsStickyPosition() { return mStickyPositionData; }
FrameMetrics::ViewID GetFixedPositionScrollContainerId() { return mFixedPositionData ? mFixedPositionData->mScrollId : FrameMetrics::NULL_SCROLL_ID; }
LayerPoint GetFixedPositionAnchor() { return mFixedPositionData ? mFixedPositionData->mAnchor : LayerPoint(); }
bool IsClipFixed() { return mFixedPositionData ? mFixedPositionData->mIsClipFixed : false; }
FrameMetrics::ViewID GetStickyScrollContainerId() { return mStickyPositionData->mScrollId; }
const LayerRect& GetStickyScrollRangeOuter() { return mStickyPositionData->mOuter; }
const LayerRect& GetStickyScrollRangeInner() { return mStickyPositionData->mInner; }
@ -1770,6 +1779,7 @@ protected:
struct FixedPositionData {
FrameMetrics::ViewID mScrollId;
LayerPoint mAnchor;
bool mIsClipFixed;
};
UniquePtr<FixedPositionData> mFixedPositionData;
struct StickyPositionData {

View File

@ -331,7 +331,8 @@ LayerTransactionParent::RecvUpdate(InfallibleTArray<Edit>&& cset,
layer->SetIsFixedPosition(common.isFixedPosition());
if (common.isFixedPosition()) {
layer->SetFixedPositionData(common.fixedPositionScrollContainerId(),
common.fixedPositionAnchor());
common.fixedPositionAnchor(),
common.isClipFixed());
}
if (common.isStickyPosition()) {
layer->SetStickyPositionData(common.stickyScrollContainerId(),

View File

@ -216,6 +216,7 @@ struct CommonLayerAttributes {
bool isFixedPosition;
uint64_t fixedPositionScrollContainerId;
LayerPoint fixedPositionAnchor;
bool isClipFixed;
bool isStickyPosition;
uint64_t stickyScrollContainerId;
LayerRect stickyScrollRangeOuter;

View File

@ -583,6 +583,7 @@ ShadowLayerForwarder::EndTransaction(InfallibleTArray<EditReply>* aReplies,
if (mutant->GetIsFixedPosition()) {
common.fixedPositionScrollContainerId() = mutant->GetFixedPositionScrollContainerId();
common.fixedPositionAnchor() = mutant->GetFixedPositionAnchor();
common.isClipFixed() = mutant->IsClipFixed();
}
common.isStickyPosition() = mutant->GetIsStickyPosition();
if (mutant->GetIsStickyPosition()) {

View File

@ -1228,7 +1228,8 @@ protected:
* Set fixed-pos layer metadata on aLayer according to the data for aFixedPosFrame.
*/
void SetFixedPositionLayerData(Layer* aLayer,
const nsIFrame* aFixedPosFrame);
const nsIFrame* aFixedPosFrame,
bool aIsClipFixed);
/**
* Returns true if aItem's opaque area (in aOpaque) covers the entire
@ -2929,7 +2930,8 @@ ContainerState::FindFixedPosFrameForLayerData(const nsIFrame* aAnimatedGeometryR
void
ContainerState::SetFixedPositionLayerData(Layer* aLayer,
const nsIFrame* aFixedPosFrame)
const nsIFrame* aFixedPosFrame,
bool aIsClipFixed)
{
aLayer->SetIsFixedPosition(aFixedPosFrame != nullptr);
if (!aFixedPosFrame) {
@ -2960,7 +2962,8 @@ ContainerState::SetFixedPositionLayerData(Layer* aLayer,
anchorRect.MoveTo(viewportFrame->GetOffsetToCrossDoc(mContainerReferenceFrame));
nsLayoutUtils::SetFixedPositionLayerData(aLayer,
viewportFrame, anchorRect, aFixedPosFrame, presContext, mParameters);
viewportFrame, anchorRect, aFixedPosFrame, presContext, mParameters,
aIsClipFixed);
}
static bool
@ -3229,7 +3232,8 @@ void ContainerState::FinishPaintedLayerData(PaintedLayerData& aData, FindOpaqueB
}
layer->SetContentFlags(flags);
SetFixedPositionLayerData(layer, data->mFixedPosFrameForLayerData);
SetFixedPositionLayerData(layer, data->mFixedPosFrameForLayerData,
!data->mSingleItemFixedToViewport);
PaintedLayerData* containingPaintedLayerData =
mLayerBuilder->GetContainingPaintedLayerData();
@ -3981,7 +3985,7 @@ ContainerState::ProcessDisplayItems(nsDisplayList* aList)
const nsIFrame* fixedPosFrame =
FindFixedPosFrameForLayerData(animatedGeometryRoot, shouldFixToViewport);
SetFixedPositionLayerData(ownLayer, fixedPosFrame);
SetFixedPositionLayerData(ownLayer, fixedPosFrame, !shouldFixToViewport);
nsRect invalid;
if (item->IsInvalid(invalid)) {

View File

@ -4404,7 +4404,7 @@ nsDisplayStickyPosition::BuildLayer(nsDisplayListBuilder* aBuilder,
nsLayoutUtils::SetFixedPositionLayerData(layer, scrollFrame,
nsRect(scrollFrame->GetOffsetToCrossDoc(ReferenceFrame()), scrollFrameSize),
mFrame, presContext, aContainerParameters);
mFrame, presContext, aContainerParameters, /* clip is fixed = */ true);
ViewID scrollId = nsLayoutUtils::FindOrCreateIDFor(
stickyScrollContainer->ScrollFrame()->GetScrolledFrame()->GetContent());

View File

@ -1737,7 +1737,8 @@ nsLayoutUtils::SetFixedPositionLayerData(Layer* aLayer,
const nsRect& aAnchorRect,
const nsIFrame* aFixedPosFrame,
nsPresContext* aPresContext,
const ContainerLayerParameters& aContainerParameters) {
const ContainerLayerParameters& aContainerParameters,
bool aIsClipFixed) {
// Find out the rect of the viewport frame relative to the reference frame.
// This, in conjunction with the container scale, will correspond to the
// coordinate-space of the built layer.
@ -1791,7 +1792,7 @@ nsLayoutUtils::SetFixedPositionLayerData(Layer* aLayer,
id = FindOrCreateIDFor(content);
}
}
aLayer->SetFixedPositionData(id, anchor);
aLayer->SetFixedPositionData(id, anchor, aIsClipFixed);
}
bool

View File

@ -496,12 +496,16 @@ public:
* properties (top, left, right, bottom) are auto. aAnchorRect is in the
* coordinate space of aLayer's container layer (i.e. relative to the reference
* frame of the display item which is building aLayer's container layer).
* aIsClipFixed is true if the layer's clip rect should also remain fixed
* during async-scrolling (true for fixed position elements, false for
* fixed backgrounds).
*/
static void SetFixedPositionLayerData(Layer* aLayer, const nsIFrame* aViewportFrame,
const nsRect& aAnchorRect,
const nsIFrame* aFixedPosFrame,
nsPresContext* aPresContext,
const ContainerLayerParameters& aContainerParameters);
const ContainerLayerParameters& aContainerParameters,
bool aIsClipFixed);
/**
* Return true if aPresContext's viewport has a displayport.