mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Make sure XUL windows have a top-level APZC. (bug 1130645, r=roc)
This commit is contained in:
parent
024881b68a
commit
e13516ed21
@ -696,6 +696,7 @@ static void UnmarkFrameForDisplay(nsIFrame* aFrame) {
|
||||
/* static */ FrameMetrics
|
||||
nsDisplayScrollLayer::ComputeFrameMetrics(nsIFrame* aForFrame,
|
||||
nsIFrame* aScrollFrame,
|
||||
nsIContent* aContent,
|
||||
const nsIFrame* aReferenceFrame,
|
||||
Layer* aLayer,
|
||||
ViewID aScrollParentId,
|
||||
@ -711,20 +712,19 @@ nsDisplayScrollLayer::ComputeFrameMetrics(nsIFrame* aForFrame,
|
||||
metrics.SetViewport(CSSRect::FromAppUnits(aViewport));
|
||||
|
||||
ViewID scrollId = FrameMetrics::NULL_SCROLL_ID;
|
||||
nsIContent* content = aScrollFrame ? aScrollFrame->GetContent() : nullptr;
|
||||
if (content) {
|
||||
scrollId = nsLayoutUtils::FindOrCreateIDFor(content);
|
||||
if (aContent) {
|
||||
scrollId = nsLayoutUtils::FindOrCreateIDFor(aContent);
|
||||
nsRect dp;
|
||||
if (nsLayoutUtils::GetDisplayPort(content, &dp)) {
|
||||
if (nsLayoutUtils::GetDisplayPort(aContent, &dp)) {
|
||||
metrics.SetDisplayPort(CSSRect::FromAppUnits(dp));
|
||||
nsLayoutUtils::LogTestDataForPaint(aLayer->Manager(), scrollId, "displayport",
|
||||
metrics.GetDisplayPort());
|
||||
}
|
||||
if (nsLayoutUtils::GetCriticalDisplayPort(content, &dp)) {
|
||||
if (nsLayoutUtils::GetCriticalDisplayPort(aContent, &dp)) {
|
||||
metrics.SetCriticalDisplayPort(CSSRect::FromAppUnits(dp));
|
||||
}
|
||||
DisplayPortMarginsPropertyData* marginsData =
|
||||
static_cast<DisplayPortMarginsPropertyData*>(content->GetProperty(nsGkAtoms::DisplayPortMargins));
|
||||
static_cast<DisplayPortMarginsPropertyData*>(aContent->GetProperty(nsGkAtoms::DisplayPortMargins));
|
||||
if (marginsData) {
|
||||
metrics.SetDisplayPortMargins(marginsData->mMargins);
|
||||
}
|
||||
@ -1633,15 +1633,30 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(nsDisplayListBuilder* aB
|
||||
aBuilder->IsBuildingLayerEventRegions() &&
|
||||
nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(presShell));
|
||||
|
||||
if (gfxPrefs::LayoutUseContainersForRootFrames()) {
|
||||
// If we're using containerless scrolling, there is still one case where we
|
||||
// want the root container layer to have metrics. If the parent process is
|
||||
// using XUL windows, there is no root scrollframe, and without explicitly
|
||||
// creating metrics there will be no guaranteed top-level APZC.
|
||||
if (gfxPrefs::LayoutUseContainersForRootFrames() ||
|
||||
(XRE_IsParentProcess() && !presShell->GetRootScrollFrame()))
|
||||
{
|
||||
bool isRoot = presContext->IsRootContentDocument();
|
||||
|
||||
nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame();
|
||||
|
||||
nsRect viewport(aBuilder->ToReferenceFrame(frame), frame->GetSize());
|
||||
|
||||
// If there is no root scroll frame, pick the document element instead.
|
||||
nsIFrame* scrollFrame = presShell->GetRootScrollFrame();
|
||||
nsIContent* content = nullptr;
|
||||
if (scrollFrame) {
|
||||
content = scrollFrame->GetContent();
|
||||
} else if (document) {
|
||||
content = document->GetDocumentElement();
|
||||
}
|
||||
|
||||
root->SetFrameMetrics(
|
||||
nsDisplayScrollLayer::ComputeFrameMetrics(frame, rootScrollFrame,
|
||||
nsDisplayScrollLayer::ComputeFrameMetrics(frame,
|
||||
presShell->GetRootScrollFrame(),
|
||||
content,
|
||||
aBuilder->FindReferenceFrameFor(frame),
|
||||
root, FrameMetrics::NULL_SCROLL_ID, viewport,
|
||||
isRoot, containerParameters));
|
||||
@ -4118,9 +4133,10 @@ nsDisplaySubDocument::ComputeFrameMetrics(Layer* aLayer,
|
||||
mFrame->GetOffsetToCrossDoc(ReferenceFrame());
|
||||
|
||||
return MakeUnique<FrameMetrics>(
|
||||
nsDisplayScrollLayer::ComputeFrameMetrics(mFrame, rootScrollFrame, ReferenceFrame(),
|
||||
aLayer, mScrollParentId, viewport,
|
||||
isRootContentDocument, params));
|
||||
nsDisplayScrollLayer::ComputeFrameMetrics(
|
||||
mFrame, rootScrollFrame, rootScrollFrame->GetContent(), ReferenceFrame(),
|
||||
aLayer, mScrollParentId, viewport,
|
||||
isRootContentDocument, params));
|
||||
}
|
||||
|
||||
static bool
|
||||
@ -4453,8 +4469,10 @@ nsDisplayScrollLayer::ComputeFrameMetrics(Layer* aLayer,
|
||||
mScrollFrame->GetOffsetToCrossDoc(ReferenceFrame());
|
||||
|
||||
return UniquePtr<FrameMetrics>(new FrameMetrics(
|
||||
ComputeFrameMetrics(mScrolledFrame, mScrollFrame, ReferenceFrame(), aLayer,
|
||||
mScrollParentId, viewport, false, params)));
|
||||
ComputeFrameMetrics(
|
||||
mScrolledFrame, mScrollFrame, mScrollFrame->GetContent(),
|
||||
ReferenceFrame(), aLayer,
|
||||
mScrollParentId, viewport, false, params)));
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -3175,6 +3175,7 @@ public:
|
||||
|
||||
static FrameMetrics ComputeFrameMetrics(nsIFrame* aForFrame,
|
||||
nsIFrame* aScrollFrame,
|
||||
nsIContent* aContent,
|
||||
const nsIFrame* aReferenceFrame,
|
||||
Layer* aLayer,
|
||||
ViewID aScrollParentId,
|
||||
|
@ -867,6 +867,11 @@ GetDisplayPortFromMarginsData(nsIContent* aContent,
|
||||
// We want the scroll frame, the root scroll frame differs from all
|
||||
// others in that the primary frame is not the scroll frame.
|
||||
frame = frame->PresContext()->PresShell()->GetRootScrollFrame();
|
||||
if (!frame) {
|
||||
// If there is no root scrollframe, just exit.
|
||||
return ApplyRectMultiplier(base, aMultiplier);
|
||||
}
|
||||
|
||||
isRoot = true;
|
||||
}
|
||||
|
||||
|
@ -3177,7 +3177,8 @@ ScrollFrameHelper::ComputeFrameMetrics(Layer* aLayer,
|
||||
bool isRoot = mIsRoot && mOuter->PresContext()->IsRootContentDocument();
|
||||
|
||||
*aOutput->AppendElement() =
|
||||
nsDisplayScrollLayer::ComputeFrameMetrics(mScrolledFrame, mOuter,
|
||||
nsDisplayScrollLayer::ComputeFrameMetrics(
|
||||
mScrolledFrame, mOuter, mOuter->GetContent(),
|
||||
aContainerReferenceFrame, aLayer, mScrollParentID,
|
||||
scrollport, isRoot, aParameters);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user