Bug 1122918 - Part 3 - Use the resolved physical values of 'float' and 'clear' properties during layout. r=heycam

This commit is contained in:
Jonathan Kew 2015-09-18 16:25:21 +01:00
Родитель 3195ef008f
Коммит 5cb2b4ceea
6 изменённых файлов: 38 добавлений и 25 удалений

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

@ -144,7 +144,7 @@ BRFrame::Reflow(nsPresContext* aPresContext,
}
// Return our reflow status
uint32_t breakType = aReflowState.mStyleDisplay->mBreakType;
uint32_t breakType = aReflowState.mStyleDisplay->PhysicalBreakType(wm);
if (NS_STYLE_CLEAR_NONE == breakType) {
breakType = NS_STYLE_CLEAR_LINE;
}

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

@ -3090,7 +3090,8 @@ nsBlockFrame::ReflowBlockFrame(nsBlockReflowState& aState,
const nsStyleDisplay* display = frame->StyleDisplay();
nsBlockReflowContext brc(aState.mPresContext, aState.mReflowState);
uint8_t breakType = display->mBreakType;
uint8_t breakType =
display->PhysicalBreakType(aState.mReflowState.GetWritingMode());
if (NS_STYLE_CLEAR_NONE != aState.mFloatBreakType) {
breakType = nsLayoutUtils::CombineBreakType(breakType,
aState.mFloatBreakType);
@ -4201,11 +4202,12 @@ nsBlockFrame::SplitFloat(nsBlockReflowState& aState,
nextInFlow->AddStateBits(NS_FRAME_IS_OVERFLOW_CONTAINER);
}
if (aFloat->StyleDisplay()->mFloats == NS_STYLE_FLOAT_LEFT) {
uint8_t floatStyle =
aFloat->StyleDisplay()->PhysicalFloats(aState.mReflowState.GetWritingMode());
if (floatStyle == NS_STYLE_FLOAT_LEFT) {
aState.mFloatManager->SetSplitLeftFloatAcrossBreak();
} else {
MOZ_ASSERT(aFloat->StyleDisplay()->mFloats == NS_STYLE_FLOAT_RIGHT,
"unexpected float side");
MOZ_ASSERT(floatStyle == NS_STYLE_FLOAT_RIGHT, "unexpected float side");
aState.mFloatManager->SetSplitRightFloatAcrossBreak();
}

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

@ -738,7 +738,7 @@ nsBlockReflowState::FlowAndPlaceFloat(nsIFrame* aFloat)
// when floats are inserted before it.
if (NS_STYLE_CLEAR_NONE != floatDisplay->mBreakType) {
// XXXldb Does this handle vertical margins correctly?
mBCoord = ClearFloats(mBCoord, floatDisplay->mBreakType);
mBCoord = ClearFloats(mBCoord, floatDisplay->PhysicalBreakType(wm));
}
// Get the band of available space
nsFlowAreaRect floatAvailableSpace = GetFloatAvailableSpace(mBCoord);
@ -781,9 +781,10 @@ nsBlockReflowState::FlowAndPlaceFloat(nsIFrame* aFloat)
// Find a place to place the float. The CSS2 spec doesn't want
// floats overlapping each other or sticking out of the containing
// block if possible (CSS2 spec section 9.5.1, see the rule list).
NS_ASSERTION((NS_STYLE_FLOAT_LEFT == floatDisplay->mFloats) ||
(NS_STYLE_FLOAT_RIGHT == floatDisplay->mFloats),
"invalid float type");
uint8_t floatStyle = floatDisplay->PhysicalFloats(wm);
NS_ASSERTION((NS_STYLE_FLOAT_LEFT == floatStyle) ||
(NS_STYLE_FLOAT_RIGHT == floatStyle),
"invalid float type");
// Can the float fit here?
bool keepFloatOnSameLine = false;
@ -877,7 +878,7 @@ nsBlockReflowState::FlowAndPlaceFloat(nsIFrame* aFloat)
// LineLeft() and LineRight() here, because we would only have to
// convert the result back into this block's writing mode.
LogicalPoint floatPos(wm);
bool leftFloat = NS_STYLE_FLOAT_LEFT == floatDisplay->mFloats;
bool leftFloat = NS_STYLE_FLOAT_LEFT == floatStyle;
if (leftFloat == wm.IsBidiLTR()) {
floatPos.I(wm) = floatAvailableSpace.mRect.IStart(wm);
@ -1037,11 +1038,12 @@ nsBlockReflowState::PushFloatPastBreak(nsIFrame *aFloat)
// must have their tops below the top of this float)
// * don't waste much time trying to reflow this float again until
// after the break
if (aFloat->StyleDisplay()->mFloats == NS_STYLE_FLOAT_LEFT) {
uint8_t floatStyle =
aFloat->StyleDisplay()->PhysicalFloats(mReflowState.GetWritingMode());
if (floatStyle == NS_STYLE_FLOAT_LEFT) {
mFloatManager->SetPushedLeftFloatPastBreak();
} else {
MOZ_ASSERT(aFloat->StyleDisplay()->mFloats == NS_STYLE_FLOAT_RIGHT,
"unexpected float value");
MOZ_ASSERT(floatStyle == NS_STYLE_FLOAT_RIGHT, "unexpected float value");
mFloatManager->SetPushedRightFloatPastBreak();
}

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

@ -216,7 +216,8 @@ nsFloatManager::GetFlowArea(WritingMode aWM, nscoord aBOffset,
}
// Shrink our band's width if needed.
if (fi.mFrame->StyleDisplay()->mFloats == NS_STYLE_FLOAT_LEFT) {
uint8_t floatStyle = fi.mFrame->StyleDisplay()->PhysicalFloats(aWM);
if (floatStyle == NS_STYLE_FLOAT_LEFT) {
// A left float
nscoord lineRightEdge = fi.LineRight();
if (lineRightEdge > lineLeft) {
@ -274,7 +275,7 @@ nsFloatManager::AddFloat(nsIFrame* aFloatFrame, const LogicalRect& aMarginRect,
info.mLeftBEnd = nscoord_MIN;
info.mRightBEnd = nscoord_MIN;
}
uint8_t floatStyle = aFloatFrame->StyleDisplay()->mFloats;
uint8_t floatStyle = aFloatFrame->StyleDisplay()->PhysicalFloats(aWM);
NS_ASSERTION(floatStyle == NS_STYLE_FLOAT_LEFT ||
floatStyle == NS_STYLE_FLOAT_RIGHT, "unexpected float");
nscoord& sideBEnd = floatStyle == NS_STYLE_FLOAT_LEFT ? info.mLeftBEnd
@ -310,7 +311,8 @@ nsFloatManager::CalculateRegionFor(WritingMode aWM,
// Preserve the right margin-edge for left floats and the left
// margin-edge for right floats
const nsStyleDisplay* display = aFloat->StyleDisplay();
if ((NS_STYLE_FLOAT_LEFT == display->mFloats) == aWM.IsBidiLTR()) {
uint8_t floatStyle = display->PhysicalFloats(aWM);
if ((NS_STYLE_FLOAT_LEFT == floatStyle) == aWM.IsBidiLTR()) {
region.IStart(aWM) = region.IEnd(aWM);
}
region.ISize(aWM) = 0;

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

@ -4115,23 +4115,30 @@ nsIFrame::InlinePrefISizeData::ForceBreak(nsRenderingContext *aRenderingContext)
floats_cur_left = 0,
floats_cur_right = 0;
WritingMode wm = lineContainer->GetWritingMode();
for (uint32_t i = 0, i_end = floats.Length(); i != i_end; ++i) {
const FloatInfo& floatInfo = floats[i];
const nsStyleDisplay *floatDisp = floatInfo.Frame()->StyleDisplay();
if (floatDisp->mBreakType == NS_STYLE_CLEAR_LEFT ||
floatDisp->mBreakType == NS_STYLE_CLEAR_RIGHT ||
floatDisp->mBreakType == NS_STYLE_CLEAR_BOTH) {
uint8_t breakType = floatDisp->PhysicalBreakType(wm);
if (breakType == NS_STYLE_CLEAR_LEFT ||
breakType == NS_STYLE_CLEAR_RIGHT ||
breakType == NS_STYLE_CLEAR_BOTH) {
nscoord floats_cur = NSCoordSaturatingAdd(floats_cur_left,
floats_cur_right);
if (floats_cur > floats_done)
if (floats_cur > floats_done) {
floats_done = floats_cur;
if (floatDisp->mBreakType != NS_STYLE_CLEAR_RIGHT)
}
if (breakType != NS_STYLE_CLEAR_RIGHT) {
floats_cur_left = 0;
if (floatDisp->mBreakType != NS_STYLE_CLEAR_LEFT)
}
if (breakType != NS_STYLE_CLEAR_LEFT) {
floats_cur_right = 0;
}
}
nscoord &floats_cur = floatDisp->mFloats == NS_STYLE_FLOAT_LEFT
uint8_t floatStyle = floatDisp->PhysicalFloats(wm);
nscoord& floats_cur = floatStyle == NS_STYLE_FLOAT_LEFT
? floats_cur_left : floats_cur_right;
nscoord floatWidth = floatInfo.Width();
// Negative-width floats don't change the available space so they

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

@ -90,8 +90,8 @@ fuzzy-if(OSX==1010,26,7) == orthogonal-floats-1b.html orthogonal-floats-1-ref.ht
fuzzy-if(OSX==1010,103,802) fuzzy-if(winWidget,116,700) HTTP(..) == orthogonal-floats-1c.html orthogonal-floats-1-ref.html
fuzzy-if(OSX==1010,103,802) fuzzy-if(winWidget,116,700) HTTP(..) == orthogonal-floats-1d.html orthogonal-floats-1-ref.html
fails == logical-float-side-1.html logical-float-side-1-ref.html
fails == logical-float-side-2.html logical-float-side-2-ref.html
== logical-float-side-1.html logical-float-side-1-ref.html
== logical-float-side-2.html logical-float-side-2-ref.html
== float-in-rtl-slr-1a.html float-in-rtl-slr-1-ref.html
== float-in-rtl-slr-1b.html float-in-rtl-slr-1-ref.html