Title: [278561] trunk/Source/WebCore
Revision
278561
Author
[email protected]
Date
2021-06-07 08:06:49 -0700 (Mon, 07 Jun 2021)

Log Message

Factor selection state computation out of LegacyInlineTextBox
https://bugs.webkit.org/show_bug.cgi?id=226718

Reviewed by Alan Bujtas.

Move the code to SelectionRangeData.

* layout/integration/LayoutIntegrationRunIteratorModernPath.h:
(WebCore::LayoutIntegration::RunIteratorModernPath::selectableRange const):
* rendering/HighlightData.cpp:
(WebCore::HighlightData::highlightStateForRenderer):
(WebCore::HighlightData::highlightStateForTextBox):
(WebCore::HighlightData::rangeForTextBox):
* rendering/HighlightData.h:
(WebCore::HighlightData::HighlightData):
* rendering/LegacyInlineTextBox.cpp:
(WebCore::LegacyInlineTextBox::selectionState):
(WebCore::LegacyInlineTextBox::selectableRange const):
(WebCore::LegacyInlineTextBox::selectionStartEnd const):
(WebCore::LegacyInlineTextBox::highlightStartEnd const):
(WebCore::LegacyInlineTextBox::verifySelectionState const): Deleted.
(WebCore::LegacyInlineTextBox::clampedStartEndForState const): Deleted.
* rendering/LegacyInlineTextBox.h:
* rendering/SelectionRangeData.cpp:
(WebCore::SelectionRangeData::SelectionRangeData):
* rendering/TextBoxSelectableRange.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (278560 => 278561)


--- trunk/Source/WebCore/ChangeLog	2021-06-07 13:45:46 UTC (rev 278560)
+++ trunk/Source/WebCore/ChangeLog	2021-06-07 15:06:49 UTC (rev 278561)
@@ -1,3 +1,32 @@
+2021-06-07  Antti Koivisto  <[email protected]>
+
+        Factor selection state computation out of LegacyInlineTextBox
+        https://bugs.webkit.org/show_bug.cgi?id=226718
+
+        Reviewed by Alan Bujtas.
+
+        Move the code to SelectionRangeData.
+
+        * layout/integration/LayoutIntegrationRunIteratorModernPath.h:
+        (WebCore::LayoutIntegration::RunIteratorModernPath::selectableRange const):
+        * rendering/HighlightData.cpp:
+        (WebCore::HighlightData::highlightStateForRenderer):
+        (WebCore::HighlightData::highlightStateForTextBox):
+        (WebCore::HighlightData::rangeForTextBox):
+        * rendering/HighlightData.h:
+        (WebCore::HighlightData::HighlightData):
+        * rendering/LegacyInlineTextBox.cpp:
+        (WebCore::LegacyInlineTextBox::selectionState):
+        (WebCore::LegacyInlineTextBox::selectableRange const):
+        (WebCore::LegacyInlineTextBox::selectionStartEnd const):
+        (WebCore::LegacyInlineTextBox::highlightStartEnd const):
+        (WebCore::LegacyInlineTextBox::verifySelectionState const): Deleted.
+        (WebCore::LegacyInlineTextBox::clampedStartEndForState const): Deleted.
+        * rendering/LegacyInlineTextBox.h:
+        * rendering/SelectionRangeData.cpp:
+        (WebCore::SelectionRangeData::SelectionRangeData):
+        * rendering/TextBoxSelectableRange.h:
+
 2021-06-07  Wenson Hsieh  <[email protected]>
 
         [Cocoa] Find-in-page should match text inside image overlays

Modified: trunk/Source/WebCore/layout/integration/LayoutIntegrationRunIteratorModernPath.h (278560 => 278561)


--- trunk/Source/WebCore/layout/integration/LayoutIntegrationRunIteratorModernPath.h	2021-06-07 13:45:46 UTC (rev 278560)
+++ trunk/Source/WebCore/layout/integration/LayoutIntegrationRunIteratorModernPath.h	2021-06-07 15:06:49 UTC (rev 278561)
@@ -209,7 +209,8 @@
         return {
             start(),
             length(),
-            run().style().hyphenString().length()
+            run().style().hyphenString().length(),
+            run().isLineBreak()
         };
     }
 

Modified: trunk/Source/WebCore/rendering/HighlightData.cpp (278560 => 278561)


--- trunk/Source/WebCore/rendering/HighlightData.cpp	2021-06-07 13:45:46 UTC (rev 278560)
+++ trunk/Source/WebCore/rendering/HighlightData.cpp	2021-06-07 15:06:49 UTC (rev 278561)
@@ -41,6 +41,7 @@
 #include "RenderMultiColumnSpannerPlaceholder.h"
 #include "RenderObject.h"
 #include "RenderView.h"
+#include "TextBoxSelectableRange.h"
 #include "VisibleSelection.h"
 #include <wtf/text/TextStream.h>
 
@@ -120,6 +121,9 @@
 
 RenderObject::HighlightState HighlightData::highlightStateForRenderer(const RenderObject& renderer)
 {
+    if (m_isSelection)
+        return renderer.selectionState();
+
     if (&renderer == m_renderRange.start()) {
         if (m_renderRange.start() && m_renderRange.end() && m_renderRange.start() == m_renderRange.end())
             return RenderObject::HighlightState::Both;
@@ -143,4 +147,50 @@
     return RenderObject::HighlightState::None;
 }
 
+RenderObject::HighlightState HighlightData::highlightStateForTextBox(const RenderText& renderer, const TextBoxSelectableRange& textBoxRange)
+{
+    auto state = highlightStateForRenderer(renderer);
+
+    if (state == RenderObject::HighlightState::None || state == RenderObject::HighlightState::Inside)
+        return state;
+
+    auto startOffset = this->startOffset();
+    auto endOffset = this->endOffset();
+
+    // The position after a hard line break is considered to be past its end.
+    ASSERT(textBoxRange.start + textBoxRange.length >= (textBoxRange.isLineBreak ? 1 : 0));
+    unsigned lastSelectable = textBoxRange.start + textBoxRange.length - (textBoxRange.isLineBreak ? 1 : 0);
+
+    bool containsStart = state != RenderObject::HighlightState::End && startOffset >= textBoxRange.start && startOffset < textBoxRange.start + textBoxRange.length;
+    bool containsEnd = state != RenderObject::HighlightState::Start && endOffset > textBoxRange.start && endOffset <= lastSelectable;
+    if (containsStart && containsEnd)
+        return RenderObject::HighlightState::Both;
+    if (containsStart)
+        return RenderObject::HighlightState::Start;
+    if (containsEnd)
+        return RenderObject::HighlightState::End;
+    if ((state == RenderObject::HighlightState::End || startOffset < textBoxRange.start) && (state == RenderObject::HighlightState::Start || endOffset > lastSelectable))
+        return RenderObject::HighlightState::Inside;
+
+    return RenderObject::HighlightState::None;
+}
+
+std::pair<unsigned, unsigned> HighlightData::rangeForTextBox(const RenderText& renderer, const TextBoxSelectableRange& textBoxRange)
+{
+    auto state = highlightStateForTextBox(renderer, textBoxRange);
+
+    switch (state) {
+    case RenderObject::HighlightState::Inside:
+        return textBoxRange.clamp(0, std::numeric_limits<unsigned>::max());
+    case RenderObject::HighlightState::Start:
+        return textBoxRange.clamp(startOffset(), std::numeric_limits<unsigned>::max());
+    case RenderObject::HighlightState::End:
+        return textBoxRange.clamp(0, endOffset());
+    case RenderObject::HighlightState::Both:
+        return textBoxRange.clamp(startOffset(), endOffset());
+    case RenderObject::HighlightState::None:
+        return { 0, 0 };
+    };
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/HighlightData.h (278560 => 278561)


--- trunk/Source/WebCore/rendering/HighlightData.h	2021-06-07 13:45:46 UTC (rev 278560)
+++ trunk/Source/WebCore/rendering/HighlightData.h	2021-06-07 15:06:49 UTC (rev 278561)
@@ -35,6 +35,7 @@
 namespace WebCore {
 
 struct HighlightRangeData;
+struct TextBoxSelectableRange;
 class RenderMultiColumnSpannerPlaceholder;
 
 class RenderRange {
@@ -80,6 +81,12 @@
 
 class HighlightData {
 public:
+    enum IsSelectionTag { IsSelection };
+    HighlightData() = default;
+    HighlightData(IsSelectionTag)
+        : m_isSelection(true)
+    { }
+
     void setRenderRange(const RenderRange&);
     bool setRenderRange(const HighlightRangeData&); // Returns true if successful.
     const RenderRange& get() const { return m_renderRange; }
@@ -91,9 +98,12 @@
     unsigned endOffset() const { return m_renderRange.endOffset(); }
 
     RenderObject::HighlightState highlightStateForRenderer(const RenderObject&);
+    RenderObject::HighlightState highlightStateForTextBox(const RenderText&, const TextBoxSelectableRange&);
+    std::pair<unsigned, unsigned> rangeForTextBox(const RenderText&, const TextBoxSelectableRange&);
 
 protected:
     RenderRange m_renderRange;
+    const bool m_isSelection { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/LegacyInlineTextBox.cpp (278560 => 278561)


--- trunk/Source/WebCore/rendering/LegacyInlineTextBox.cpp	2021-06-07 13:45:46 UTC (rev 278560)
+++ trunk/Source/WebCore/rendering/LegacyInlineTextBox.cpp	2021-06-07 15:06:49 UTC (rev 278561)
@@ -161,7 +161,7 @@
 
 RenderObject::HighlightState LegacyInlineTextBox::selectionState()
 {
-    auto state = verifySelectionState(renderer().selectionState(), renderer().view().selection());
+    auto state = renderer().view().selection().highlightStateForTextBox(renderer(), selectableRange());
     
     // FIXME: this code mutates selection state, but it's used at a simple getter elsewhere
     // in this file. This code should likely live in HighlightData, or somewhere else.
@@ -185,33 +185,6 @@
     return state;
 }
 
-RenderObject::HighlightState LegacyInlineTextBox::verifySelectionState(RenderObject::HighlightState state, HighlightData& selection) const
-{
-    if (state == RenderObject::HighlightState::Start || state == RenderObject::HighlightState::End || state == RenderObject::HighlightState::Both) {
-        auto startOffset = selection.startOffset();
-        auto endOffset = selection.endOffset();
-        // The position after a hard line break is considered to be past its end.
-        ASSERT(start() + len() >= (isLineBreak() ? 1 : 0));
-        unsigned lastSelectable = start() + len() - (isLineBreak() ? 1 : 0);
-
-        bool start = (state != RenderObject::HighlightState::End && startOffset >= m_start && startOffset < m_start + m_len);
-        bool end = (state != RenderObject::HighlightState::Start && endOffset > m_start && endOffset <= lastSelectable);
-        if (start && end)
-            state = RenderObject::HighlightState::Both;
-        else if (start)
-            state = RenderObject::HighlightState::Start;
-        else if (end)
-            state = RenderObject::HighlightState::End;
-        else if ((state == RenderObject::HighlightState::End || startOffset < m_start)
-            && (state == RenderObject::HighlightState::Start || endOffset > lastSelectable))
-            state = RenderObject::HighlightState::Inside;
-        else if (state == RenderObject::HighlightState::Both)
-            state = RenderObject::HighlightState::None;
-    }
-
-    return state;
-}
-
 inline const FontCascade& LegacyInlineTextBox::lineFont() const
 {
     return combinedText() ? combinedText()->textCombineFont() : lineStyle().fontCascade();
@@ -666,38 +639,19 @@
         m_start,
         m_len,
         additionalLengthAtEnd,
+        isLineBreak(),
         truncation
     };
 }
 
-std::pair<unsigned, unsigned> LegacyInlineTextBox::clampedStartEndForState(unsigned start, unsigned end, RenderObject::HighlightState selectionState) const
-{
-    if (selectionState == RenderObject::HighlightState::Inside)
-        return { 0, selectableRange().clamp(m_start + m_len) };
-    
-    if (selectionState == RenderObject::HighlightState::Start)
-        end = renderer().text().length();
-    else if (selectionState == RenderObject::HighlightState::End)
-        start = 0;
-    return selectableRange().clamp(start, end);
-}
-
 std::pair<unsigned, unsigned> LegacyInlineTextBox::selectionStartEnd() const
 {
-    auto selectionState = renderer().selectionState();
-    
-    return clampedStartEndForState(renderer().view().selection().startOffset(), renderer().view().selection().endOffset(), selectionState);
+    return renderer().view().selection().rangeForTextBox(renderer(), selectableRange());
 }
 
-std::pair<unsigned, unsigned> LegacyInlineTextBox::highlightStartEnd(HighlightData &rangeData) const
+std::pair<unsigned, unsigned> LegacyInlineTextBox::highlightStartEnd(HighlightData& rangeData) const
 {
-    auto state = rangeData.highlightStateForRenderer(renderer());
-    state = verifySelectionState(state, rangeData);
-    
-    if (state == RenderObject::HighlightState::None)
-        return {0, 0};
-    
-    return clampedStartEndForState(rangeData.startOffset(), rangeData.endOffset(), state);
+    return rangeData.rangeForTextBox(renderer(), selectableRange());
 }
 
 bool LegacyInlineTextBox::hasMarkers() const

Modified: trunk/Source/WebCore/rendering/LegacyInlineTextBox.h (278560 => 278561)


--- trunk/Source/WebCore/rendering/LegacyInlineTextBox.h	2021-06-07 13:45:46 UTC (rev 278560)
+++ trunk/Source/WebCore/rendering/LegacyInlineTextBox.h	2021-06-07 15:06:49 UTC (rev 278561)
@@ -134,9 +134,6 @@
     void extractLine() final;
     void attachLine() final;
     
-    RenderObject::HighlightState verifySelectionState(RenderObject::HighlightState, HighlightData&) const;
-    std::pair<unsigned, unsigned> clampedStartEndForState(unsigned, unsigned, RenderObject::HighlightState) const;
-
 public:
     RenderObject::HighlightState selectionState() final;
 

Modified: trunk/Source/WebCore/rendering/SelectionRangeData.cpp (278560 => 278561)


--- trunk/Source/WebCore/rendering/SelectionRangeData.cpp	2021-06-07 13:45:46 UTC (rev 278560)
+++ trunk/Source/WebCore/rendering/SelectionRangeData.cpp	2021-06-07 15:06:49 UTC (rev 278561)
@@ -108,7 +108,8 @@
 }
 
 SelectionRangeData::SelectionRangeData(RenderView& view)
-    : m_renderView(view)
+    : HighlightData(IsSelection)
+    , m_renderView(view)
 #if ENABLE(SERVICE_CONTROLS)
     , m_selectionGeometryGatherer(view)
 #endif

Modified: trunk/Source/WebCore/rendering/TextBoxSelectableRange.h (278560 => 278561)


--- trunk/Source/WebCore/rendering/TextBoxSelectableRange.h	2021-06-07 13:45:46 UTC (rev 278560)
+++ trunk/Source/WebCore/rendering/TextBoxSelectableRange.h	2021-06-07 15:06:49 UTC (rev 278561)
@@ -32,6 +32,7 @@
     const unsigned start;
     const unsigned length;
     const unsigned additionalLengthAtEnd { 0 };
+    const bool isLineBreak { false };
     const std::optional<unsigned> truncation { };
 
     unsigned clamp(unsigned offset) const
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to