зеркало из https://github.com/mozilla/gecko-dev.git
Bug 427017: Disable page-break-before/after for fixed- & absolutely-positioned elements. Also, fix assertion during an iterator-comparison by handling case where lineBox is in overflow-lines. r=fantasai sr=roc a1.9=beltzner
This commit is contained in:
Родитель
412cb0e710
Коммит
b7a5c89466
|
@ -7489,6 +7489,13 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState,
|
||||||
}
|
}
|
||||||
#endif // MOZ_SVG
|
#endif // MOZ_SVG
|
||||||
|
|
||||||
|
// If page-break-before is set, this function constructs a page break frame,
|
||||||
|
// EXCEPT for on these types of elements:
|
||||||
|
// * row groups, rows, cells (these are handled internally by tables)
|
||||||
|
// * fixed- and absolutely-positioned elements (currently, our positioning
|
||||||
|
// code doesn't expect positioned frames to have nsPageBreakFrame siblings)
|
||||||
|
//
|
||||||
|
// Returns true iff we should construct a page break frame after this element.
|
||||||
PRBool
|
PRBool
|
||||||
nsCSSFrameConstructor::PageBreakBefore(nsFrameConstructorState& aState,
|
nsCSSFrameConstructor::PageBreakBefore(nsFrameConstructorState& aState,
|
||||||
nsIContent* aContent,
|
nsIContent* aContent,
|
||||||
|
@ -7498,9 +7505,9 @@ nsCSSFrameConstructor::PageBreakBefore(nsFrameConstructorState& aState,
|
||||||
{
|
{
|
||||||
const nsStyleDisplay* display = aStyleContext->GetStyleDisplay();
|
const nsStyleDisplay* display = aStyleContext->GetStyleDisplay();
|
||||||
|
|
||||||
// See if page-break-before is set for all elements except row groups, rows, cells
|
|
||||||
// (these are handled internally by tables) and construct a page break frame if so.
|
|
||||||
if (NS_STYLE_DISPLAY_NONE != display->mDisplay &&
|
if (NS_STYLE_DISPLAY_NONE != display->mDisplay &&
|
||||||
|
NS_STYLE_POSITION_FIXED != display->mPosition &&
|
||||||
|
NS_STYLE_POSITION_ABSOLUTE != display->mPosition &&
|
||||||
(NS_STYLE_DISPLAY_TABLE == display->mDisplay ||
|
(NS_STYLE_DISPLAY_TABLE == display->mDisplay ||
|
||||||
!IsTableRelated(display->mDisplay, PR_TRUE))) {
|
!IsTableRelated(display->mDisplay, PR_TRUE))) {
|
||||||
if (display->mBreakBefore) {
|
if (display->mBreakBefore) {
|
||||||
|
|
|
@ -5160,10 +5160,16 @@ nsBlockInFlowLineIterator::nsBlockInFlowLineIterator(nsBlockFrame* aFrame,
|
||||||
} while (Next());
|
} while (Next());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsBlockFrame::line_iterator
|
||||||
|
nsBlockInFlowLineIterator::End()
|
||||||
|
{
|
||||||
|
return mInOverflowLines ? mInOverflowLines->end() : mFrame->end_lines();
|
||||||
|
}
|
||||||
|
|
||||||
PRBool
|
PRBool
|
||||||
nsBlockInFlowLineIterator::IsLastLineInList()
|
nsBlockInFlowLineIterator::IsLastLineInList()
|
||||||
{
|
{
|
||||||
line_iterator end = mInOverflowLines ? mInOverflowLines->end() : mFrame->end_lines();
|
line_iterator end = End();
|
||||||
return mLine != end && mLine.next() == end;
|
return mLine != end && mLine.next() == end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -706,6 +706,13 @@ public:
|
||||||
PRBool IsLastLineInList();
|
PRBool IsLastLineInList();
|
||||||
nsBlockFrame* GetContainer() { return mFrame; }
|
nsBlockFrame* GetContainer() { return mFrame; }
|
||||||
PRBool GetInOverflow() { return mInOverflowLines != nsnull; }
|
PRBool GetInOverflow() { return mInOverflowLines != nsnull; }
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the end-iterator of whatever line list we're in.
|
||||||
|
*/
|
||||||
|
line_iterator End();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns false if there are no more lines. After this has returned false,
|
* Returns false if there are no more lines. After this has returned false,
|
||||||
* don't call any methods on this object again.
|
* don't call any methods on this object again.
|
||||||
|
|
|
@ -950,7 +950,7 @@ nsHTMLReflowState::CalculateHypotheticalBox(nsPresContext* aPresContext,
|
||||||
// this line.
|
// this line.
|
||||||
// XXXbz the line box is not fully reflown yet if our containing block is
|
// XXXbz the line box is not fully reflown yet if our containing block is
|
||||||
// relatively positioned...
|
// relatively positioned...
|
||||||
if (lineBox != blockFrame->end_lines()) {
|
if (lineBox != iter.End()) {
|
||||||
nsIFrame * firstFrame = lineBox->mFirstChild;
|
nsIFrame * firstFrame = lineBox->mFirstChild;
|
||||||
PRBool found = PR_FALSE;
|
PRBool found = PR_FALSE;
|
||||||
PRBool allEmpty = PR_TRUE;
|
PRBool allEmpty = PR_TRUE;
|
||||||
|
|
|
@ -601,6 +601,12 @@ nsPageBreakFrame::GetIntrinsicWidth()
|
||||||
return nsPresContext::CSSPixelsToAppUnits(1);
|
return nsPresContext::CSSPixelsToAppUnits(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nscoord
|
||||||
|
nsPageBreakFrame::GetIntrinsicHeight()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
nsPageBreakFrame::Reflow(nsPresContext* aPresContext,
|
nsPageBreakFrame::Reflow(nsPresContext* aPresContext,
|
||||||
nsHTMLReflowMetrics& aDesiredSize,
|
nsHTMLReflowMetrics& aDesiredSize,
|
||||||
|
|
|
@ -143,6 +143,7 @@ class nsPageBreakFrame : public nsLeafFrame {
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual nscoord GetIntrinsicWidth();
|
virtual nscoord GetIntrinsicWidth();
|
||||||
|
virtual nscoord GetIntrinsicHeight();
|
||||||
|
|
||||||
PRBool mHaveReflowed;
|
PRBool mHaveReflowed;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" class="reftest-print">
|
||||||
|
<body>
|
||||||
|
<div style="position: absolute; border: 5px solid black;">
|
||||||
|
<div style="position: fixed; page-break-before: left;"/>
|
||||||
|
<div style="display: table-header-group; page-break-after: right;">
|
||||||
|
<div style="position: absolute;">
|
||||||
|
<div style="position: fixed;"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="display: table-footer-group;"/>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -797,3 +797,4 @@ fails-if(MOZ_WIDGET_TOOLKIT=="gtk2") == 424074-1-ref2.xul 424074-1-ref3.xul
|
||||||
== 425972-1.html 425972-1-ref.html
|
== 425972-1.html 425972-1-ref.html
|
||||||
== 425972-2.html 425972-2-ref.html
|
== 425972-2.html 425972-2-ref.html
|
||||||
!= 425972-1.html 425972-2.html
|
!= 425972-1.html 425972-2.html
|
||||||
|
!= 427017-1.xhtml about:blank # crash test (needs reftest-print)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче