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;