Title: [160259] trunk/Source/WebCore
Revision
160259
Author
[email protected]
Date
2013-12-06 16:33:42 -0800 (Fri, 06 Dec 2013)

Log 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:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (160258 => 160259)


--- trunk/Source/WebCore/ChangeLog	2013-12-07 00:10:05 UTC (rev 160258)
+++ trunk/Source/WebCore/ChangeLog	2013-12-07 00:33:42 UTC (rev 160259)
@@ -1,3 +1,31 @@
+2013-12-06  Antti Koivisto  <[email protected]>
+
+        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:
+
 2013-12-04  Jer Noble  <[email protected]>
 
         [MSE] Refactor MediaSourceBase back into MediaSource

Modified: trunk/Source/WebCore/rendering/RenderQuote.cpp (160258 => 160259)


--- trunk/Source/WebCore/rendering/RenderQuote.cpp	2013-12-07 00:10:05 UTC (rev 160258)
+++ trunk/Source/WebCore/rendering/RenderQuote.cpp	2013-12-07 00:33:42 UTC (rev 160259)
@@ -62,7 +62,7 @@
 void RenderQuote::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
 {
     RenderText::styleDidChange(diff, oldStyle);
-    setText(originalText());
+    setText(originalText(), true);
 }
 
 const unsigned maxDistinctQuoteCharacters = 16;
@@ -452,7 +452,7 @@
     if (m_depth == depth)
         return;
     m_depth = depth;
-    setText(originalText());
+    setText(originalText(), true);
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/RenderText.cpp (160258 => 160259)


--- trunk/Source/WebCore/rendering/RenderText.cpp	2013-12-07 00:10:05 UTC (rev 160258)
+++ trunk/Source/WebCore/rendering/RenderText.cpp	2013-12-07 00:33:42 UTC (rev 160259)
@@ -104,6 +104,15 @@
     int m_lastTypedCharacterOffset;
 };
 
+
+typedef HashMap<const RenderText*, String> OriginalTextMap;
+
+static OriginalTextMap& originalTextMap()
+{
+    DEFINE_STATIC_LOCAL(OriginalTextMap, map, ());
+    return map;
+}
+
 static void makeCapitalized(String* string, UChar previous)
 {
     // FIXME: Need to change this to use u_strToTitle instead of u_totitle and to consider locale.
@@ -154,6 +163,7 @@
     , m_isAllASCII(text.containsOnlyASCII())
     , m_knownToHaveNoOverflowAndNoFallbackFonts(false)
     , m_useBackslashAsYenSymbol(false)
+    , m_originalTextDiffersFromRendered(false)
 #if ENABLE(IOS_TEXT_AUTOSIZING)
     , m_candidateComputedTextSize(0)
 #endif
@@ -177,6 +187,7 @@
     , m_isAllASCII(text.containsOnlyASCII())
     , m_knownToHaveNoOverflowAndNoFallbackFonts(false)
     , m_useBackslashAsYenSymbol(false)
+    , m_originalTextDiffersFromRendered(false)
 #if ENABLE(IOS_TEXT_AUTOSIZING)
     , m_candidateComputedTextSize(0)
 #endif
@@ -192,14 +203,12 @@
     view().frameView().incrementVisuallyNonEmptyCharacterCount(textLength());
 }
 
-#ifndef NDEBUG
-
 RenderText::~RenderText()
 {
+    if (m_originalTextDiffersFromRendered)
+        originalTextMap().remove(this);
 }
 
-#endif
-
 const char* RenderText::renderName() const
 {
     return "RenderText";
@@ -253,7 +262,7 @@
     ETextTransform oldTransform = oldStyle ? oldStyle->textTransform() : TTNONE;
     ETextSecurity oldSecurity = oldStyle ? oldStyle->textSecurity() : TSNONE;
     if (needsResetText || oldTransform != newStyle.textTransform() || oldSecurity != newStyle.textSecurity())
-        transformText();
+        RenderText::setText(originalText(), true);
 }
 
 void RenderText::removeAndDestroyTextBoxes()
@@ -279,7 +288,7 @@
 
 String RenderText::originalText() const
 {
-    return textNode() ? textNode()->data() : String();
+    return m_originalTextDiffersFromRendered ? originalTextMap().get(this) : m_text;
 }
 
 void RenderText::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accumulatedOffset) const
@@ -970,13 +979,6 @@
     setText(text, force || m_linesDirty);
 }
 
-void RenderText::transformText()
-{
-    String textToTransform = originalText();
-    if (!textToTransform.isNull())
-        setText(textToTransform, true);
-}
-
 static inline bool isInlineFlowOrEmptyText(const RenderObject* o)
 {
     if (o->isRenderInline())
@@ -1023,6 +1025,13 @@
 void RenderText::setTextInternal(const String& text)
 {
     ASSERT(!text.isNull());
+
+    if (m_originalTextDiffersFromRendered) {
+        originalTextMap().remove(this);
+        m_originalTextDiffersFromRendered = false;
+    }
+    String originalText = text;
+
     m_text = text;
 
     if (m_useBackslashAsYenSymbol)
@@ -1063,6 +1072,11 @@
 
     m_isAllASCII = m_text.containsOnlyASCII();
     m_canUseSimpleFontCodePath = computeCanUseSimpleFontCodePath();
+
+    if (m_text != originalText) {
+        originalTextMap().add(this, originalText);
+        m_originalTextDiffersFromRendered = true;
+    }
 }
 
 void RenderText::secureText(UChar mask)
@@ -1091,7 +1105,7 @@
 {
     ASSERT(!text.isNull());
 
-    if (!force && m_text == text)
+    if (!force && text == originalText())
         return;
 
     setTextInternal(text);

Modified: trunk/Source/WebCore/rendering/RenderText.h (160258 => 160259)


--- trunk/Source/WebCore/rendering/RenderText.h	2013-12-07 00:10:05 UTC (rev 160258)
+++ trunk/Source/WebCore/rendering/RenderText.h	2013-12-07 00:33:42 UTC (rev 160259)
@@ -37,9 +37,8 @@
 public:
     RenderText(Text&, const String&);
     RenderText(Document&, const String&);
-#ifndef NDEBUG
+
     virtual ~RenderText();
-#endif
 
     virtual const char* renderName() const OVERRIDE;
 
@@ -107,8 +106,6 @@
     virtual void setText(const String&, bool force = false);
     void setTextWithOffset(const String&, unsigned offset, unsigned len, bool force = false);
 
-    virtual void transformText();
-
     virtual bool canBeSelectionLeaf() const OVERRIDE { return true; }
     virtual void setSelectionState(SelectionState s) OVERRIDE FINAL;
     virtual LayoutRect selectionRectForRepaint(const RenderLayerModelObject* repaintContainer, bool clipToVisibleContent = true) OVERRIDE;
@@ -204,6 +201,7 @@
     bool m_canUseSimpleFontCodePath : 1;
     mutable bool m_knownToHaveNoOverflowAndNoFallbackFonts : 1;
     bool m_useBackslashAsYenSymbol : 1;
+    bool m_originalTextDiffersFromRendered : 1;
 
 #if ENABLE(IOS_TEXT_AUTOSIZING)
     // FIXME: This should probably be part of the text sizing structures in Document instead. That would save some memory.

Modified: trunk/Source/WebCore/rendering/RenderTextFragment.cpp (160258 => 160259)


--- trunk/Source/WebCore/rendering/RenderTextFragment.cpp	2013-12-07 00:10:05 UTC (rev 160258)
+++ trunk/Source/WebCore/rendering/RenderTextFragment.cpp	2013-12-07 00:33:42 UTC (rev 160259)
@@ -58,12 +58,6 @@
 {
 }
 
-String RenderTextFragment::originalText() const
-{
-    String result = textNode() ? textNode()->data() : contentString();
-    return result.substring(start(), end());
-}
-
 bool RenderTextFragment::canBeSelectionLeaf() const
 {
     return textNode() && textNode()->rendererIsEditable();
@@ -103,14 +97,6 @@
     textNode()->setRenderer(this);
 }
 
-void RenderTextFragment::transformText()
-{
-    // Don't reset first-letter here because we are only transforming the truncated fragment.
-    String textToTransform = originalText();
-    if (!textToTransform.isNull())
-        RenderText::setText(textToTransform, true);
-}
-
 UChar RenderTextFragment::previousCharacter() const
 {
     if (start()) {

Modified: trunk/Source/WebCore/rendering/RenderTextFragment.h (160258 => 160259)


--- trunk/Source/WebCore/rendering/RenderTextFragment.h	2013-12-07 00:10:05 UTC (rev 160258)
+++ trunk/Source/WebCore/rendering/RenderTextFragment.h	2013-12-07 00:33:42 UTC (rev 160259)
@@ -50,12 +50,9 @@
     void setFirstLetter(RenderBoxModelObject& firstLetter) { m_firstLetter = &firstLetter; }
 
     StringImpl* contentString() const { return m_contentString.impl(); }
-    virtual String originalText() const OVERRIDE;
 
     virtual void setText(const String&, bool force = false) OVERRIDE;
 
-    virtual void transformText() OVERRIDE;
-
     const String& altText() const { return m_altText; }
     void setAltText(const String& altText) { m_altText = altText; }
     

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGInlineText.cpp (160258 => 160259)


--- trunk/Source/WebCore/rendering/svg/RenderSVGInlineText.cpp	2013-12-07 00:10:05 UTC (rev 160258)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGInlineText.cpp	2013-12-07 00:33:42 UTC (rev 160259)
@@ -38,6 +38,7 @@
 #include "SVGRootInlineBox.h"
 #include "StyleFontSizeFunctions.h"
 #include "StyleResolver.h"
+#include "Text.h"
 #include "VisiblePosition.h"
 
 namespace WebCore {
@@ -74,6 +75,11 @@
 {
 }
 
+String RenderSVGInlineText::originalText() const
+{
+    return textNode().data();
+}
+
 void RenderSVGInlineText::setTextInternal(const String& text)
 {
     RenderText::setTextInternal(text);

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGInlineText.h (160258 => 160259)


--- trunk/Source/WebCore/rendering/svg/RenderSVGInlineText.h	2013-12-07 00:10:05 UTC (rev 160258)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGInlineText.h	2013-12-07 00:33:42 UTC (rev 160259)
@@ -52,6 +52,7 @@
 private:
     virtual const char* renderName() const OVERRIDE { return "RenderSVGInlineText"; }
 
+    virtual String originalText() const OVERRIDE;
     virtual void setTextInternal(const String&) OVERRIDE;
     virtual void styleDidChange(StyleDifference, const RenderStyle*) OVERRIDE;
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to