Bug 1031107 - Part 4: Union the display port dirty area in nsSubDocumentFrame. r=tn

This commit is contained in:
Matt Woodrow 2014-07-24 15:12:42 +12:00
Родитель 26e1f42909
Коммит 50d31b707c
2 изменённых файлов: 29 добавлений и 17 удалений

Просмотреть файл

@ -2433,13 +2433,18 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
// If we are a root scroll frame that has a display port we want to add
// scrollbars, they will be children of the scrollable layer, but they get
// adjusted by the APZC automatically.
bool addScrollBars = mIsRoot &&
nsLayoutUtils::GetDisplayPort(mOuter->GetContent()) &&
!aBuilder->IsForEventDelivery();
bool usingDisplayPort = nsLayoutUtils::GetDisplayPort(mOuter->GetContent());
bool addScrollBars = mIsRoot && usingDisplayPort && !aBuilder->IsForEventDelivery();
nsRect scrollbarDirty = aDirtyRect;
if (usingDisplayPort) {
// Make sure we include the scrollbars.
scrollbarDirty.Inflate(GetActualScrollbarSizes());
}
if (addScrollBars) {
// Add classic scrollbars.
AppendScrollPartsTo(aBuilder, aDirtyRect, aLists, createLayersForScrollbars,
AppendScrollPartsTo(aBuilder, scrollbarDirty, aLists, createLayersForScrollbars,
false);
}
@ -2451,23 +2456,13 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
if (addScrollBars) {
// Add overlay scrollbars.
AppendScrollPartsTo(aBuilder, aDirtyRect, aLists,
AppendScrollPartsTo(aBuilder, scrollbarDirty, aLists,
createLayersForScrollbars, true);
}
return;
}
// Now display the scrollbars and scrollcorner. These parts are drawn
// in the border-background layer, on top of our own background and
// borders and underneath borders and backgrounds of later elements
// in the tree.
// Note that this does not apply for overlay scrollbars; those are drawn
// in the positioned-elements layer on top of everything else by the call
// to AppendScrollPartsTo(..., true) further down.
AppendScrollPartsTo(aBuilder, aDirtyRect, aLists, createLayersForScrollbars,
false);
// Overflow clipping can never clip frames outside our subtree, so there
// is no need to worry about whether we are a moving frame that might clip
// non-moving frames.
@ -2514,6 +2509,22 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
}
}
nsRect scrollbarDirty = aDirtyRect;
if (usingDisplayport) {
// Make sure we include the scrollbars.
scrollbarDirty.Inflate(GetActualScrollbarSizes());
}
// Now display the scrollbars and scrollcorner. These parts are drawn
// in the border-background layer, on top of our own background and
// borders and underneath borders and backgrounds of later elements
// in the tree.
// Note that this does not apply for overlay scrollbars; those are drawn
// in the positioned-elements layer on top of everything else by the call
// to AppendScrollPartsTo(..., true) further down.
AppendScrollPartsTo(aBuilder, scrollbarDirty, aLists, createLayersForScrollbars,
false);
if (aBuilder->IsForImageVisibility()) {
// We expand the dirty rect to catch images just outside of the scroll port.
// We use the dirty rect instead of the whole scroll port to prevent
@ -2650,7 +2661,7 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
}
}
// Now display overlay scrollbars and the resizer, if we have one.
AppendScrollPartsTo(aBuilder, aDirtyRect, scrolledContent,
AppendScrollPartsTo(aBuilder, scrollbarDirty, scrolledContent,
createLayersForScrollbars, true);
scrolledContent.MoveTo(aLists);
}

Просмотреть файл

@ -408,7 +408,8 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
nsRect(nsPoint(0,0), nsLayoutUtils::CalculateCompositionSizeForFrame(rootScrollFrame)) :
dirty.Intersect(nsRect(nsPoint(0,0), subdocRootFrame->GetSize()));
nsRect displayPort;
if (nsLayoutUtils::GetOrMaybeCreateDisplayPort(
if (!aBuilder->IsForEventDelivery() &&
nsLayoutUtils::GetOrMaybeCreateDisplayPort(
*aBuilder, rootScrollFrame, displayportBase, &displayPort)) {
haveDisplayPort = true;
dirty = displayPort;