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

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

Issue 2334143002: Fix BreakingContext::rewindToMidWordBreak to set m_currentCharacterIsSpace (Closed)
Patch Set: Fix Created 4 years, 3 months 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/fast/text/break-word-with-floats-expected.html ('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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 void commitAndUpdateLineBreakIfNeeded(); 108 void commitAndUpdateLineBreakIfNeeded();
109 InlineIterator handleEndOfLine(); 109 InlineIterator handleEndOfLine();
110 110
111 void clearLineBreakIfFitsOnLine() 111 void clearLineBreakIfFitsOnLine()
112 { 112 {
113 if (m_width.fitsOnLine() || m_lastWS == NOWRAP) 113 if (m_width.fitsOnLine() || m_lastWS == NOWRAP)
114 m_lineBreak.clear(); 114 m_lineBreak.clear();
115 } 115 }
116 116
117 private: 117 private:
118 void setCurrentCharacterIsSpace(UChar);
118 void skipTrailingWhitespace(InlineIterator&, const LineInfo&); 119 void skipTrailingWhitespace(InlineIterator&, const LineInfo&);
119 bool shouldMidWordBreak(UChar, LineLayoutText, const Font&, 120 bool shouldMidWordBreak(UChar, LineLayoutText, const Font&,
120 float& charWidth, float& widthFromLastBreakingOpportunity, 121 float& charWidth, float& widthFromLastBreakingOpportunity,
121 bool breakAll, int& nextBreakablePositionForBreakAll); 122 bool breakAll, int& nextBreakablePositionForBreakAll);
122 bool rewindToMidWordBreak(WordMeasurement&, int end, float width); 123 bool rewindToMidWordBreak(WordMeasurement&, int end, float width);
123 bool rewindToFirstMidWordBreak(LineLayoutText, const ComputedStyle&, const F ont&, bool breakAll, WordMeasurement&); 124 bool rewindToFirstMidWordBreak(LineLayoutText, const ComputedStyle&, const F ont&, bool breakAll, WordMeasurement&);
124 bool rewindToMidWordBreak(LineLayoutText, const ComputedStyle&, const Font&, bool breakAll, WordMeasurement&); 125 bool rewindToMidWordBreak(LineLayoutText, const ComputedStyle&, const Font&, bool breakAll, WordMeasurement&);
125 bool hyphenate(LineLayoutText, const ComputedStyle&, const Font&, const Hyph enation&, float lastSpaceWordSpacing, WordMeasurement&); 126 bool hyphenate(LineLayoutText, const ComputedStyle&, const Font&, const Hyph enation&, float lastSpaceWordSpacing, WordMeasurement&);
126 bool isBreakAtSoftHyphen() const; 127 bool isBreakAtSoftHyphen() const;
127 128
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM ENT CHARACTER) for replaced element. 521 // Update prior line break context characters, using U+FFFD (OBJECT REPLACEM ENT CHARACTER) for replaced element.
521 m_layoutTextInfo.m_lineBreakIterator.updatePriorContext(replacementCharacter ); 522 m_layoutTextInfo.m_lineBreakIterator.updatePriorContext(replacementCharacter );
522 } 523 }
523 524
524 inline void nextCharacter(UChar& currentCharacter, UChar& lastCharacter, UChar& secondToLastCharacter) 525 inline void nextCharacter(UChar& currentCharacter, UChar& lastCharacter, UChar& secondToLastCharacter)
525 { 526 {
526 secondToLastCharacter = lastCharacter; 527 secondToLastCharacter = lastCharacter;
527 lastCharacter = currentCharacter; 528 lastCharacter = currentCharacter;
528 } 529 }
529 530
531 ALWAYS_INLINE void BreakingContext::setCurrentCharacterIsSpace(UChar c)
532 {
533 m_currentCharacterIsSpace = c == spaceCharacter || c == tabulationCharacter || (!m_preservesNewline && (c == newlineCharacter));
534 }
535
530 inline float firstPositiveWidth(const WordMeasurements& wordMeasurements) 536 inline float firstPositiveWidth(const WordMeasurements& wordMeasurements)
531 { 537 {
532 for (size_t i = 0; i < wordMeasurements.size(); ++i) { 538 for (size_t i = 0; i < wordMeasurements.size(); ++i) {
533 if (wordMeasurements[i].width > 0) 539 if (wordMeasurements[i].width > 0)
534 return wordMeasurements[i].width; 540 return wordMeasurements[i].width;
535 } 541 }
536 return 0; 542 return 0;
537 } 543 }
538 544
539 ALWAYS_INLINE TextDirection textDirectionFromUnicode(WTF::Unicode::CharDirection direction) 545 ALWAYS_INLINE TextDirection textDirectionFromUnicode(WTF::Unicode::CharDirection direction)
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 } 604 }
599 } 605 }
600 606
601 ALWAYS_INLINE bool BreakingContext::rewindToMidWordBreak( 607 ALWAYS_INLINE bool BreakingContext::rewindToMidWordBreak(
602 WordMeasurement& wordMeasurement, int end, float width) 608 WordMeasurement& wordMeasurement, int end, float width)
603 { 609 {
604 wordMeasurement.endOffset = end; 610 wordMeasurement.endOffset = end;
605 wordMeasurement.width = width; 611 wordMeasurement.width = width;
606 612
607 m_current.moveTo(m_current.getLineLayoutItem(), end, m_current.nextBreakable Position()); 613 m_current.moveTo(m_current.getLineLayoutItem(), end, m_current.nextBreakable Position());
614 setCurrentCharacterIsSpace(m_current.current());
608 m_lineBreak.moveTo(m_current.getLineLayoutItem(), end, m_current.nextBreakab lePosition()); 615 m_lineBreak.moveTo(m_current.getLineLayoutItem(), end, m_current.nextBreakab lePosition());
609 return true; 616 return true;
610 } 617 }
611 618
612 ALWAYS_INLINE bool BreakingContext::rewindToFirstMidWordBreak(LineLayoutText tex t, 619 ALWAYS_INLINE bool BreakingContext::rewindToFirstMidWordBreak(LineLayoutText tex t,
613 const ComputedStyle& style, const Font& font, bool breakAll, 620 const ComputedStyle& style, const Font& font, bool breakAll,
614 WordMeasurement& wordMeasurement) 621 WordMeasurement& wordMeasurement)
615 { 622 {
616 int start = wordMeasurement.startOffset; 623 int start = wordMeasurement.startOffset;
617 int end; 624 int end;
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 // words with their trailing space, then subtract its width. 789 // words with their trailing space, then subtract its width.
783 float wordTrailingSpaceWidth = (font.getFontDescription().getTypesettingFeat ures() & Kerning) ? 790 float wordTrailingSpaceWidth = (font.getFontDescription().getTypesettingFeat ures() & Kerning) ?
784 font.width(constructTextRun(font, &spaceCharacter, 1, style, style.direc tion())) + wordSpacing 791 font.width(constructTextRun(font, &spaceCharacter, 1, style, style.direc tion())) + wordSpacing
785 : 0; 792 : 0;
786 793
787 UChar lastCharacter = m_layoutTextInfo.m_lineBreakIterator.lastCharacter(); 794 UChar lastCharacter = m_layoutTextInfo.m_lineBreakIterator.lastCharacter();
788 UChar secondToLastCharacter = m_layoutTextInfo.m_lineBreakIterator.secondToL astCharacter(); 795 UChar secondToLastCharacter = m_layoutTextInfo.m_lineBreakIterator.secondToL astCharacter();
789 for (; m_current.offset() < layoutText.textLength(); m_current.fastIncrement InTextNode()) { 796 for (; m_current.offset() < layoutText.textLength(); m_current.fastIncrement InTextNode()) {
790 bool previousCharacterIsSpace = m_currentCharacterIsSpace; 797 bool previousCharacterIsSpace = m_currentCharacterIsSpace;
791 UChar c = m_current.current(); 798 UChar c = m_current.current();
792 m_currentCharacterIsSpace = c == spaceCharacter || c == tabulationCharac ter || (!m_preservesNewline && (c == newlineCharacter)); 799 setCurrentCharacterIsSpace(c);
793 800
794 if (!m_collapseWhiteSpace || !m_currentCharacterIsSpace) { 801 if (!m_collapseWhiteSpace || !m_currentCharacterIsSpace) {
795 m_lineInfo.setEmpty(false); 802 m_lineInfo.setEmpty(false);
796 m_width.setTrailingWhitespaceWidth(0); 803 m_width.setTrailingWhitespaceWidth(0);
797 } 804 }
798 805
799 if (c == softHyphenCharacter && m_autoWrap && !hyphenWidth && !disableSo ftHyphen) { 806 if (c == softHyphenCharacter && m_autoWrap && !hyphenWidth && !disableSo ftHyphen) {
800 hyphenWidth = layoutText.hyphenWidth(font, textDirectionFromUnicode( m_resolver.position().direction())); 807 hyphenWidth = layoutText.hyphenWidth(font, textDirectionFromUnicode( m_resolver.position().direction()));
801 m_width.addUncommittedWidth(hyphenWidth); 808 m_width.addUncommittedWidth(hyphenWidth);
802 } 809 }
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 1202
1196 if (style.getTextIndentType() == TextIndentHanging) 1203 if (style.getTextIndentType() == TextIndentHanging)
1197 indentText = indentText == IndentText ? DoNotIndentText : IndentText; 1204 indentText = indentText == IndentText ? DoNotIndentText : IndentText;
1198 1205
1199 return indentText; 1206 return indentText;
1200 } 1207 }
1201 1208
1202 } // namespace blink 1209 } // namespace blink
1203 1210
1204 #endif // BreakingContextInlineHeaders_h 1211 #endif // BreakingContextInlineHeaders_h
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/text/break-word-with-floats-expected.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698