Bug 129941. Don't create scrollframes for blockframes (except inline blocks) while printing, and make such blockframes clip their contents instead. r=dbaron
This commit is contained in:
@@ -4354,14 +4354,24 @@ nsCSSFrameConstructor::FindDisplayData(const nsStyleDisplay* aDisplay,
|
|||||||
PropagateScrollToViewport() == aContent;
|
PropagateScrollToViewport() == aContent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NS_ASSERTION(!propagatedScrollToViewport ||
|
||||||
|
!mPresShell->GetPresContext()->IsPaginated(),
|
||||||
|
"Shouldn't propagate scroll in paginated contexts");
|
||||||
|
|
||||||
// If the frame is a block-level frame and is scrollable, then wrap it
|
// If the frame is a block-level frame and is scrollable, then wrap it
|
||||||
// in a scroll frame.
|
// in a scroll frame. Except we don't want to do that for paginated contexts
|
||||||
|
// for frames that are block-outside.
|
||||||
|
// The condition on skipping scrollframe construction in the
|
||||||
|
// paginated case needs to match code in ConstructNonScrollableBlock
|
||||||
|
// and in nsFrame::ApplyPaginatedOverflowClipping.
|
||||||
// XXX Ignore tables for the time being
|
// XXX Ignore tables for the time being
|
||||||
// XXXbz it would be nice to combine this with the other block
|
// XXXbz it would be nice to combine this with the other block
|
||||||
// case... Think about how do do this?
|
// case... Think about how do do this?
|
||||||
if (aDisplay->IsBlockInside() &&
|
if (aDisplay->IsBlockInside() &&
|
||||||
aDisplay->IsScrollableOverflow() &&
|
aDisplay->IsScrollableOverflow() &&
|
||||||
!propagatedScrollToViewport) {
|
!propagatedScrollToViewport &&
|
||||||
|
(!mPresShell->GetPresContext()->IsPaginated() ||
|
||||||
|
!aDisplay->IsBlockOutside())) {
|
||||||
static const FrameConstructionData sScrollableBlockData =
|
static const FrameConstructionData sScrollableBlockData =
|
||||||
FULL_CTOR_FCDATA(0, &nsCSSFrameConstructor::ConstructScrollableBlock);
|
FULL_CTOR_FCDATA(0, &nsCSSFrameConstructor::ConstructScrollableBlock);
|
||||||
return &sScrollableBlockData;
|
return &sScrollableBlockData;
|
||||||
@@ -4489,7 +4499,18 @@ nsCSSFrameConstructor::ConstructNonScrollableBlock(nsFrameConstructorState& aSta
|
|||||||
|
|
||||||
if (aDisplay->IsAbsolutelyPositioned() ||
|
if (aDisplay->IsAbsolutelyPositioned() ||
|
||||||
aDisplay->IsFloating() ||
|
aDisplay->IsFloating() ||
|
||||||
NS_STYLE_DISPLAY_INLINE_BLOCK == aDisplay->mDisplay) {
|
NS_STYLE_DISPLAY_INLINE_BLOCK == aDisplay->mDisplay ||
|
||||||
|
// This check just needs to be the same as the check for using scrollable
|
||||||
|
// blocks in FindDisplayData and the check for clipping in
|
||||||
|
// nsFrame::ApplyPaginatedOverflowClipping; we want a block formatting
|
||||||
|
// context root in paginated contexts for every block that would be
|
||||||
|
// scrollable in a non-paginated context. Note that IsPaginated()
|
||||||
|
// implies that no propagation to viewport has taken place, so we don't
|
||||||
|
// need to check for propagation here.
|
||||||
|
(mPresShell->GetPresContext()->IsPaginated() &&
|
||||||
|
aDisplay->IsBlockInside() &&
|
||||||
|
aDisplay->IsScrollableOverflow() &&
|
||||||
|
aDisplay->IsBlockOutside())) {
|
||||||
*aNewFrame = NS_NewBlockFormattingContext(mPresShell, styleContext);
|
*aNewFrame = NS_NewBlockFormattingContext(mPresShell, styleContext);
|
||||||
} else {
|
} else {
|
||||||
*aNewFrame = NS_NewBlockFrame(mPresShell, styleContext);
|
*aNewFrame = NS_NewBlockFrame(mPresShell, styleContext);
|
||||||
|
|||||||
@@ -1197,7 +1197,7 @@ static PRBool ApplyAbsPosClipping(nsDisplayListBuilder* aBuilder,
|
|||||||
* Returns PR_TRUE if aFrame is overflow:hidden and we should interpret
|
* Returns PR_TRUE if aFrame is overflow:hidden and we should interpret
|
||||||
* that as -moz-hidden-unscrollable.
|
* that as -moz-hidden-unscrollable.
|
||||||
*/
|
*/
|
||||||
static PRBool ApplyOverflowHiddenClipping(nsIFrame* aFrame,
|
static inline PRBool ApplyOverflowHiddenClipping(nsIFrame* aFrame,
|
||||||
const nsStyleDisplay* aDisp)
|
const nsStyleDisplay* aDisp)
|
||||||
{
|
{
|
||||||
if (aDisp->mOverflowX != NS_STYLE_OVERFLOW_HIDDEN)
|
if (aDisp->mOverflowX != NS_STYLE_OVERFLOW_HIDDEN)
|
||||||
@@ -1215,6 +1215,24 @@ static PRBool ApplyOverflowHiddenClipping(nsIFrame* aFrame,
|
|||||||
type == nsGkAtoms::bcTableCellFrame;
|
type == nsGkAtoms::bcTableCellFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline PRBool ApplyPaginatedOverflowClipping(nsIFrame* aFrame,
|
||||||
|
const nsStyleDisplay* aDisp)
|
||||||
|
{
|
||||||
|
// These conditions on aDisp need to match the conditions for which in
|
||||||
|
// non-paginated contexts we'd create a scrollframe for a block but in a
|
||||||
|
// paginated context we don't. See nsCSSFrameConstructor::FindDisplayData
|
||||||
|
// for the relevant conditions. These conditions must also match those in
|
||||||
|
// nsCSSFrameConstructor::ConstructNonScrollableBlock for creating block
|
||||||
|
// formatting context roots for forced-to-be-no-longer scrollable blocks in
|
||||||
|
// paginated contexts.
|
||||||
|
return
|
||||||
|
aFrame->PresContext()->IsPaginated() &&
|
||||||
|
aDisp->IsBlockInside() &&
|
||||||
|
aDisp->IsScrollableOverflow() &&
|
||||||
|
aDisp->IsBlockOutside() &&
|
||||||
|
aFrame->GetType() == nsGkAtoms::blockFrame;
|
||||||
|
}
|
||||||
|
|
||||||
static PRBool ApplyOverflowClipping(nsDisplayListBuilder* aBuilder,
|
static PRBool ApplyOverflowClipping(nsDisplayListBuilder* aBuilder,
|
||||||
nsIFrame* aFrame,
|
nsIFrame* aFrame,
|
||||||
const nsStyleDisplay* aDisp, nsRect* aRect) {
|
const nsStyleDisplay* aDisp, nsRect* aRect) {
|
||||||
@@ -1224,8 +1242,10 @@ static PRBool ApplyOverflowClipping(nsDisplayListBuilder* aBuilder,
|
|||||||
// changed -moz-hidden-unscrollable to apply to any kind of frame.
|
// changed -moz-hidden-unscrollable to apply to any kind of frame.
|
||||||
|
|
||||||
// Only -moz-hidden-unscrollable is handled here (and 'hidden' for table
|
// Only -moz-hidden-unscrollable is handled here (and 'hidden' for table
|
||||||
// frames). Other overflow clipping is applied by nsHTML/XULScrollFrame.
|
// frames, and any non-visible value for blocks in a paginated context).
|
||||||
if (!ApplyOverflowHiddenClipping(aFrame, aDisp)) {
|
// Other overflow clipping is applied by nsHTML/XULScrollFrame.
|
||||||
|
if (!ApplyOverflowHiddenClipping(aFrame, aDisp) &&
|
||||||
|
!ApplyPaginatedOverflowClipping(aFrame, aDisp)) {
|
||||||
PRBool clip = aDisp->mOverflowX == NS_STYLE_OVERFLOW_CLIP;
|
PRBool clip = aDisp->mOverflowX == NS_STYLE_OVERFLOW_CLIP;
|
||||||
if (!clip)
|
if (!clip)
|
||||||
return PR_FALSE;
|
return PR_FALSE;
|
||||||
|
|||||||
8
layout/reftests/printing/129941-1-ref.html
Normal file
8
layout/reftests/printing/129941-1-ref.html
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="reftest-print" style="margin: 0; padding: 0">
|
||||||
|
<body style="margin: 0; padding: 0">
|
||||||
|
<div style="height: 1.25in; border: 0.25in solid green"></div>
|
||||||
|
<div style="height: 1.25in; border: 0.25in solid green"></div>
|
||||||
|
<div style="height: 1.25in; border: 0.25in solid green; border-bottom: none"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
8
layout/reftests/printing/129941-1a.html
Normal file
8
layout/reftests/printing/129941-1a.html
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="reftest-print" style="margin: 0; padding: 0;">
|
||||||
|
<body style="overflow: scroll; height: 5in; margin: 0; padding: 0;">
|
||||||
|
<div style="height: 1.25in; border: 0.25in solid green"></div>
|
||||||
|
<div style="height: 1.25in; border: 0.25in solid green"></div>
|
||||||
|
<div style="height: 1.25in; border: 0.25in solid green"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
8
layout/reftests/printing/129941-1b.html
Normal file
8
layout/reftests/printing/129941-1b.html
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html class="reftest-print" style="margin: 0; padding: 0;">
|
||||||
|
<body style="overflow: -moz-hidden-unscrollable; height: 5in; margin: 0; padding: 0;">
|
||||||
|
<div style="height: 1.25in; border: 0.25in solid green"></div>
|
||||||
|
<div style="height: 1.25in; border: 0.25in solid green"></div>
|
||||||
|
<div style="height: 1.25in; border: 0.25in solid green"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -7,3 +7,5 @@
|
|||||||
== 403669-1.html 403669-1-ref.html
|
== 403669-1.html 403669-1-ref.html
|
||||||
== 381497-n.html 381497-f.html
|
== 381497-n.html 381497-f.html
|
||||||
== test-async-print.html 272830-1-ref.html
|
== test-async-print.html 272830-1-ref.html
|
||||||
|
== 129941-1a.html 129941-1-ref.html
|
||||||
|
== 129941-1b.html 129941-1-ref.html
|
||||||
|
|||||||
Reference in New Issue
Block a user