From 6f2be640b7b52fd57d4f3da51e5b33b75c458759 Mon Sep 17 00:00:00 2001 From: Chris Lord Date: Thu, 30 Aug 2012 08:31:16 +0100 Subject: [PATCH] Bug 786672 - Use the scrolled frame for nsDisplayScrollLayer when finding the active scrolled root. r=roc The underlying frame of an nsDisplayScrollLayer can change and end up returning different values when finding the active scrolled root. Instead of relying on display-item ordering/merging, get the scrolled frame from the item (which was already storing it). --- layout/base/FrameLayerBuilder.cpp | 6 ++++++ layout/base/nsDisplayList.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/layout/base/FrameLayerBuilder.cpp b/layout/base/FrameLayerBuilder.cpp index b45c6d9f7d6f..10170f5023f1 100644 --- a/layout/base/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -1807,6 +1807,12 @@ ContainerState::ProcessDisplayItems(const nsDisplayList& aList, nsLayoutUtils::GetActiveScrolledRootFor(mContainerFrame, mBuilder->ReferenceFrame()); forceInactive = true; + } else if (item->GetType() == nsDisplayItem::TYPE_SCROLL_LAYER) { + nsDisplayScrollLayer* scrollLayerItem = + static_cast(item); + activeScrolledRoot = + nsLayoutUtils::GetActiveScrolledRootFor(scrollLayerItem->GetScrolledFrame(), + mBuilder->ReferenceFrame()); } else { activeScrolledRoot = nsLayoutUtils::GetActiveScrolledRootFor(item, mBuilder); } diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h index ecead3b09b4a..38e6feabe58f 100644 --- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -2038,6 +2038,8 @@ public: intptr_t GetScrollLayerCount(); intptr_t RemoveScrollLayerCount(); + virtual nsIFrame* GetScrolledFrame() { return mScrolledFrame; } + private: nsIFrame* mScrollFrame; nsIFrame* mScrolledFrame;