Changeset 160259 in webkit


Ignore:
Timestamp:
Dec 6, 2013 4:33:42 PM (10 years ago)
Author:
Antti Koivisto
Message:

Save original text for RenderText to a map
https://bugs.webkit.org/show_bug.cgi?id=125278

Reviewed by Darin Adler.

Currently the original text is fetched from the Text node. This is one of the few things
where we use the RenderText node pointer and is stopping Text nodes from being anonymous.

It is very rare of original text to differ from the actual text so we can just squirrel the
original to a map when it differs. This is also simplifies the code.

  • rendering/RenderQuote.cpp:

(WebCore::RenderQuote::styleDidChange):
(WebCore::RenderQuote::updateDepth):

  • rendering/RenderText.cpp:

(WebCore::originalTextMap):
(WebCore::RenderText::RenderText):
(WebCore::RenderText::~RenderText):
(WebCore::RenderText::styleDidChange):
(WebCore::RenderText::originalText):
(WebCore::RenderText::setTextInternal):
(WebCore::RenderText::setText):

  • rendering/RenderText.h:
  • rendering/RenderTextFragment.cpp:
  • rendering/RenderTextFragment.h:
Location:
trunk/Source/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r160258 r160259  
     12013-12-06  Antti Koivisto  <antti@apple.com>
     2
     3        Save original text for RenderText to a map
     4        https://bugs.webkit.org/show_bug.cgi?id=125278
     5
     6        Reviewed by Darin Adler.
     7       
     8        Currently the original text is fetched from the Text node. This is one of the few things
     9        where we use the RenderText node pointer and is stopping Text nodes from being anonymous.
     10       
     11        It is very rare of original text to differ from the actual text so we can just squirrel the
     12        original to a map when it differs. This is also simplifies the code.
     13
     14        * rendering/RenderQuote.cpp:
     15        (WebCore::RenderQuote::styleDidChange):
     16        (WebCore::RenderQuote::updateDepth):
     17        * rendering/RenderText.cpp:
     18        (WebCore::originalTextMap):
     19        (WebCore::RenderText::RenderText):
     20        (WebCore::RenderText::~RenderText):
     21        (WebCore::RenderText::styleDidChange):
     22        (WebCore::RenderText::originalText):
     23        (WebCore::RenderText::setTextInternal):
     24        (WebCore::RenderText::setText):
     25        * rendering/RenderText.h:
     26        * rendering/RenderTextFragment.cpp:
     27        * rendering/RenderTextFragment.h:
     28
    1292013-12-04  Jer Noble  <jer.noble@apple.com>
    230
  • trunk/Source/WebCore/rendering/RenderQuote.cpp

    r158163 r160259  
    6363{
    6464    RenderText::styleDidChange(diff, oldStyle);
    65     setText(originalText());
     65    setText(originalText(), true);
    6666}
    6767
     
    453453        return;
    454454    m_depth = depth;
    455     setText(originalText());
     455    setText(originalText(), true);
    456456}
    457457
  • trunk/Source/WebCore/rendering/RenderText.cpp

    r160236 r160259  
    105105};
    106106
     107
     108typedef HashMap<const RenderText*, String> OriginalTextMap;
     109
     110static OriginalTextMap& originalTextMap()
     111{
     112    DEFINE_STATIC_LOCAL(OriginalTextMap, map, ());
     113    return map;
     114}
     115
    107116static void makeCapitalized(String* string, UChar previous)
    108117{
     
    155164    , m_knownToHaveNoOverflowAndNoFallbackFonts(false)
    156165    , m_useBackslashAsYenSymbol(false)
     166    , m_originalTextDiffersFromRendered(false)
    157167#if ENABLE(IOS_TEXT_AUTOSIZING)
    158168    , m_candidateComputedTextSize(0)
     
    178188    , m_knownToHaveNoOverflowAndNoFallbackFonts(false)
    179189    , m_useBackslashAsYenSymbol(false)
     190    , m_originalTextDiffersFromRendered(false)
    180191#if ENABLE(IOS_TEXT_AUTOSIZING)
    181192    , m_candidateComputedTextSize(0)
     
    193204}
    194205
    195 #ifndef NDEBUG
    196 
    197206RenderText::~RenderText()
    198207{
    199 }
    200 
    201 #endif
     208    if (m_originalTextDiffersFromRendered)
     209        originalTextMap().remove(this);
     210}
    202211
    203212const char* RenderText::renderName() const
     
    254263    ETextSecurity oldSecurity = oldStyle ? oldStyle->textSecurity() : TSNONE;
    255264    if (needsResetText || oldTransform != newStyle.textTransform() || oldSecurity != newStyle.textSecurity())
    256         transformText();
     265        RenderText::setText(originalText(), true);
    257266}
    258267
     
    280289String RenderText::originalText() const
    281290{
    282     return textNode() ? textNode()->data() : String();
     291    return m_originalTextDiffersFromRendered ? originalTextMap().get(this) : m_text;
    283292}
    284293
     
    971980}
    972981
    973 void RenderText::transformText()
    974 {
    975     String textToTransform = originalText();
    976     if (!textToTransform.isNull())
    977         setText(textToTransform, true);
    978 }
    979 
    980982static inline bool isInlineFlowOrEmptyText(const RenderObject* o)
    981983{
     
    10241026{
    10251027    ASSERT(!text.isNull());
     1028
     1029    if (m_originalTextDiffersFromRendered) {
     1030        originalTextMap().remove(this);
     1031        m_originalTextDiffersFromRendered = false;
     1032    }
     1033    String originalText = text;
     1034
    10261035    m_text = text;
    10271036
     
    10641073    m_isAllASCII = m_text.containsOnlyASCII();
    10651074    m_canUseSimpleFontCodePath = computeCanUseSimpleFontCodePath();
     1075
     1076    if (m_text != originalText) {
     1077        originalTextMap().add(this, originalText);
     1078        m_originalTextDiffersFromRendered = true;
     1079    }
    10661080}
    10671081
     
    10921106    ASSERT(!text.isNull());
    10931107
    1094     if (!force && m_text == text)
     1108    if (!force && text == originalText())
    10951109        return;
    10961110
  • trunk/Source/WebCore/rendering/RenderText.h

    r160236 r160259  
    3838    RenderText(Text&, const String&);
    3939    RenderText(Document&, const String&);
    40 #ifndef NDEBUG
     40
    4141    virtual ~RenderText();
    42 #endif
    4342
    4443    virtual const char* renderName() const OVERRIDE;
     
    107106    virtual void setText(const String&, bool force = false);
    108107    void setTextWithOffset(const String&, unsigned offset, unsigned len, bool force = false);
    109 
    110     virtual void transformText();
    111108
    112109    virtual bool canBeSelectionLeaf() const OVERRIDE { return true; }
     
    205202    mutable bool m_knownToHaveNoOverflowAndNoFallbackFonts : 1;
    206203    bool m_useBackslashAsYenSymbol : 1;
     204    bool m_originalTextDiffersFromRendered : 1;
    207205
    208206#if ENABLE(IOS_TEXT_AUTOSIZING)
  • trunk/Source/WebCore/rendering/RenderTextFragment.cpp

    r158561 r160259  
    5959}
    6060
    61 String RenderTextFragment::originalText() const
    62 {
    63     String result = textNode() ? textNode()->data() : contentString();
    64     return result.substring(start(), end());
    65 }
    66 
    6761bool RenderTextFragment::canBeSelectionLeaf() const
    6862{
     
    10498}
    10599
    106 void RenderTextFragment::transformText()
    107 {
    108     // Don't reset first-letter here because we are only transforming the truncated fragment.
    109     String textToTransform = originalText();
    110     if (!textToTransform.isNull())
    111         RenderText::setText(textToTransform, true);
    112 }
    113 
    114100UChar RenderTextFragment::previousCharacter() const
    115101{
  • trunk/Source/WebCore/rendering/RenderTextFragment.h

    r159591 r160259  
    5151
    5252    StringImpl* contentString() const { return m_contentString.impl(); }
    53     virtual String originalText() const OVERRIDE;
    5453
    5554    virtual void setText(const String&, bool force = false) OVERRIDE;
    56 
    57     virtual void transformText() OVERRIDE;
    5855
    5956    const String& altText() const { return m_altText; }
  • trunk/Source/WebCore/rendering/svg/RenderSVGInlineText.cpp

    r158998 r160259  
    3939#include "StyleFontSizeFunctions.h"
    4040#include "StyleResolver.h"
     41#include "Text.h"
    4142#include "VisiblePosition.h"
    4243
     
    7576}
    7677
     78String RenderSVGInlineText::originalText() const
     79{
     80    return textNode().data();
     81}
     82
    7783void RenderSVGInlineText::setTextInternal(const String& text)
    7884{
  • trunk/Source/WebCore/rendering/svg/RenderSVGInlineText.h

    r158718 r160259  
    5353    virtual const char* renderName() const OVERRIDE { return "RenderSVGInlineText"; }
    5454
     55    virtual String originalText() const OVERRIDE;
    5556    virtual void setTextInternal(const String&) OVERRIDE;
    5657    virtual void styleDidChange(StyleDifference, const RenderStyle*) OVERRIDE;
Note: See TracChangeset for help on using the changeset viewer.