Bug 1416073 - Avoid calling the expensive ComputeScrollMetadata function if we already computed that metadata before. r=jrmuizel

MozReview-Commit-ID: 5SwAEA4Wpqw

--HG--
extra : rebase_source : 1c717c3f0cfb1c5a94970d5d7cc267ee9570c0ad
This commit is contained in:
Kartikaya Gupta 2017-11-09 23:18:39 -05:00
parent f9b153f761
commit 0b55cc54f3
3 changed files with 16 additions and 9 deletions

View File

@ -81,7 +81,7 @@ WebRenderCommandBuilder::BuildWebRenderCommands(wr::DisplayListBuilder& aBuilder
mLayerScrollData.emplace_back();
mLayerScrollData.back().InitializeRoot(mLayerScrollData.size() - 1);
auto callback = [&aScrollData](FrameMetrics::ViewID aScrollId) -> bool {
return aScrollData.HasMetadataFor(aScrollId);
return aScrollData.HasMetadataFor(aScrollId).isSome();
};
if (Maybe<ScrollMetadata> rootMetadata = nsLayoutUtils::GetRootMetadata(
aDisplayListBuilder, mManager, ContainerLayerParameters(), callback)) {

View File

@ -54,11 +54,17 @@ WebRenderLayerScrollData::Initialize(WebRenderScrollData& aOwner,
asr && asr != aStopAtAsr;
asr = asr->mParent) {
MOZ_ASSERT(aOwner.GetManager());
Maybe<ScrollMetadata> metadata = asr->mScrollableFrame->ComputeScrollMetadata(
nullptr, aOwner.GetManager(), aItem->ReferenceFrame(),
ContainerLayerParameters(), nullptr);
MOZ_ASSERT(metadata);
mScrollIds.AppendElement(aOwner.AddMetadata(metadata.ref()));
FrameMetrics::ViewID scrollId = nsLayoutUtils::ViewIDForASR(asr);
if (Maybe<size_t> index = aOwner.HasMetadataFor(scrollId)) {
mScrollIds.AppendElement(index.ref());
} else {
Maybe<ScrollMetadata> metadata = asr->mScrollableFrame->ComputeScrollMetadata(
nullptr, aOwner.GetManager(), aItem->ReferenceFrame(),
ContainerLayerParameters(), nullptr);
MOZ_ASSERT(metadata);
MOZ_ASSERT(metadata->GetMetrics().GetScrollId() == scrollId);
mScrollIds.AppendElement(aOwner.AddMetadata(metadata.ref()));
}
}
}
@ -200,10 +206,11 @@ WebRenderScrollData::GetScrollMetadata(size_t aIndex) const
return mScrollMetadatas[aIndex];
}
bool
Maybe<size_t>
WebRenderScrollData::HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const
{
return mScrollIdMap.find(aScrollId) != mScrollIdMap.end();
auto it = mScrollIdMap.find(aScrollId);
return (it == mScrollIdMap.end() ? Nothing() : Some(it->second));
}
void

View File

@ -151,7 +151,7 @@ public:
const WebRenderLayerScrollData* GetLayerData(size_t aIndex) const;
const ScrollMetadata& GetScrollMetadata(size_t aIndex) const;
bool HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const;
Maybe<size_t> HasMetadataFor(const FrameMetrics::ViewID& aScrollId) const;
const FocusTarget& GetFocusTarget() const { return mFocusTarget; }
void SetFocusTarget(const FocusTarget& aFocusTarget);