Backed out 2 changesets (bug 1865172) for causing wpt failures in page-name-unnamed-trailing-001-print.html.
Backed out changeset fc1f91bbfd85 (bug 1865172) Backed out changeset 17019e03e97c (bug 1865172)
This commit is contained in:
@@ -8042,20 +8042,6 @@ nsIFrame* nsCSSFrameConstructor::CreateContinuingFrame(
|
|||||||
return newFrame;
|
return newFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsCSSFrameConstructor::MaybeSetNextPageContentFramePageName(
|
|
||||||
const nsIFrame* aFrame) {
|
|
||||||
MOZ_ASSERT(aFrame, "Frame should not be null");
|
|
||||||
// No parent means the root frame, which isn't what this funciton is for.
|
|
||||||
MOZ_ASSERT(aFrame->GetParent(),
|
|
||||||
"Frame should be the first child placed on a new page, not the "
|
|
||||||
"root frame.");
|
|
||||||
if (mNextPageContentFramePageName) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const nsAtom* const autoValue = aFrame->GetParent()->GetAutoPageValue();
|
|
||||||
mNextPageContentFramePageName = aFrame->ComputePageValue(autoValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult nsCSSFrameConstructor::ReplicateFixedFrames(
|
nsresult nsCSSFrameConstructor::ReplicateFixedFrames(
|
||||||
nsPageContentFrame* aParentFrame) {
|
nsPageContentFrame* aParentFrame) {
|
||||||
// Now deal with fixed-pos things.... They should appear on all pages,
|
// Now deal with fixed-pos things.... They should appear on all pages,
|
||||||
|
|||||||
@@ -297,39 +297,12 @@ class nsCSSFrameConstructor final : public nsFrameManager {
|
|||||||
nsContainerFrame* aParentFrame,
|
nsContainerFrame* aParentFrame,
|
||||||
bool aIsFluid = true);
|
bool aIsFluid = true);
|
||||||
|
|
||||||
/**
|
void SetNextPageContentFramePageName(const nsAtom* aAtom) {
|
||||||
* Sets the page name when a page break is being generated due to a change
|
|
||||||
* in page name.
|
|
||||||
*
|
|
||||||
* Should only be used during paginated reflow, to signal what page value
|
|
||||||
* the next page content frame should have.
|
|
||||||
*
|
|
||||||
* It is an error to set this if a new page name has already been set, either
|
|
||||||
* through SetNextPageContentFramePageName or
|
|
||||||
* MaybeSetNextPageContentFramePageName.
|
|
||||||
*/
|
|
||||||
void SetNextPageContentFramePageName(const nsAtom* aPageName) {
|
|
||||||
MOZ_ASSERT(aPageName, "New page name should never be null");
|
|
||||||
MOZ_ASSERT(!mNextPageContentFramePageName,
|
MOZ_ASSERT(!mNextPageContentFramePageName,
|
||||||
"PageContentFrame page name was already set");
|
"PageContentFrame page name was already set");
|
||||||
mNextPageContentFramePageName = aPageName;
|
mNextPageContentFramePageName = aAtom;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* If a new page name has not been set for the next page, sets the value
|
|
||||||
* using the given frame.
|
|
||||||
*
|
|
||||||
* |aFrame| should be a frame to be placed on the new page.
|
|
||||||
*
|
|
||||||
* This function handles the work of resolving an atom for the frame, and
|
|
||||||
* avoids doing this extra work when not necessary.
|
|
||||||
*
|
|
||||||
* This is used during block reflow when a page break has occurred but it was
|
|
||||||
* not caused by a change in page name. It should only be used during
|
|
||||||
* paginated reflow.
|
|
||||||
*/
|
|
||||||
void MaybeSetNextPageContentFramePageName(const nsIFrame* aFrame);
|
|
||||||
|
|
||||||
// Copy over fixed frames from aParentFrame's prev-in-flow
|
// Copy over fixed frames from aParentFrame's prev-in-flow
|
||||||
nsresult ReplicateFixedFrames(nsPageContentFrame* aParentFrame);
|
nsresult ReplicateFixedFrames(nsPageContentFrame* aParentFrame);
|
||||||
|
|
||||||
|
|||||||
@@ -3153,12 +3153,9 @@ bool nsBlockFrame::ReflowDirtyLines(BlockReflowState& aState) {
|
|||||||
// Immediately fragment for page-name. It is possible we could break
|
// Immediately fragment for page-name. It is possible we could break
|
||||||
// out of the loop right here, but this should make it more similar to
|
// out of the loop right here, but this should make it more similar to
|
||||||
// what happens when reflow causes fragmentation.
|
// what happens when reflow causes fragmentation.
|
||||||
// Set the page name, so that PushTruncatedLine does not need to
|
PushTruncatedLine(aState, line, &keepGoing);
|
||||||
// recalculate the new page name.
|
|
||||||
PresShell()->FrameConstructor()->SetNextPageContentFramePageName(
|
PresShell()->FrameConstructor()->SetNextPageContentFramePageName(
|
||||||
nextPageName ? nextPageName : GetAutoPageValue());
|
nextPageName ? nextPageName : GetAutoPageValue());
|
||||||
PushTruncatedLine(aState, line, &keepGoing,
|
|
||||||
ComputeNewPageNameIfNeeded::No);
|
|
||||||
} else {
|
} else {
|
||||||
// Reflow the dirty line. If it's an incremental reflow, then force
|
// Reflow the dirty line. If it's an incremental reflow, then force
|
||||||
// it to invalidate the dirty area if necessary
|
// it to invalidate the dirty area if necessary
|
||||||
@@ -4733,25 +4730,11 @@ void nsBlockFrame::SetBreakBeforeStatusBeforeLine(BlockReflowState& aState,
|
|||||||
*aKeepReflowGoing = false;
|
*aKeepReflowGoing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsBlockFrame::PushTruncatedLine(
|
void nsBlockFrame::PushTruncatedLine(BlockReflowState& aState,
|
||||||
BlockReflowState& aState, LineIterator aLine, bool* aKeepReflowGoing,
|
LineIterator aLine,
|
||||||
ComputeNewPageNameIfNeeded aComputeNewPageName) {
|
bool* aKeepReflowGoing) {
|
||||||
PushLines(aState, aLine.prev());
|
PushLines(aState, aLine.prev());
|
||||||
*aKeepReflowGoing = false;
|
*aKeepReflowGoing = false;
|
||||||
|
|
||||||
if (aComputeNewPageName == ComputeNewPageNameIfNeeded::Yes) {
|
|
||||||
// mCanHaveClassABreakpoints can only be true during paginated reflow, and
|
|
||||||
// we expect this function to only be called when the available bsize is
|
|
||||||
// constrained.
|
|
||||||
const WritingMode wm = GetWritingMode();
|
|
||||||
const bool canBreakForPageNames =
|
|
||||||
aState.mReflowInput.mFlags.mCanHaveClassABreakpoints &&
|
|
||||||
PresShell()->GetRootFrame()->GetWritingMode().IsOrthogonalTo(wm);
|
|
||||||
if (canBreakForPageNames) {
|
|
||||||
PresShell()->FrameConstructor()->MaybeSetNextPageContentFramePageName(
|
|
||||||
aLine->mFirstChild);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
aState.mReflowStatus.SetIncomplete();
|
aState.mReflowStatus.SetIncomplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -848,24 +848,13 @@ class nsBlockFrame : public nsContainerFrame {
|
|||||||
LineIterator aLine,
|
LineIterator aLine,
|
||||||
bool* aKeepReflowGoing);
|
bool* aKeepReflowGoing);
|
||||||
|
|
||||||
/**
|
|
||||||
* Indicates if we need to compute a page name for the next page when pushing
|
|
||||||
* a truncated line.
|
|
||||||
*
|
|
||||||
* Using a value of No saves work when a new page name has already been set
|
|
||||||
* with nsCSSFrameConstructor::SetNextPageContentFramePageName.
|
|
||||||
*/
|
|
||||||
enum class ComputeNewPageNameIfNeeded : uint8_t { Yes, No };
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Push aLine (and any after it), since it cannot be placed on this
|
* Push aLine (and any after it), since it cannot be placed on this
|
||||||
* page/column. Set aKeepReflowGoing to false and set
|
* page/column. Set aKeepReflowGoing to false and set
|
||||||
* flag aState.mReflowStatus as incomplete.
|
* flag aState.mReflowStatus as incomplete.
|
||||||
*/
|
*/
|
||||||
void PushTruncatedLine(BlockReflowState& aState, LineIterator aLine,
|
void PushTruncatedLine(BlockReflowState& aState, LineIterator aLine,
|
||||||
bool* aKeepReflowGoing,
|
bool* aKeepReflowGoing);
|
||||||
ComputeNewPageNameIfNeeded aComputeNewPageName =
|
|
||||||
ComputeNewPageNameIfNeeded::Yes);
|
|
||||||
|
|
||||||
void SplitLine(BlockReflowState& aState, nsLineLayout& aLineLayout,
|
void SplitLine(BlockReflowState& aState, nsLineLayout& aLineLayout,
|
||||||
LineIterator aLine, nsIFrame* aFrame,
|
LineIterator aLine, nsIFrame* aFrame,
|
||||||
|
|||||||
@@ -2117,8 +2117,8 @@ nsIFrame::CaretBlockAxisMetrics nsIFrame::GetCaretBlockAxisMetrics(
|
|||||||
return CaretBlockAxisMetrics{.mOffset = baseline - ascent, .mExtent = height};
|
return CaretBlockAxisMetrics{.mOffset = baseline - ascent, .mExtent = height};
|
||||||
}
|
}
|
||||||
|
|
||||||
const nsAtom* nsIFrame::ComputePageValue(const nsAtom* aAutoValue) const {
|
const nsAtom* nsIFrame::ComputePageValue() const {
|
||||||
const nsAtom* value = aAutoValue ? aAutoValue : nsGkAtoms::_empty;
|
const nsAtom* value = nsGkAtoms::_empty;
|
||||||
const nsIFrame* frame = this;
|
const nsIFrame* frame = this;
|
||||||
// Find what CSS page name value this frame's subtree has, if any.
|
// Find what CSS page name value this frame's subtree has, if any.
|
||||||
// Starting with this frame, check if a page name other than auto is present,
|
// Starting with this frame, check if a page name other than auto is present,
|
||||||
|
|||||||
@@ -1643,13 +1643,7 @@ class nsIFrame : public nsQueryFrame {
|
|||||||
// This is intended to be used either on the root frame to find the first
|
// This is intended to be used either on the root frame to find the first
|
||||||
// page's page-name, or on a newly created continuation to find what the new
|
// page's page-name, or on a newly created continuation to find what the new
|
||||||
// page's page-name will be.
|
// page's page-name will be.
|
||||||
//
|
const nsAtom* ComputePageValue() const MOZ_NONNULL_RETURN;
|
||||||
// The auto page value can be set by the caller. This is useful when trying
|
|
||||||
// to compute a page value in the middle of a frame tree. In that case the
|
|
||||||
// auto value can be found from the AutoPageValue frame property of the
|
|
||||||
// parent frame. A null auto value is interpreted as the empty-string atom.
|
|
||||||
const nsAtom* ComputePageValue(const nsAtom* aAutoValue = nullptr) const
|
|
||||||
MOZ_NONNULL_RETURN;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// The public visibility API.
|
// The public visibility API.
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8"/>
|
|
||||||
<title>Reference for styling a page with a non-empty name then a page with an empty name</title>
|
|
||||||
<link rel="author" title="Emily McDonough" href="mailto:emcdonough@mozilla.com"/>
|
|
||||||
<style>
|
|
||||||
@page{
|
|
||||||
size: 200px 300px;
|
|
||||||
}
|
|
||||||
@page a{
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
@page b{
|
|
||||||
/* Add a margin so that even if page-orientation doesn't work in the tests
|
|
||||||
* the pages are different. */
|
|
||||||
margin: 20px;
|
|
||||||
page-orientation: rotate-left;
|
|
||||||
}
|
|
||||||
body{
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.page{
|
|
||||||
break-after: page;
|
|
||||||
overflow: hidden;
|
|
||||||
width: 160px;
|
|
||||||
height: 260px;
|
|
||||||
}
|
|
||||||
.marker{
|
|
||||||
width: 90px;
|
|
||||||
height: 90px;
|
|
||||||
background-color: cyan;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="page" style="page: a">
|
|
||||||
<div>
|
|
||||||
<div class="marker">1</div>
|
|
||||||
<div style="position: absolute">x</div>
|
|
||||||
<canvas width="100" height="200"></canvas>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="page" style="page: b">
|
|
||||||
<div class="marker">2</div>
|
|
||||||
<div style="position: absolute">y</div>
|
|
||||||
<canvas width="100" height="200"></canvas>
|
|
||||||
</div>
|
|
||||||
<div class="page" style="page: a">
|
|
||||||
<div>
|
|
||||||
<div class="marker">3</div>
|
|
||||||
<div style="position: absolute">z</div>
|
|
||||||
<canvas width="100" height="200"></canvas>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8"/>
|
|
||||||
<title>Test that a page with a non-empty name then a page with an empty name are correctly styled</title>
|
|
||||||
<link rel="match" href="page-name-unnamed-trailing-001-print-ref.html"/>
|
|
||||||
<link rel="help" href="https://www.w3.org/TR/css-page-3/#using-named-pages"/>
|
|
||||||
<link rel="author" title="Emily McDonough" href="mailto:emcdonough@mozilla.com"/>
|
|
||||||
<style>
|
|
||||||
@page{
|
|
||||||
margin: 0;
|
|
||||||
size: 200px 300px;
|
|
||||||
}
|
|
||||||
@page landscape{
|
|
||||||
/* Add a margin so that even if page-orientation doesn't work in the tests
|
|
||||||
* the pages are different. */
|
|
||||||
margin: 20px;
|
|
||||||
page-orientation: rotate-left;
|
|
||||||
}
|
|
||||||
body{
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
.page{
|
|
||||||
break-after: page;
|
|
||||||
overflow: hidden;
|
|
||||||
width: 160px;
|
|
||||||
height: 260px;
|
|
||||||
}
|
|
||||||
.marker{
|
|
||||||
width: 90px;
|
|
||||||
height: 90px;
|
|
||||||
background-color: cyan;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="page">
|
|
||||||
<div>
|
|
||||||
<div class="marker">1</div>
|
|
||||||
<div style="position: absolute">x</div>
|
|
||||||
<canvas width="100" height="200"></canvas>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="page">
|
|
||||||
<div style="page: landscape">
|
|
||||||
<div class="marker">2</div>
|
|
||||||
<div style="position: absolute">y</div>
|
|
||||||
<canvas style="page: landscape" width="100" height="200"></canvas>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="page">
|
|
||||||
<div>
|
|
||||||
<div class="marker">3</div>
|
|
||||||
<div style="position: absolute">z</div>
|
|
||||||
<canvas width="100" height="200"></canvas>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
Reference in New Issue
Block a user