author | Xidorn Quan <quanxunzhen@gmail.com> |
Thu, 13 Aug 2015 22:39:51 +1000 | |
changeset 257576 | b3092b2ab776ff7022065c2bb0df98015249c4ad |
parent 257575 | 4a8f45990368ac85cf5fe7cae71ba4d92a4cbc45 |
child 257577 | 08caf7dd050274fcd091f5d9bef5ab2e2c031c68 |
push id | 29223 |
push user | kwierso@gmail.com |
push date | Thu, 13 Aug 2015 22:18:08 +0000 |
treeherder | mozilla-central@4b35236fc76e [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jfkthame |
bugs | 1186721 |
milestone | 43.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -8383,17 +8383,18 @@ nsTextFrame::ReflowText(nsLineLayout& aL uint32_t transformedLastBreak = 0; bool usedHyphenation; gfxFloat trimmedWidth = 0; gfxFloat availWidth = aAvailableWidth; bool canTrimTrailingWhitespace = !textStyle->WhiteSpaceIsSignificant() || (GetStateBits() & TEXT_IS_IN_TOKEN_MATHML); gfxBreakPriority breakPriority = aLineLayout.LastOptionalBreakPriority(); gfxTextRun::SuppressBreak suppressBreak = gfxTextRun::eNoSuppressBreak; - if (ShouldSuppressLineBreak()) { + bool shouldSuppressLineBreak = ShouldSuppressLineBreak(); + if (shouldSuppressLineBreak) { suppressBreak = gfxTextRun::eSuppressAllBreaks; } else if (!aLineLayout.LineIsBreakable()) { suppressBreak = gfxTextRun::eSuppressInitialBreak; } uint32_t transformedCharsFit = mTextRun->BreakAndMeasureText(transformedOffset, transformedLength, (GetStateBits() & TEXT_START_OF_LINE) != 0, availWidth, @@ -8578,46 +8579,48 @@ nsTextFrame::ReflowText(nsLineLayout& aL // from the last textframe should be preserved. Otherwise the trimmable width // from this textframe overrides. (Currently in CSS trimmable width can be // at most one space so there's no way for trimmable width from a previous // frame to accumulate with trimmable width from this frame.) if (transformedCharsFit > 0) { aLineLayout.SetTrimmableISize(NSToCoordFloor(trimmableWidth)); AddStateBits(TEXT_HAS_NONCOLLAPSED_CHARACTERS); } - if (charsFit > 0 && charsFit == length && - textStyle->mHyphens != NS_STYLE_HYPHENS_NONE && - HasSoftHyphenBefore(frag, mTextRun, offset, end)) { - bool fits = - textMetrics.mAdvanceWidth + provider.GetHyphenWidth() <= availWidth; - // Record a potential break after final soft hyphen - aLineLayout.NotifyOptionalBreakPosition(this, length, fits, - gfxBreakPriority::eNormalBreak); - } bool breakAfter = forceBreakAfter; - // length == 0 means either the text is empty or it's all collapsed away - bool emptyTextAtStartOfLine = atStartOfLine && length == 0; - if (!breakAfter && charsFit == length && !emptyTextAtStartOfLine && - transformedOffset + transformedLength == mTextRun->GetLength() && - !ShouldSuppressLineBreak() && - (mTextRun->GetFlags() & nsTextFrameUtils::TEXT_HAS_TRAILING_BREAK)) { - // We placed all the text in the textrun and we have a break opportunity at - // the end of the textrun. We need to record it because the following - // content may not care about nsLineBreaker. - - // Note that because we didn't break, we can be sure that (thanks to the - // code up above) textMetrics.mAdvanceWidth includes the width of any - // trailing whitespace. So we need to subtract trimmableWidth here - // because if we did break at this point, that much width would be trimmed. - if (textMetrics.mAdvanceWidth - trimmableWidth > availWidth) { - breakAfter = true; - } else { - aLineLayout.NotifyOptionalBreakPosition(this, length, true, + if (!shouldSuppressLineBreak) { + if (charsFit > 0 && charsFit == length && + textStyle->mHyphens != NS_STYLE_HYPHENS_NONE && + HasSoftHyphenBefore(frag, mTextRun, offset, end)) { + bool fits = + textMetrics.mAdvanceWidth + provider.GetHyphenWidth() <= availWidth; + // Record a potential break after final soft hyphen + aLineLayout.NotifyOptionalBreakPosition(this, length, fits, gfxBreakPriority::eNormalBreak); } + // length == 0 means either the text is empty or it's all collapsed away + bool emptyTextAtStartOfLine = atStartOfLine && length == 0; + if (!breakAfter && charsFit == length && !emptyTextAtStartOfLine && + transformedOffset + transformedLength == mTextRun->GetLength() && + (mTextRun->GetFlags() & nsTextFrameUtils::TEXT_HAS_TRAILING_BREAK)) { + // We placed all the text in the textrun and we have a break opportunity + // at the end of the textrun. We need to record it because the following + // content may not care about nsLineBreaker. + + // Note that because we didn't break, we can be sure that (thanks to the + // code up above) textMetrics.mAdvanceWidth includes the width of any + // trailing whitespace. So we need to subtract trimmableWidth here + // because if we did break at this point, that much width would be + // trimmed. + if (textMetrics.mAdvanceWidth - trimmableWidth > availWidth) { + breakAfter = true; + } else { + aLineLayout.NotifyOptionalBreakPosition(this, length, true, + gfxBreakPriority::eNormalBreak); + } + } } // Compute reflow status aStatus = contentLength == maxContentLength ? NS_FRAME_COMPLETE : NS_FRAME_NOT_COMPLETE; if (charsFit == 0 && length > 0 && !usedHyphenation) { // Couldn't place any text @@ -8654,17 +8657,17 @@ nsTextFrame::ReflowText(nsLineLayout& aL } else if (cachedNewlineOffset) { mContent->DeleteProperty(nsGkAtoms::newline); } // Compute space and letter counts for justification, if required if (!textStyle->WhiteSpaceIsSignificant() && (lineContainer->StyleText()->mTextAlign == NS_STYLE_TEXT_ALIGN_JUSTIFY || lineContainer->StyleText()->mTextAlignLast == NS_STYLE_TEXT_ALIGN_JUSTIFY || - ShouldSuppressLineBreak()) && + shouldSuppressLineBreak) && !lineContainer->IsSVGText()) { AddStateBits(TEXT_JUSTIFICATION_ENABLED); provider.ComputeJustification(offset, charsFit); aLineLayout.SetJustificationInfo(provider.GetJustificationInfo()); } SetLength(contentLength, &aLineLayout, ALLOW_FRAME_CREATION_AND_DESTRUCTION);
new file mode 100644 --- /dev/null +++ b/layout/reftests/css-ruby/line-break-suppression-5-ref.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Bug 1186720 - Line break suppression with soft hyphen</title> +</head> +<body style="width: 1px"> + x<ruby>a</ruby> +</body> +</html>
new file mode 100644 --- /dev/null +++ b/layout/reftests/css-ruby/line-break-suppression-5.html @@ -0,0 +1,10 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Bug 1186720 - Line break suppression with soft hyphen</title> +</head> +<body style="width: 1px"> + x<ruby>a­</ruby> +</body> +</html>
--- a/layout/reftests/css-ruby/reftest.list +++ b/layout/reftests/css-ruby/reftest.list @@ -28,16 +28,17 @@ test-pref(dom.meta-viewport.enabled,true == justification-2.html justification-2-ref.html fuzzy-if(winWidget,255,792) == lang-specific-style-1.html lang-specific-style-1-ref.html # bug 1134947 == line-breaking-1.html line-breaking-1-ref.html == line-breaking-2.html line-breaking-2-ref.html == line-break-suppression-1.html line-break-suppression-1-ref.html == line-break-suppression-2.html line-break-suppression-2-ref.html == line-break-suppression-3.html line-break-suppression-3-ref.html == line-break-suppression-4.html line-break-suppression-4-ref.html +== line-break-suppression-5.html line-break-suppression-5-ref.html == line-height-1.html line-height-1-ref.html == line-height-2.html line-height-2-ref.html == line-height-3.html line-height-3-ref.html == line-height-4.html line-height-4-ref.html load nested-ruby-1.html == no-transform.html no-transform-ref.html == relative-positioning-1.html relative-positioning-1-ref.html == relative-positioning-2.html relative-positioning-2-ref.html