Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: third_party/WebKit/Source/core/layout/line/BreakingContextInlineHeaders.h

Issue 1527113004: Remove unnecessary state for tracking whitespace collapsing in pre's (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@567080-Part2-2
Patch Set: Updated Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved. 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r ight reserved.
4 * Copyright (C) 2010 Google Inc. All rights reserved. 4 * Copyright (C) 2010 Google Inc. All rights reserved.
5 * Copyright (C) 2013 Adobe Systems Incorporated. 5 * Copyright (C) 2013 Adobe Systems Incorporated.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 , m_lineInfo(inLineInfo) 65 , m_lineInfo(inLineInfo)
66 , m_layoutTextInfo(inLayoutTextInfo) 66 , m_layoutTextInfo(inLayoutTextInfo)
67 , m_lastFloatFromPreviousLine(inLastFloatFromPreviousLine) 67 , m_lastFloatFromPreviousLine(inLastFloatFromPreviousLine)
68 , m_width(lineWidth) 68 , m_width(lineWidth)
69 , m_currWS(NORMAL) 69 , m_currWS(NORMAL)
70 , m_lastWS(NORMAL) 70 , m_lastWS(NORMAL)
71 , m_preservesNewline(false) 71 , m_preservesNewline(false)
72 , m_atStart(true) 72 , m_atStart(true)
73 , m_ignoringSpaces(false) 73 , m_ignoringSpaces(false)
74 , m_currentCharacterIsSpace(false) 74 , m_currentCharacterIsSpace(false)
75 , m_currentCharacterShouldCollapseIfPreWap(false)
76 , m_appliedStartWidth(appliedStartWidth) 75 , m_appliedStartWidth(appliedStartWidth)
77 , m_includeEndWidth(true) 76 , m_includeEndWidth(true)
78 , m_autoWrap(false) 77 , m_autoWrap(false)
79 , m_autoWrapWasEverTrueOnLine(false) 78 , m_autoWrapWasEverTrueOnLine(false)
80 , m_floatsFitOnLine(true) 79 , m_floatsFitOnLine(true)
81 , m_collapseWhiteSpace(false) 80 , m_collapseWhiteSpace(false)
82 , m_startingNewParagraph(m_lineInfo.previousLineBrokeCleanly()) 81 , m_startingNewParagraph(m_lineInfo.previousLineBrokeCleanly())
83 , m_allowImagesToBreak(!block.document().inQuirksMode() || !block.isTabl eCell() || !m_blockStyle->logicalWidth().isIntrinsicOrAuto()) 82 , m_allowImagesToBreak(!block.document().inQuirksMode() || !block.isTabl eCell() || !m_blockStyle->logicalWidth().isIntrinsicOrAuto())
84 , m_atEnd(false) 83 , m_atEnd(false)
85 , m_lineMidpointState(resolver.midpointState()) 84 , m_lineMidpointState(resolver.midpointState())
86 { 85 {
87 m_lineInfo.setPreviousLineBrokeCleanly(false); 86 m_lineInfo.setPreviousLineBrokeCleanly(false);
88 } 87 }
89 88
90 LayoutObject* currentObject() { return m_current.object(); } 89 LayoutObject* currentObject() { return m_current.object(); }
91 InlineIterator lineBreak() { return m_lineBreak; } 90 InlineIterator lineBreak() { return m_lineBreak; }
92 bool atEnd() { return m_atEnd; } 91 bool atEnd() { return m_atEnd; }
93 92
94 void initializeForCurrentObject(); 93 void initializeForCurrentObject();
95 94
96 void increment(); 95 void increment();
97 96
98 void handleBR(EClear&); 97 void handleBR(EClear&);
99 void handleOutOfFlowPositioned(Vector<LineLayoutBox>& positionedObjects); 98 void handleOutOfFlowPositioned(Vector<LineLayoutBox>& positionedObjects);
100 void handleFloat(); 99 void handleFloat();
101 void handleEmptyInline(); 100 void handleEmptyInline();
102 void handleReplaced(); 101 void handleReplaced();
103 bool handleText(WordMeasurements&, bool& hyphenated); 102 bool handleText(WordMeasurements&, bool& hyphenated);
104 void prepareForNextCharacter(const LineLayoutText&, bool& prohibitBreakInsid e, bool previousCharacterIsSpace, bool previousCharacterShouldCollapseIfPreWap); 103 void prepareForNextCharacter(const LineLayoutText&, bool& prohibitBreakInsid e, bool previousCharacterIsSpace);
105 bool canBreakAtWhitespace(bool breakWords, WordMeasurement&, bool stoppedIgn oringSpaces, bool& hyphenated, float charWidth, float& hyphenWidth, bool between Words, bool midWordBreak, bool breakAll, bool previousCharacterIsSpace, float la stWidthMeasurement, const LineLayoutText&, const Font&, bool applyWordSpacing, f loat wordSpacing); 104 bool canBreakAtWhitespace(bool breakWords, WordMeasurement&, bool stoppedIgn oringSpaces, bool& hyphenated, float charWidth, float& hyphenWidth, bool between Words, bool midWordBreak, bool breakAll, bool previousCharacterIsSpace, float la stWidthMeasurement, const LineLayoutText&, const Font&, bool applyWordSpacing, f loat wordSpacing);
106 bool trailingSpaceExceedsAvailableWidth(bool midWordBreak, const LineLayoutT ext&, WordMeasurement&, bool applyWordSpacing, bool wordSpacing, const Font&); 105 bool trailingSpaceExceedsAvailableWidth(bool midWordBreak, const LineLayoutT ext&, WordMeasurement&, bool applyWordSpacing, bool wordSpacing, const Font&);
107 WordMeasurement& calculateWordWidth(WordMeasurements&, LineLayoutText&, unsi gned lastSpace, float& lastWidthMeasurement, float wordSpacingForWordMeasurement , const Font&, float wordTrailingSpaceWidth, UChar); 106 WordMeasurement& calculateWordWidth(WordMeasurements&, LineLayoutText&, unsi gned lastSpace, float& lastWidthMeasurement, float wordSpacingForWordMeasurement , const Font&, float wordTrailingSpaceWidth, UChar);
108 void stopIgnoringSpaces(unsigned& lastSpace); 107 void stopIgnoringSpaces(unsigned& lastSpace);
109 void commitAndUpdateLineBreakIfNeeded(); 108 void commitAndUpdateLineBreakIfNeeded();
110 InlineIterator handleEndOfLine(); 109 InlineIterator handleEndOfLine();
111 110
112 void clearLineBreakIfFitsOnLine() 111 void clearLineBreakIfFitsOnLine()
113 { 112 {
114 if (m_width.fitsOnLine() || m_lastWS == NOWRAP) 113 if (m_width.fitsOnLine() || m_lastWS == NOWRAP)
(...skipping 24 matching lines...) Expand all
139 138
140 LineWidth m_width; 139 LineWidth m_width;
141 140
142 EWhiteSpace m_currWS; 141 EWhiteSpace m_currWS;
143 EWhiteSpace m_lastWS; 142 EWhiteSpace m_lastWS;
144 143
145 bool m_preservesNewline; 144 bool m_preservesNewline;
146 bool m_atStart; 145 bool m_atStart;
147 bool m_ignoringSpaces; 146 bool m_ignoringSpaces;
148 bool m_currentCharacterIsSpace; 147 bool m_currentCharacterIsSpace;
149 bool m_currentCharacterShouldCollapseIfPreWap;
150 bool m_appliedStartWidth; 148 bool m_appliedStartWidth;
151 bool m_includeEndWidth; 149 bool m_includeEndWidth;
152 bool m_autoWrap; 150 bool m_autoWrap;
153 bool m_autoWrapWasEverTrueOnLine; 151 bool m_autoWrapWasEverTrueOnLine;
154 bool m_floatsFitOnLine; 152 bool m_floatsFitOnLine;
155 bool m_collapseWhiteSpace; 153 bool m_collapseWhiteSpace;
156 bool m_startingNewParagraph; 154 bool m_startingNewParagraph;
157 bool m_allowImagesToBreak; 155 bool m_allowImagesToBreak;
158 bool m_atEnd; 156 bool m_atEnd;
159 157
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 m_currWS = m_current.object().isLayoutInline() ? m_currentStyle->whiteSpace( ) : m_current.object().parent().style()->whiteSpace(); 264 m_currWS = m_current.object().isLayoutInline() ? m_currentStyle->whiteSpace( ) : m_current.object().parent().style()->whiteSpace();
267 m_lastWS = m_lastObject.isLayoutInline() ? m_lastObject.style()->whiteSpace( ) : m_lastObject.parent().style()->whiteSpace(); 265 m_lastWS = m_lastObject.isLayoutInline() ? m_lastObject.style()->whiteSpace( ) : m_lastObject.parent().style()->whiteSpace();
268 266
269 bool isSVGText = m_current.object().isSVGInlineText(); 267 bool isSVGText = m_current.object().isSVGInlineText();
270 m_autoWrap = !isSVGText && ComputedStyle::autoWrap(m_currWS); 268 m_autoWrap = !isSVGText && ComputedStyle::autoWrap(m_currWS);
271 m_autoWrapWasEverTrueOnLine = m_autoWrapWasEverTrueOnLine || m_autoWrap; 269 m_autoWrapWasEverTrueOnLine = m_autoWrapWasEverTrueOnLine || m_autoWrap;
272 270
273 m_preservesNewline = !isSVGText && ComputedStyle::preserveNewline(m_currWS); 271 m_preservesNewline = !isSVGText && ComputedStyle::preserveNewline(m_currWS);
274 272
275 m_collapseWhiteSpace = ComputedStyle::collapseWhiteSpace(m_currWS); 273 m_collapseWhiteSpace = ComputedStyle::collapseWhiteSpace(m_currWS);
274
275 // Ensure the whitespace in constructions like '<span style="white-space: pr e-wrap">text <span><span> text</span>'
276 // does not collapse.
277 if (m_collapseWhiteSpace && !ComputedStyle::collapseWhiteSpace(m_lastWS))
278 m_currentCharacterIsSpace = false;
276 } 279 }
277 280
278 inline void BreakingContext::increment() 281 inline void BreakingContext::increment()
279 { 282 {
280 // Clear out our character space bool, since inline <pre>s don't collapse wh itespace
281 // with adjacent inline normal/nowrap spans.
282 if (!m_collapseWhiteSpace)
283 m_currentCharacterIsSpace = false;
284
285 m_current.moveToStartOf(m_nextObject); 283 m_current.moveToStartOf(m_nextObject);
286 284
287 // When the line box tree is created, this position in the line will be snap ped to 285 // When the line box tree is created, this position in the line will be snap ped to
288 // LayoutUnit's, and those measurements will be used by the paint code. Do the 286 // LayoutUnit's, and those measurements will be used by the paint code. Do the
289 // equivalent snapping here, to get consistent line measurements. 287 // equivalent snapping here, to get consistent line measurements.
290 m_width.snapUncommittedWidth(); 288 m_width.snapUncommittedWidth();
291 289
292 m_atStart = false; 290 m_atStart = false;
293 } 291 }
294 292
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 m_lineInfo.setEmpty(false, m_block, &m_width); 445 m_lineInfo.setEmpty(false, m_block, &m_width);
448 if (m_ignoringSpaces) { 446 if (m_ignoringSpaces) {
449 // If we are in a run of ignored spaces then ensure we get a linebox if lineboxes are eventually 447 // If we are in a run of ignored spaces then ensure we get a linebox if lineboxes are eventually
450 // created for the line... 448 // created for the line...
451 m_trailingObjects.clear(); 449 m_trailingObjects.clear();
452 ensureLineBoxInsideIgnoredSpaces(&m_lineMidpointState, m_current.obj ect()); 450 ensureLineBoxInsideIgnoredSpaces(&m_lineMidpointState, m_current.obj ect());
453 } else if (m_blockStyle->collapseWhiteSpace() && m_resolver.position().o bject() == m_current.object() 451 } else if (m_blockStyle->collapseWhiteSpace() && m_resolver.position().o bject() == m_current.object()
454 && shouldSkipWhitespaceAfterStartObject(m_block, m_current.object(), m_lineMidpointState)) { 452 && shouldSkipWhitespaceAfterStartObject(m_block, m_current.object(), m_lineMidpointState)) {
455 // If this object is at the start of the line, we need to behave lik e list markers and 453 // If this object is at the start of the line, we need to behave lik e list markers and
456 // start ignoring spaces. 454 // start ignoring spaces.
457 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = true; 455 m_currentCharacterIsSpace = true;
458 m_ignoringSpaces = true; 456 m_ignoringSpaces = true;
459 } else { 457 } else {
460 // If we are after a trailing space but aren't ignoring spaces yet t hen ensure we get a linebox 458 // If we are after a trailing space but aren't ignoring spaces yet t hen ensure we get a linebox
461 // if we encounter collapsible whitepace. 459 // if we encounter collapsible whitepace.
462 m_trailingObjects.appendObjectIfNeeded(m_current.object()); 460 m_trailingObjects.appendObjectIfNeeded(m_current.object());
463 } 461 }
464 } 462 }
465 463
466 m_width.addUncommittedWidth((inlineLogicalWidthFromAncestorsIfNeeded(m_curre nt.object()) + borderPaddingMarginStart(flowBox) + borderPaddingMarginEnd(flowBo x)).toFloat()); 464 m_width.addUncommittedWidth((inlineLogicalWidthFromAncestorsIfNeeded(m_curre nt.object()) + borderPaddingMarginStart(flowBox) + borderPaddingMarginEnd(flowBo x)).toFloat());
467 } 465 }
(...skipping 11 matching lines...) Expand all
479 && (!m_current.object().isRubyRun() || toLayoutRubyRun(m_current.object( ))->canBreakBefore(m_layoutTextInfo.m_lineBreakIterator))) { 477 && (!m_current.object().isRubyRun() || toLayoutRubyRun(m_current.object( ))->canBreakBefore(m_layoutTextInfo.m_lineBreakIterator))) {
480 m_width.commit(); 478 m_width.commit();
481 m_lineBreak.moveToStartOf(m_current.object()); 479 m_lineBreak.moveToStartOf(m_current.object());
482 } 480 }
483 481
484 if (m_ignoringSpaces) 482 if (m_ignoringSpaces)
485 m_lineMidpointState.stopIgnoringSpaces(InlineIterator(0, m_current.objec t(), 0)); 483 m_lineMidpointState.stopIgnoringSpaces(InlineIterator(0, m_current.objec t(), 0));
486 484
487 m_lineInfo.setEmpty(false, m_block, &m_width); 485 m_lineInfo.setEmpty(false, m_block, &m_width);
488 m_ignoringSpaces = false; 486 m_ignoringSpaces = false;
489 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = false ; 487 m_currentCharacterIsSpace = false;
490 m_trailingObjects.clear(); 488 m_trailingObjects.clear();
491 489
492 // Optimize for a common case. If we can't find whitespace after the list 490 // Optimize for a common case. If we can't find whitespace after the list
493 // item, then this is all moot. 491 // item, then this is all moot.
494 LayoutUnit replacedLogicalWidth = m_block.logicalWidthForChild(replacedBox) + m_block.marginStartForChild(replacedBox) + m_block.marginEndForChild(replacedB ox) + inlineLogicalWidthFromAncestorsIfNeeded(m_current.object()); 492 LayoutUnit replacedLogicalWidth = m_block.logicalWidthForChild(replacedBox) + m_block.marginStartForChild(replacedBox) + m_block.marginEndForChild(replacedB ox) + inlineLogicalWidthFromAncestorsIfNeeded(m_current.object());
495 if (m_current.object().isListMarker()) { 493 if (m_current.object().isListMarker()) {
496 if (m_blockStyle->collapseWhiteSpace() && shouldSkipWhitespaceAfterStart Object(m_block, m_current.object(), m_lineMidpointState)) { 494 if (m_blockStyle->collapseWhiteSpace() && shouldSkipWhitespaceAfterStart Object(m_block, m_current.object(), m_lineMidpointState)) {
497 // Like with inline flows, we start ignoring spaces to make sure tha t any 495 // Like with inline flows, we start ignoring spaces to make sure tha t any
498 // additional spaces we see will be discarded. 496 // additional spaces we see will be discarded.
499 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = true; 497 m_currentCharacterIsSpace = true;
500 m_ignoringSpaces = true; 498 m_ignoringSpaces = true;
501 } 499 }
502 if (LineLayoutListMarker(m_current.object()).isInside()) 500 if (LineLayoutListMarker(m_current.object()).isInside())
503 m_width.addUncommittedWidth(replacedLogicalWidth.toFloat()); 501 m_width.addUncommittedWidth(replacedLogicalWidth.toFloat());
504 } else { 502 } else {
505 m_width.addUncommittedWidth(replacedLogicalWidth.toFloat()); 503 m_width.addUncommittedWidth(replacedLogicalWidth.toFloat());
506 } 504 }
507 if (m_current.object().isRubyRun()) 505 if (m_current.object().isRubyRun())
508 m_width.applyOverhang(LineLayoutRubyRun(m_current.object()), m_lastObjec t, m_nextObject); 506 m_width.applyOverhang(LineLayoutRubyRun(m_current.object()), m_lastObjec t, m_nextObject);
509 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM ENT CHARACTER) for replaced element. 507 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM ENT CHARACTER) for replaced element.
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
606 // Non-zero only when kerning is enabled, in which case we measure 604 // Non-zero only when kerning is enabled, in which case we measure
607 // words with their trailing space, then subtract its width. 605 // words with their trailing space, then subtract its width.
608 float wordTrailingSpaceWidth = (font.fontDescription().typesettingFeatures() & Kerning) ? 606 float wordTrailingSpaceWidth = (font.fontDescription().typesettingFeatures() & Kerning) ?
609 font.width(constructTextRun(font, &spaceCharacter, 1, style, style.direc tion())) + wordSpacing 607 font.width(constructTextRun(font, &spaceCharacter, 1, style, style.direc tion())) + wordSpacing
610 : 0; 608 : 0;
611 609
612 UChar lastCharacter = m_layoutTextInfo.m_lineBreakIterator.lastCharacter(); 610 UChar lastCharacter = m_layoutTextInfo.m_lineBreakIterator.lastCharacter();
613 UChar secondToLastCharacter = m_layoutTextInfo.m_lineBreakIterator.secondToL astCharacter(); 611 UChar secondToLastCharacter = m_layoutTextInfo.m_lineBreakIterator.secondToL astCharacter();
614 for (; m_current.offset() < layoutText.textLength(); m_current.fastIncrement InTextNode()) { 612 for (; m_current.offset() < layoutText.textLength(); m_current.fastIncrement InTextNode()) {
615 bool previousCharacterIsSpace = m_currentCharacterIsSpace; 613 bool previousCharacterIsSpace = m_currentCharacterIsSpace;
616 bool previousCharacterShouldCollapseIfPreWap = m_currentCharacterShouldC ollapseIfPreWap;
617 UChar c = m_current.current(); 614 UChar c = m_current.current();
618 m_currentCharacterShouldCollapseIfPreWap = m_currentCharacterIsSpace = c == spaceCharacter || c == tabulationCharacter || (!m_preservesNewline && (c == newlineCharacter)); 615 m_currentCharacterIsSpace = c == spaceCharacter || c == tabulationCharac ter || (!m_preservesNewline && (c == newlineCharacter));
619 616
620 if (!m_collapseWhiteSpace || !m_currentCharacterIsSpace) 617 if (!m_collapseWhiteSpace || !m_currentCharacterIsSpace)
621 m_lineInfo.setEmpty(false, m_block, &m_width); 618 m_lineInfo.setEmpty(false, m_block, &m_width);
622 619
623 if (c == softHyphenCharacter && m_autoWrap && !hyphenWidth) { 620 if (c == softHyphenCharacter && m_autoWrap && !hyphenWidth) {
624 hyphenWidth = layoutText.hyphenWidth(font, textDirectionFromUnicode( m_resolver.position().direction())); 621 hyphenWidth = layoutText.hyphenWidth(font, textDirectionFromUnicode( m_resolver.position().direction()));
625 m_width.addUncommittedWidth(hyphenWidth); 622 m_width.addUncommittedWidth(hyphenWidth);
626 } 623 }
627 624
628 bool applyWordSpacing = false; 625 bool applyWordSpacing = false;
(...skipping 14 matching lines...) Expand all
643 // If we're in the middle of a word or at the start of a new one and can 't break there, then continue to the next character. 640 // If we're in the middle of a word or at the start of a new one and can 't break there, then continue to the next character.
644 if (!betweenWords && !midWordBreak) { 641 if (!betweenWords && !midWordBreak) {
645 if (m_ignoringSpaces) { 642 if (m_ignoringSpaces) {
646 // Stop ignoring spaces and begin at this 643 // Stop ignoring spaces and begin at this
647 // new point. 644 // new point.
648 lastSpaceWordSpacing = applyWordSpacing ? wordSpacing : 0; 645 lastSpaceWordSpacing = applyWordSpacing ? wordSpacing : 0;
649 wordSpacingForWordMeasurement = (applyWordSpacing && wordMeasure ments.last().width) ? wordSpacing : 0; 646 wordSpacingForWordMeasurement = (applyWordSpacing && wordMeasure ments.last().width) ? wordSpacing : 0;
650 stopIgnoringSpaces(lastSpace); 647 stopIgnoringSpaces(lastSpace);
651 } 648 }
652 649
653 prepareForNextCharacter(layoutText, prohibitBreakInside, previousCha racterIsSpace, previousCharacterShouldCollapseIfPreWap); 650 prepareForNextCharacter(layoutText, prohibitBreakInside, previousCha racterIsSpace);
654 m_atStart = false; 651 m_atStart = false;
655 nextCharacter(c, lastCharacter, secondToLastCharacter); 652 nextCharacter(c, lastCharacter, secondToLastCharacter);
656 continue; 653 continue;
657 } 654 }
658 655
659 // If we're collapsing space and we're at a collapsible space such as a space or tab, continue to the next character. 656 // If we're collapsing space and we're at a collapsible space such as a space or tab, continue to the next character.
660 if (m_ignoringSpaces && m_currentCharacterIsSpace) { 657 if (m_ignoringSpaces && m_currentCharacterIsSpace) {
661 lastSpaceWordSpacing = 0; 658 lastSpaceWordSpacing = 0;
662 // Just keep ignoring these spaces. 659 // Just keep ignoring these spaces.
663 nextCharacter(c, lastCharacter, secondToLastCharacter); 660 nextCharacter(c, lastCharacter, secondToLastCharacter);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 if (m_currentCharacterIsSpace && previousCharacterIsSpace) { 740 if (m_currentCharacterIsSpace && previousCharacterIsSpace) {
744 m_ignoringSpaces = true; 741 m_ignoringSpaces = true;
745 742
746 // We just entered a mode where we are ignoring spaces. Create a midpoint to terminate the run 743 // We just entered a mode where we are ignoring spaces. Create a midpoint to terminate the run
747 // before the second space. 744 // before the second space.
748 m_lineMidpointState.startIgnoringSpaces(m_startOfIgnoredSpaces); 745 m_lineMidpointState.startIgnoringSpaces(m_startOfIgnoredSpaces);
749 m_trailingObjects.updateMidpointsForTrailingObjects(m_lineMidpoi ntState, InlineIterator(), TrailingObjects::DoNotCollapseFirstSpace); 746 m_trailingObjects.updateMidpointsForTrailingObjects(m_lineMidpoi ntState, InlineIterator(), TrailingObjects::DoNotCollapseFirstSpace);
750 } 747 }
751 } 748 }
752 749
753 prepareForNextCharacter(layoutText, prohibitBreakInside, previousCharact erIsSpace, previousCharacterShouldCollapseIfPreWap); 750 prepareForNextCharacter(layoutText, prohibitBreakInside, previousCharact erIsSpace);
754 m_atStart = false; 751 m_atStart = false;
755 nextCharacter(c, lastCharacter, secondToLastCharacter); 752 nextCharacter(c, lastCharacter, secondToLastCharacter);
756 } 753 }
757 754
758 m_layoutTextInfo.m_lineBreakIterator.setPriorContext(lastCharacter, secondTo LastCharacter); 755 m_layoutTextInfo.m_lineBreakIterator.setPriorContext(lastCharacter, secondTo LastCharacter);
759 756
760 wordMeasurements.grow(wordMeasurements.size() + 1); 757 wordMeasurements.grow(wordMeasurements.size() + 1);
761 WordMeasurement& wordMeasurement = wordMeasurements.last(); 758 WordMeasurement& wordMeasurement = wordMeasurements.last();
762 wordMeasurement.layoutText = layoutText; 759 wordMeasurement.layoutText = layoutText;
763 760
(...skipping 23 matching lines...) Expand all
787 return true; 784 return true;
788 } 785 }
789 if (!hyphenated && m_lineBreak.previousInSameNode() == softHyphenCharact er) { 786 if (!hyphenated && m_lineBreak.previousInSameNode() == softHyphenCharact er) {
790 hyphenated = true; 787 hyphenated = true;
791 m_atEnd = true; 788 m_atEnd = true;
792 } 789 }
793 } 790 }
794 return false; 791 return false;
795 } 792 }
796 793
797 inline void BreakingContext::prepareForNextCharacter(const LineLayoutText& layou tText, bool& prohibitBreakInside, bool previousCharacterIsSpace, bool previousCh aracterShouldCollapseIfPreWap) 794 inline void BreakingContext::prepareForNextCharacter(const LineLayoutText& layou tText, bool& prohibitBreakInside, bool previousCharacterIsSpace)
798 { 795 {
799 if (layoutText.isSVGInlineText() && m_current.offset()) { 796 if (layoutText.isSVGInlineText() && m_current.offset()) {
800 // Force creation of new InlineBoxes for each absolute positioned charac ter (those that start new text chunks). 797 // Force creation of new InlineBoxes for each absolute positioned charac ter (those that start new text chunks).
801 if (LineLayoutSVGInlineText(layoutText).characterStartsNewTextChunk(m_cu rrent.offset())) 798 if (LineLayoutSVGInlineText(layoutText).characterStartsNewTextChunk(m_cu rrent.offset()))
802 m_lineMidpointState.ensureCharacterGetsLineBox(m_current); 799 m_lineMidpointState.ensureCharacterGetsLineBox(m_current);
803 } 800 }
804 if (prohibitBreakInside) { 801 if (prohibitBreakInside) {
805 m_current.setNextBreakablePosition(layoutText.textLength()); 802 m_current.setNextBreakablePosition(layoutText.textLength());
806 prohibitBreakInside = false; 803 prohibitBreakInside = false;
807 } 804 }
808 if (m_currentCharacterIsSpace && !previousCharacterIsSpace) { 805 if (m_currentCharacterIsSpace && !previousCharacterIsSpace) {
809 m_startOfIgnoredSpaces.setObject(m_current.object()); 806 m_startOfIgnoredSpaces.setObject(m_current.object());
810 m_startOfIgnoredSpaces.setOffset(m_current.offset()); 807 m_startOfIgnoredSpaces.setOffset(m_current.offset());
811 } 808 }
812 if (!m_currentCharacterIsSpace && previousCharacterShouldCollapseIfPreWap) { 809 if (!m_currentCharacterIsSpace && previousCharacterIsSpace) {
813 if (m_autoWrap && m_currentStyle->breakOnlyAfterWhiteSpace()) 810 if (m_autoWrap && m_currentStyle->breakOnlyAfterWhiteSpace())
814 m_lineBreak.moveTo(m_current.object(), m_current.offset(), m_current .nextBreakablePosition()); 811 m_lineBreak.moveTo(m_current.object(), m_current.offset(), m_current .nextBreakablePosition());
815 } 812 }
816 if (m_collapseWhiteSpace && m_currentCharacterIsSpace && !m_ignoringSpaces) 813 if (m_collapseWhiteSpace && m_currentCharacterIsSpace && !m_ignoringSpaces)
817 m_trailingObjects.setTrailingWhitespace(LineLayoutText(m_current.object( ))); 814 m_trailingObjects.setTrailingWhitespace(LineLayoutText(m_current.object( )));
818 else if (!m_currentStyle->collapseWhiteSpace() || !m_currentCharacterIsSpace ) 815 else if (!m_currentStyle->collapseWhiteSpace() || !m_currentCharacterIsSpace )
819 m_trailingObjects.clear(); 816 m_trailingObjects.clear();
820 } 817 }
821 818
822 819
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 977
981 if (style.textIndentType() == TextIndentHanging) 978 if (style.textIndentType() == TextIndentHanging)
982 shouldIndentText = shouldIndentText == IndentText ? DoNotIndentText : In dentText; 979 shouldIndentText = shouldIndentText == IndentText ? DoNotIndentText : In dentText;
983 980
984 return shouldIndentText; 981 return shouldIndentText;
985 } 982 }
986 983
987 } 984 }
988 985
989 #endif // BreakingContextInlineHeaders_h 986 #endif // BreakingContextInlineHeaders_h
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/platform/mac/fast/text/whitespace/tab-character-basics-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698