Title: [230452] trunk/Source/WebCore
Revision
230452
Author
commit-qu...@webkit.org
Date
2018-04-09 16:02:29 -0700 (Mon, 09 Apr 2018)

Log Message

Make InlineTextBox::createTextRun() take a const lvalue reference String
https://bugs.webkit.org/show_bug.cgi?id=184182

Patch by Said Abou-Hallawa <sabouhall...@apple.com> on 2018-04-09
Reviewed by Zalan Bujtas.

InlineTextBox::createTextRun() takes a non-const lvalue reference String.
It is tempting to change the signature of this method to take a const lvalue
reference. But this was done intentionally. TextRun is effectively a StringView:
it does not own the passed string. Having the argument a non-const lvalue
reference makes the compiler prevent calls like createTextRun("abc").

To have a better way to express the lifetime of TextRun, this patch does
the following:

-- It makes TextRun::m_text of type String instead of StringView.
-- It adds a new constructor which takes const String&. This constructor
   will addRef the underlying StringImpl when assigning it to m_text.
-- It keeps the constructor which takes a StringView. The caller of this
   constructor still has to make sure the underlying String outlives the
   TextRun. To avoid copying the underlying buffer of the StringView, we
   will not use  StringView::toString(). Instead we will use
   StringView::toStringWithoutCopying() which makes the returned String
   accesses the same buffer the StringView uses. In this case, the returned
   String is effectively a StringView.

* page/DebugPageOverlays.cpp:
(WebCore::drawRightAlignedText):
* platform/graphics/TextRun.cpp:
* platform/graphics/TextRun.h:
(WebCore::TextRun::TextRun):
(WebCore::TextRun::subRun const):
(WebCore::TextRun::length const):
(WebCore::TextRun::setText):
(WebCore::TextRun::string const): Deleted.
* rendering/InlineTextBox.cpp:
(WebCore::InlineTextBox::localSelectionRect const):
(WebCore::InlineTextBox::paint):
(WebCore::InlineTextBox::paintPlatformDocumentMarker):
(WebCore::InlineTextBox::paintMarkedTextBackground):
(WebCore::InlineTextBox::paintMarkedTextForeground):
(WebCore::InlineTextBox::paintMarkedTextDecoration):
(WebCore::InlineTextBox::offsetForPosition const):
(WebCore::InlineTextBox::positionForOffset const):
(WebCore::InlineTextBox::createTextRun const):
There is no need for this function to take a String argument anymore. The
reason for passing the String was to guarantee its lifetime by keeping
a copy of it in the caller side. Now there is no need for that. The TextRun
itself will keep this copy.

* rendering/InlineTextBox.h:
* rendering/RenderText.cpp:
(WebCore::RenderText::computeCanUseSimplifiedTextMeasuring const):
RenderText::text() returns StringImpl. The compiler wants us to be more
explicit about which constructor of TextRun to call.

* rendering/SimpleLineLayout.cpp:
(WebCore::SimpleLineLayout::canUseForFontAndText):
* rendering/SimpleLineLayoutTextFragmentIterator.cpp:
(WebCore::SimpleLineLayout::TextFragmentIterator::Style::Style):
RenderStyle::hyphenString() returns an AtomicString.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (230451 => 230452)


--- trunk/Source/WebCore/ChangeLog	2018-04-09 21:09:54 UTC (rev 230451)
+++ trunk/Source/WebCore/ChangeLog	2018-04-09 23:02:29 UTC (rev 230452)
@@ -1,3 +1,66 @@
+2018-04-09  Said Abou-Hallawa  <sabouhall...@apple.com>
+
+        Make InlineTextBox::createTextRun() take a const lvalue reference String
+        https://bugs.webkit.org/show_bug.cgi?id=184182
+
+        Reviewed by Zalan Bujtas.
+
+        InlineTextBox::createTextRun() takes a non-const lvalue reference String.
+        It is tempting to change the signature of this method to take a const lvalue 
+        reference. But this was done intentionally. TextRun is effectively a StringView:
+        it does not own the passed string. Having the argument a non-const lvalue
+        reference makes the compiler prevent calls like createTextRun("abc").
+
+        To have a better way to express the lifetime of TextRun, this patch does
+        the following:
+
+        -- It makes TextRun::m_text of type String instead of StringView.
+        -- It adds a new constructor which takes const String&. This constructor
+           will addRef the underlying StringImpl when assigning it to m_text.
+        -- It keeps the constructor which takes a StringView. The caller of this
+           constructor still has to make sure the underlying String outlives the
+           TextRun. To avoid copying the underlying buffer of the StringView, we
+           will not use  StringView::toString(). Instead we will use
+           StringView::toStringWithoutCopying() which makes the returned String 
+           accesses the same buffer the StringView uses. In this case, the returned
+           String is effectively a StringView.
+
+        * page/DebugPageOverlays.cpp:
+        (WebCore::drawRightAlignedText):
+        * platform/graphics/TextRun.cpp:
+        * platform/graphics/TextRun.h:
+        (WebCore::TextRun::TextRun):
+        (WebCore::TextRun::subRun const):
+        (WebCore::TextRun::length const):
+        (WebCore::TextRun::setText):
+        (WebCore::TextRun::string const): Deleted.
+        * rendering/InlineTextBox.cpp:
+        (WebCore::InlineTextBox::localSelectionRect const):
+        (WebCore::InlineTextBox::paint):
+        (WebCore::InlineTextBox::paintPlatformDocumentMarker):
+        (WebCore::InlineTextBox::paintMarkedTextBackground):
+        (WebCore::InlineTextBox::paintMarkedTextForeground):
+        (WebCore::InlineTextBox::paintMarkedTextDecoration):
+        (WebCore::InlineTextBox::offsetForPosition const):
+        (WebCore::InlineTextBox::positionForOffset const):
+        (WebCore::InlineTextBox::createTextRun const):
+        There is no need for this function to take a String argument anymore. The
+        reason for passing the String was to guarantee its lifetime by keeping
+        a copy of it in the caller side. Now there is no need for that. The TextRun
+        itself will keep this copy.
+
+        * rendering/InlineTextBox.h:
+        * rendering/RenderText.cpp:
+        (WebCore::RenderText::computeCanUseSimplifiedTextMeasuring const):
+        RenderText::text() returns StringImpl. The compiler wants us to be more
+        explicit about which constructor of TextRun to call.
+
+        * rendering/SimpleLineLayout.cpp:
+        (WebCore::SimpleLineLayout::canUseForFontAndText):
+        * rendering/SimpleLineLayoutTextFragmentIterator.cpp:
+        (WebCore::SimpleLineLayout::TextFragmentIterator::Style::Style):
+        RenderStyle::hyphenString() returns an AtomicString.
+
 2018-04-09  Michael Catanzaro  <mcatanz...@igalia.com>
 
         Unreviewed, rolling out r230390.

Modified: trunk/Source/WebCore/page/DebugPageOverlays.cpp (230451 => 230452)


--- trunk/Source/WebCore/page/DebugPageOverlays.cpp	2018-04-09 21:09:54 UTC (rev 230451)
+++ trunk/Source/WebCore/page/DebugPageOverlays.cpp	2018-04-09 23:02:29 UTC (rev 230452)
@@ -169,7 +169,7 @@
     float textGap = 10;
     float textBaselineFromTop = 14;
 
-    TextRun textRun = TextRun(StringView(text));
+    TextRun textRun = TextRun(text);
     context.setFillColor(Color::transparent);
     float textWidth = context.drawText(font, textRun, { });
     context.setFillColor(Color::black);

Modified: trunk/Source/WebCore/platform/graphics/TextRun.cpp (230451 => 230452)


--- trunk/Source/WebCore/platform/graphics/TextRun.cpp	2018-04-09 21:09:54 UTC (rev 230451)
+++ trunk/Source/WebCore/platform/graphics/TextRun.cpp	2018-04-09 23:02:29 UTC (rev 230452)
@@ -29,7 +29,7 @@
 namespace WebCore {
 
 struct ExpectedTextRunSize {
-    StringView text;
+    String text;
     unsigned integer1;
     float float1;
     float float2;

Modified: trunk/Source/WebCore/platform/graphics/TextRun.h (230451 => 230452)


--- trunk/Source/WebCore/platform/graphics/TextRun.h	2018-04-09 21:09:54 UTC (rev 230451)
+++ trunk/Source/WebCore/platform/graphics/TextRun.h	2018-04-09 23:02:29 UTC (rev 230452)
@@ -2,7 +2,7 @@
  * Copyright (C) 2000 Lars Knoll (kn...@kde.org)
  *           (C) 2000 Antti Koivisto (koivi...@kde.org)
  *           (C) 2000 Dirk Mueller (muel...@kde.org)
- * Copyright (C) 2003, 2006, 2007, 2011 Apple Inc. All rights reserved.
+ * Copyright (C) 2003-2018 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -44,7 +44,7 @@
 class TextRun {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    explicit TextRun(StringView text, float xpos = 0, float expansion = 0, ExpansionBehavior expansionBehavior = DefaultExpansion, TextDirection direction = LTR, bool directionalOverride = false, bool characterScanForCodePath = true)
+    explicit TextRun(const String& text, float xpos = 0, float expansion = 0, ExpansionBehavior expansionBehavior = DefaultExpansion, TextDirection direction = LTR, bool directionalOverride = false, bool characterScanForCodePath = true)
         : m_text(text)
         , m_tabSize(0)
         , m_xpos(xpos)
@@ -59,17 +59,21 @@
     {
     }
 
+    explicit TextRun(StringView stringView, float xpos = 0, float expansion = 0, ExpansionBehavior expansionBehavior = DefaultExpansion, TextDirection direction = LTR, bool directionalOverride = false, bool characterScanForCodePath = true)
+        : TextRun(stringView.toStringWithoutCopying(), xpos, expansion, expansionBehavior, direction, directionalOverride, characterScanForCodePath)
+    {
+    }
+
     TextRun subRun(unsigned startOffset, unsigned length) const
     {
         ASSERT_WITH_SECURITY_IMPLICATION(startOffset < m_text.length());
 
-        TextRun result = *this;
+        auto result { *this };
 
-        if (is8Bit()) {
+        if (is8Bit())
             result.setText(data8(startOffset), length);
-            return result;
-        }
-        result.setText(data16(startOffset), length);
+        else
+            result.setText(data16(startOffset), length);
         return result;
     }
 
@@ -82,11 +86,10 @@
 
     bool is8Bit() const { return m_text.is8Bit(); }
     unsigned length() const { return m_text.length(); }
-    String string() const { return m_text.toString(); }
 
-    void setText(const LChar* c, unsigned len) { m_text = StringView(c, len); }
-    void setText(const UChar* c, unsigned len) { m_text = StringView(c, len); }
-    void setText(StringView stringView) { m_text = stringView; }
+    void setText(const LChar* text, unsigned length) { setText({ text, length }); }
+    void setText(const UChar* text, unsigned length) { setText({ text, length }); }
+    void setText(StringView text) { m_text = text.toStringWithoutCopying(); }
 
     float horizontalGlyphStretch() const { return m_horizontalGlyphStretch; }
     void setHorizontalGlyphStretch(float scale) { m_horizontalGlyphStretch = scale; }
@@ -113,7 +116,7 @@
     StringView text() const { return m_text; }
 
 private:
-    StringView m_text;
+    String m_text;
 
     unsigned m_tabSize;
 

Modified: trunk/Source/WebCore/rendering/InlineTextBox.cpp (230451 => 230452)


--- trunk/Source/WebCore/rendering/InlineTextBox.cpp	2018-04-09 21:09:54 UTC (rev 230451)
+++ trunk/Source/WebCore/rendering/InlineTextBox.cpp	2018-04-09 23:02:29 UTC (rev 230452)
@@ -200,8 +200,7 @@
     LayoutUnit selectionTop = this->selectionTop();
     LayoutUnit selectionHeight = this->selectionHeight();
 
-    auto text = this->text();
-    TextRun textRun = createTextRun(text);
+    TextRun textRun = createTextRun();
 
     LayoutRect selectionRect = LayoutRect(LayoutPoint(logicalLeft(), selectionTop), LayoutSize(m_logicalWidth, selectionHeight));
     // Avoid measuring the text when the entire line box is selected as an optimization.
@@ -570,8 +569,7 @@
     // Paint decorations
     TextDecoration textDecorations = lineStyle.textDecorationsInEffect();
     if (textDecorations != TextDecorationNone && paintInfo.phase != PaintPhaseSelection) {
-        auto text = this->text();
-        TextRun textRun = createTextRun(text);
+        TextRun textRun = createTextRun();
         unsigned length = textRun.length();
         if (m_truncation != cNoTruncation)
             length = m_truncation;
@@ -676,8 +674,7 @@
         int deltaY = renderer().style().isFlippedLinesWritingMode() ? selectionBottom() - logicalBottom() : logicalTop() - selectionTop();
         int selHeight = selectionHeight();
         FloatPoint startPoint(boxOrigin.x(), boxOrigin.y() - deltaY);
-        auto text = this->text();
-        TextRun run = createTextRun(text);
+        TextRun run = createTextRun();
 
         LayoutRect selectionRect = LayoutRect(startPoint, FloatSize(0, selHeight));
         lineFont().adjustSelectionRectForText(run, selectionRect, markedText.startOffset, markedText.endOffset);
@@ -974,8 +971,7 @@
 
     // Note that if the text is truncated, we let the thing being painted in the truncation
     // draw its own highlight.
-    auto text = this->text();
-    TextRun textRun = createTextRun(text);
+    TextRun textRun = createTextRun();
 
     const RootInlineBox& rootBox = root();
     LayoutUnit selectionBottom = rootBox.selectionBottom();
@@ -1022,8 +1018,7 @@
         context.setAlpha(markedText.style.alpha);
     }
     // TextPainter wants the box rectangle and text origin of the entire line box.
-    auto text = this->text();
-    textPainter.paintRange(createTextRun(text), boxRect, textOriginFromBoxRect(boxRect), markedText.startOffset, markedText.endOffset);
+    textPainter.paintRange(createTextRun(), boxRect, textOriginFromBoxRect(boxRect), markedText.startOffset, markedText.endOffset);
 }
 
 void InlineTextBox::paintMarkedTextDecoration(GraphicsContext& context, const FloatRect& boxRect, const FloatRect& clipOutRect, const StyledMarkedText& markedText)
@@ -1045,8 +1040,7 @@
 
     // Note that if the text is truncated, we let the thing being painted in the truncation
     // draw its own decoration.
-    auto text = this->text();
-    TextRun textRun = createTextRun(text);
+    TextRun textRun = createTextRun();
 
     // Avoid measuring the text when the entire line box is selected as an optimization.
     FloatRect snappedSelectionRect = boxRect;
@@ -1190,8 +1184,7 @@
         return isLeftToRightDirection() ? 0 : len();
     bool ignoreCombinedText = true;
     bool ignoreHyphen = true;
-    auto text = this->text(ignoreCombinedText, ignoreHyphen);
-    return lineFont().offsetForPosition(createTextRun(text), lineOffset - logicalLeft(), includePartialGlyphs);
+    return lineFont().offsetForPosition(createTextRun(ignoreCombinedText, ignoreHyphen), lineOffset - logicalLeft(), includePartialGlyphs);
 }
 
 float InlineTextBox::positionForOffset(unsigned offset) const
@@ -1216,16 +1209,15 @@
     LayoutRect selectionRect = LayoutRect(logicalLeft(), 0, 0, 0);
     bool ignoreCombinedText = true;
     bool ignoreHyphen = true;
-    auto text = this->text(ignoreCombinedText, ignoreHyphen);
-    TextRun textRun = createTextRun(text);
+    TextRun textRun = createTextRun(ignoreCombinedText, ignoreHyphen);
     lineFont().adjustSelectionRectForText(textRun, selectionRect, startOffset, endOffset);
     return snapRectToDevicePixelsWithWritingDirection(selectionRect, renderer().document().deviceScaleFactor(), textRun.ltr()).maxX();
 }
 
-TextRun InlineTextBox::createTextRun(String& string) const
+TextRun InlineTextBox::createTextRun(bool ignoreCombinedText, bool ignoreHyphen) const
 {
     const auto& style = lineStyle();
-    TextRun textRun { string, textPos(), expansion(), expansionBehavior(), direction(), dirOverride() || style.rtlOrdering() == VisualOrder, !renderer().canUseSimpleFontCodePath() };
+    TextRun textRun { text(ignoreCombinedText, ignoreHyphen), textPos(), expansion(), expansionBehavior(), direction(), dirOverride() || style.rtlOrdering() == VisualOrder, !renderer().canUseSimpleFontCodePath() };
     textRun.setTabSize(!style.collapseWhiteSpace(), style.tabSize());
     return textRun;
 }

Modified: trunk/Source/WebCore/rendering/InlineTextBox.h (230451 => 230452)


--- trunk/Source/WebCore/rendering/InlineTextBox.h	2018-04-09 21:09:54 UTC (rev 230451)
+++ trunk/Source/WebCore/rendering/InlineTextBox.h	2018-04-09 23:02:29 UTC (rev 230452)
@@ -185,7 +185,7 @@
     const FontCascade& lineFont() const;
 
     String text(bool ignoreCombinedText = false, bool ignoreHyphen = false) const; // The effective text for the run.
-    TextRun createTextRun(String&) const;
+    TextRun createTextRun(bool ignoreCombinedText = false, bool ignoreHyphen = false) const;
 
     ExpansionBehavior expansionBehavior() const;
 

Modified: trunk/Source/WebCore/rendering/RenderText.cpp (230451 => 230452)


--- trunk/Source/WebCore/rendering/RenderText.cpp	2018-04-09 21:09:54 UTC (rev 230451)
+++ trunk/Source/WebCore/rendering/RenderText.cpp	2018-04-09 23:02:29 UTC (rev 230452)
@@ -1243,7 +1243,7 @@
         return false;
 
     // Additional check on the font codepath.
-    TextRun run(text());
+    TextRun run(m_text);
     run.setCharacterScanForCodePath(false);
     if (font.codePath(run) != FontCascade::Simple)
         return false;

Modified: trunk/Source/WebCore/rendering/SimpleLineLayout.cpp (230451 => 230452)


--- trunk/Source/WebCore/rendering/SimpleLineLayout.cpp	2018-04-09 21:09:54 UTC (rev 230451)
+++ trunk/Source/WebCore/rendering/SimpleLineLayout.cpp	2018-04-09 23:02:29 UTC (rev 230452)
@@ -181,7 +181,7 @@
             // No need to check the code path at this point. We already know it can't be simple.
             SET_REASON_AND_RETURN_IF_NEEDED(FlowHasComplexFontCodePath, reasons, includeReasons);
         } else {
-            TextRun run(textRenderer.text());
+            TextRun run(String(textRenderer.text()));
             run.setCharacterScanForCodePath(false);
             if (style.fontCascade().codePath(run) != FontCascade::Simple)
                 SET_REASON_AND_RETURN_IF_NEEDED(FlowHasComplexFontCodePath, reasons, includeReasons);

Modified: trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp (230451 => 230452)


--- trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp	2018-04-09 21:09:54 UTC (rev 230451)
+++ trunk/Source/WebCore/rendering/SimpleLineLayoutTextFragmentIterator.cpp	2018-04-09 23:02:29 UTC (rev 230452)
@@ -49,7 +49,7 @@
     , wordSpacing(font.wordSpacing())
     , tabWidth(collapseWhitespace ? 0 : style.tabSize())
     , shouldHyphenate(style.hyphens() == HyphensAuto && canHyphenate(style.locale()))
-    , hyphenStringWidth(shouldHyphenate ? (useSimplifiedTextMeasuring ? font.widthForSimpleText(style.hyphenString()) : font.width(TextRun(style.hyphenString()))) : 0)
+    , hyphenStringWidth(shouldHyphenate ? (useSimplifiedTextMeasuring ? font.widthForSimpleText(style.hyphenString()) : font.width(TextRun(String(style.hyphenString())))) : 0)
     , hyphenLimitBefore(style.hyphenationLimitBefore() < 0 ? 2 : style.hyphenationLimitBefore())
     , hyphenLimitAfter(style.hyphenationLimitAfter() < 0 ? 2 : style.hyphenationLimitAfter())
     , locale(style.locale())
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to