Changeset 185729 in webkit


Ignore:
Timestamp:
Jun 18, 2015 4:59:19 PM (9 years ago)
Author:
mmaxfield@apple.com
Message:

[CSS3] Add support for the word-break:keep-all CSS property
https://bugs.webkit.org/show_bug.cgi?id=123782

Reviewed by Darin Adler.

Source/WebCore:

Add support for word-break:keep-all CSS property by CSS3 spec:
http://www.w3.org/TR/2013/WD-css-text-3-20131010/#word-break-property

Test: fast/text/word-break-keep-all.html

  • css/CSSParser.cpp:

(WebCore::isValidKeywordPropertyAndValue):

  • css/CSSPrimitiveValueMappings.h:

(WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
(WebCore::CSSPrimitiveValue::operator EWordBreak):

  • css/CSSValueKeywords.in:
  • rendering/RenderText.cpp:

(WebCore::RenderText::computePreferredLogicalWidths):

  • rendering/break_lines.h:

(WebCore::nextBreakablePositionKeepingAllWords):
(WebCore::nextBreakablePositionKeepingAllWordsIgnoringNBSP):
(WebCore::isBreakable):

  • rendering/line/BreakingContext.h:

(WebCore::BreakingContext::handleText):
(WebCore::BreakingContext::optimalLineBreakLocationForTrailingWord):

  • rendering/style/RenderStyleConstants.h:

LayoutTests:

  • fast/text/word-break-keep-all.html: Added.
  • platform/mac/fast/text/word-break-keep-all-expected.png: Added.
  • platform/mac/fast/text/word-break-keep-all-expected.txt: Added.
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r185718 r185729  
     12015-06-18  KyungTae Kim  <ktf.kim@samsung.com> and Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        [CSS3] Add support for the word-break:keep-all CSS property
     4        https://bugs.webkit.org/show_bug.cgi?id=123782
     5
     6        Reviewed by Darin Adler.
     7
     8        * fast/text/word-break-keep-all.html: Added.
     9        * platform/mac/fast/text/word-break-keep-all-expected.png: Added.
     10        * platform/mac/fast/text/word-break-keep-all-expected.txt: Added.
     11
    1122015-06-18  Conrad Shultz  <conrad_shultz@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r185727 r185729  
     12015-06-18  KyungTae Kim  <ktf.kim@samsung.com> and Myles C. Maxfield  <mmaxfield@apple.com>
     2
     3        [CSS3] Add support for the word-break:keep-all CSS property
     4        https://bugs.webkit.org/show_bug.cgi?id=123782
     5
     6        Reviewed by Darin Adler.
     7
     8        Add support for word-break:keep-all CSS property by CSS3 spec:
     9        http://www.w3.org/TR/2013/WD-css-text-3-20131010/#word-break-property
     10
     11        Test: fast/text/word-break-keep-all.html
     12
     13        * css/CSSParser.cpp:
     14        (WebCore::isValidKeywordPropertyAndValue):
     15        * css/CSSPrimitiveValueMappings.h:
     16        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue):
     17        (WebCore::CSSPrimitiveValue::operator EWordBreak):
     18        * css/CSSValueKeywords.in:
     19        * rendering/RenderText.cpp:
     20        (WebCore::RenderText::computePreferredLogicalWidths):
     21        * rendering/break_lines.h:
     22        (WebCore::nextBreakablePositionKeepingAllWords):
     23        (WebCore::nextBreakablePositionKeepingAllWordsIgnoringNBSP):
     24        (WebCore::isBreakable):
     25        * rendering/line/BreakingContext.h:
     26        (WebCore::BreakingContext::handleText):
     27        (WebCore::BreakingContext::optimalLineBreakLocationForTrailingWord):
     28        * rendering/style/RenderStyleConstants.h:
     29
    1302015-06-18  Jon Lee  <jonlee@apple.com>
    231
  • trunk/Source/WebCore/css/CSSParser.cpp

    r185595 r185729  
    10301030            return true;
    10311031        break;
    1032     case CSSPropertyWordBreak: // normal | break-all | break-word (this is a custom extension)
    1033         if (valueID == CSSValueNormal || valueID == CSSValueBreakAll || valueID == CSSValueBreakWord)
     1032    case CSSPropertyWordBreak: // normal | break-all | keep-all | break-word (this is a custom extension)
     1033        if (valueID == CSSValueNormal || valueID == CSSValueBreakAll || valueID == CSSValueKeepAll || valueID == CSSValueBreakWord)
    10341034            return true;
    10351035        break;
  • trunk/Source/WebCore/css/CSSPrimitiveValueMappings.h

    r185481 r185729  
    30113011        m_value.valueID = CSSValueBreakAll;
    30123012        break;
     3013    case KeepAllWordBreak:
     3014        m_value.valueID = CSSValueKeepAll;
     3015        break;
    30133016    case BreakWordBreak:
    30143017        m_value.valueID = CSSValueBreakWord;
     
    30243027    case CSSValueBreakAll:
    30253028        return BreakAllWordBreak;
     3029    case CSSValueKeepAll:
     3030        return KeepAllWordBreak;
    30263031    case CSSValueBreakWord:
    30273032        return BreakWordBreak;
  • trunk/Source/WebCore/css/CSSValueKeywords.in

    r185481 r185729  
    681681//
    682682break-all
     683keep-all
    683684
    684685//
  • trunk/Source/WebCore/rendering/RenderText.cpp

    r185393 r185729  
    739739    bool breakNBSP = style.autoWrap() && style.nbspMode() == SPACE;
    740740    bool breakAll = (style.wordBreak() == BreakAllWordBreak || style.wordBreak() == BreakWordBreak) && style.autoWrap();
     741    bool keepAllWords = style.wordBreak() == KeepAllWordBreak;
    741742    bool isLooseCJKMode = breakIterator.isLooseCJKMode();
    742743
     
    784785        }
    785786
    786         bool hasBreak = breakAll || isBreakable(breakIterator, i, nextBreakable, breakNBSP, isLooseCJKMode);
     787        bool hasBreak = breakAll || isBreakable(breakIterator, i, nextBreakable, breakNBSP, isLooseCJKMode, keepAllWords);
    787788        bool betweenWords = true;
    788789        int j = i;
     
    792793                break;
    793794            c = uncheckedCharacterAt(j);
    794             if (isBreakable(breakIterator, j, nextBreakable, breakNBSP, isLooseCJKMode) && characterAt(j - 1) != softHyphen)
     795            if (isBreakable(breakIterator, j, nextBreakable, breakNBSP, isLooseCJKMode, keepAllWords) && characterAt(j - 1) != softHyphen)
    795796                break;
    796797            if (breakAll) {
  • trunk/Source/WebCore/rendering/break_lines.h

    r180301 r185729  
    162162}
    163163
    164 inline int nextBreakablePosition(LazyLineBreakIterator& lazyBreakIterator, int pos)
    165 {
    166     String string = lazyBreakIterator.string();
    167     if (string.is8Bit())
    168         return nextBreakablePositionNonLoosely<LChar, NBSPBehavior::TreatNBSPAsBreak>(lazyBreakIterator, string.characters8(), string.length(), pos);
    169     return nextBreakablePositionNonLoosely<UChar, NBSPBehavior::TreatNBSPAsBreak>(lazyBreakIterator, string.characters16(), string.length(), pos);
     164template<typename CharacterType, NBSPBehavior nbspBehavior>
     165inline unsigned nextBreakablePositionKeepingAllWords(const CharacterType* string, unsigned length, unsigned startPosition)
     166{
     167    for (unsigned i = startPosition; i < length; i++) {
     168        if (isBreakableSpace<nbspBehavior>(string[i]))
     169            return i;
     170    }
     171    return length;
     172}
     173
     174inline unsigned nextBreakablePositionKeepingAllWords(LazyLineBreakIterator& lazyBreakIterator, int startPosition)
     175{
     176    String string = lazyBreakIterator.string();
     177    if (string.is8Bit())
     178        return nextBreakablePositionKeepingAllWords<LChar, NBSPBehavior::TreatNBSPAsBreak>(string.characters8(), string.length(), startPosition);
     179    return nextBreakablePositionKeepingAllWords<UChar, NBSPBehavior::TreatNBSPAsBreak>(string.characters16(), string.length(), startPosition);
     180}
     181
     182inline unsigned nextBreakablePositionKeepingAllWordsIgnoringNBSP(LazyLineBreakIterator& iterator, int startPosition)
     183{
     184    String string = iterator.string();
     185    if (string.is8Bit())
     186        return nextBreakablePositionKeepingAllWords<LChar, NBSPBehavior::IgnoreNBSP>(string.characters8(), string.length(), startPosition);
     187    return nextBreakablePositionKeepingAllWords<UChar, NBSPBehavior::IgnoreNBSP>(string.characters16(), string.length(), startPosition);
     188}
     189
     190inline int nextBreakablePosition(LazyLineBreakIterator& iterator, int pos)
     191{
     192    String string = iterator.string();
     193    if (string.is8Bit())
     194        return nextBreakablePositionNonLoosely<LChar, NBSPBehavior::TreatNBSPAsBreak>(iterator, string.characters8(), string.length(), pos);
     195    return nextBreakablePositionNonLoosely<UChar, NBSPBehavior::TreatNBSPAsBreak>(iterator, string.characters16(), string.length(), pos);
    170196}
    171197
     
    194220}
    195221
    196 inline bool isBreakable(LazyLineBreakIterator& lazyBreakIterator, int pos, int& nextBreakable, bool breakNBSP, bool isLooseMode)
     222inline bool isBreakable(LazyLineBreakIterator& lazyBreakIterator, int pos, int& nextBreakable, bool breakNBSP, bool isLooseMode, bool keepAllWords)
    197223{
    198224    if (pos <= nextBreakable)
    199225        return pos == nextBreakable;
    200226
    201     if (isLooseMode) {
     227    if (keepAllWords) {
     228        if (breakNBSP)
     229            nextBreakable = static_cast<int>(nextBreakablePositionKeepingAllWords(lazyBreakIterator, pos));
     230        else
     231            nextBreakable = static_cast<int>(nextBreakablePositionKeepingAllWordsIgnoringNBSP(lazyBreakIterator, pos));
     232    } else if (isLooseMode) {
    202233        if (breakNBSP)
    203234            nextBreakable = nextBreakablePositionLoose(lazyBreakIterator, pos);
  • trunk/Source/WebCore/rendering/line/BreakingContext.h

    r184653 r185729  
    745745    bool midWordBreak = false;
    746746    bool breakAll = m_currentStyle->wordBreak() == BreakAllWordBreak && m_autoWrap;
     747    bool keepAllWords = m_currentStyle->wordBreak() == KeepAllWordBreak;
    747748    float hyphenWidth = 0;
    748749    bool isLooseCJKMode = false;
     
    799800
    800801        int nextBreakablePosition = m_current.nextBreakablePosition();
    801         bool betweenWords = c == '\n' || (m_currWS != PRE && !m_atStart && isBreakable(m_renderTextInfo.lineBreakIterator, m_current.offset(), nextBreakablePosition, breakNBSP, isLooseCJKMode)
     802        bool betweenWords = c == '\n' || (m_currWS != PRE && !m_atStart && isBreakable(m_renderTextInfo.lineBreakIterator, m_current.offset(), nextBreakablePosition, breakNBSP, isLooseCJKMode, keepAllWords)
    802803            && (style.hyphens() != HyphensNone || (m_current.previousInSameNode() != softHyphen)));
    803804        m_current.setNextBreakablePosition(nextBreakablePosition);
     
    12201221    bool breakNBSP = m_autoWrap && m_currentStyle->nbspMode() == SPACE;
    12211222    int nextBreakablePosition = lineBreak.nextBreakablePosition();
    1222     isBreakable(m_renderTextInfo.lineBreakIterator, lineBreak.offset() + 1, nextBreakablePosition, breakNBSP, isLooseCJKMode);
     1223    isBreakable(m_renderTextInfo.lineBreakIterator, lineBreak.offset() + 1, nextBreakablePosition, breakNBSP, isLooseCJKMode, m_currentStyle->wordBreak() == KeepAllWordBreak);
    12231224    if (nextBreakablePosition < 0 || static_cast<unsigned>(nextBreakablePosition) != renderText.textLength())
    12241225        return lineBreak;
  • trunk/Source/WebCore/rendering/style/RenderStyleConstants.h

    r183748 r185729  
    286286};
    287287
    288 // Word Break Values. Matches WinIE, rather than CSS3
    289 
    290288enum EWordBreak {
    291     NormalWordBreak, BreakAllWordBreak, BreakWordBreak
     289    NormalWordBreak, BreakAllWordBreak, KeepAllWordBreak, BreakWordBreak
    292290};
    293291
Note: See TracChangeset for help on using the changeset viewer.