⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 278561 in webkit


Ignore:
Timestamp:
Jun 7, 2021, 8:06:49 AM (5 years ago)
Author:
Antti Koivisto
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:
Location:
trunk/Source/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r278560 r278561  
     12021-06-07  Antti Koivisto  <antti@apple.com>
     2
     3        Factor selection state computation out of LegacyInlineTextBox
     4        https://bugs.webkit.org/show_bug.cgi?id=226718
     5
     6        Reviewed by Alan Bujtas.
     7
     8        Move the code to SelectionRangeData.
     9
     10        * layout/integration/LayoutIntegrationRunIteratorModernPath.h:
     11        (WebCore::LayoutIntegration::RunIteratorModernPath::selectableRange const):
     12        * rendering/HighlightData.cpp:
     13        (WebCore::HighlightData::highlightStateForRenderer):
     14        (WebCore::HighlightData::highlightStateForTextBox):
     15        (WebCore::HighlightData::rangeForTextBox):
     16        * rendering/HighlightData.h:
     17        (WebCore::HighlightData::HighlightData):
     18        * rendering/LegacyInlineTextBox.cpp:
     19        (WebCore::LegacyInlineTextBox::selectionState):
     20        (WebCore::LegacyInlineTextBox::selectableRange const):
     21        (WebCore::LegacyInlineTextBox::selectionStartEnd const):
     22        (WebCore::LegacyInlineTextBox::highlightStartEnd const):
     23        (WebCore::LegacyInlineTextBox::verifySelectionState const): Deleted.
     24        (WebCore::LegacyInlineTextBox::clampedStartEndForState const): Deleted.
     25        * rendering/LegacyInlineTextBox.h:
     26        * rendering/SelectionRangeData.cpp:
     27        (WebCore::SelectionRangeData::SelectionRangeData):
     28        * rendering/TextBoxSelectableRange.h:
     29
    1302021-06-07  Wenson Hsieh  <wenson_hsieh@apple.com>
    231
  • trunk/Source/WebCore/layout/integration/LayoutIntegrationRunIteratorModernPath.h

    r278545 r278561  
    210210            start(),
    211211            length(),
    212             run().style().hyphenString().length()
     212            run().style().hyphenString().length(),
     213            run().isLineBreak()
    213214        };
    214215    }
  • trunk/Source/WebCore/rendering/HighlightData.cpp

    r270362 r278561  
    4242#include "RenderObject.h"
    4343#include "RenderView.h"
     44#include "TextBoxSelectableRange.h"
    4445#include "VisibleSelection.h"
    4546#include <wtf/text/TextStream.h>
    … …  
    121122RenderObject::HighlightState HighlightData::highlightStateForRenderer(const RenderObject& renderer)
    122123{
     124    if (m_isSelection)
     125        return renderer.selectionState();
     126
    123127    if (&renderer == m_renderRange.start()) {
    124128        if (m_renderRange.start() && m_renderRange.end() && m_renderRange.start() == m_renderRange.end())
    … …  
    144148}
    145149
     150RenderObject::HighlightState HighlightData::highlightStateForTextBox(const RenderText& renderer, const TextBoxSelectableRange& textBoxRange)
     151{
     152    auto state = highlightStateForRenderer(renderer);
     153
     154    if (state == RenderObject::HighlightState::None || state == RenderObject::HighlightState::Inside)
     155        return state;
     156
     157    auto startOffset = this->startOffset();
     158    auto endOffset = this->endOffset();
     159
     160    // The position after a hard line break is considered to be past its end.
     161    ASSERT(textBoxRange.start + textBoxRange.length >= (textBoxRange.isLineBreak ? 1 : 0));
     162    unsigned lastSelectable = textBoxRange.start + textBoxRange.length - (textBoxRange.isLineBreak ? 1 : 0);
     163
     164    bool containsStart = state != RenderObject::HighlightState::End && startOffset >= textBoxRange.start && startOffset < textBoxRange.start + textBoxRange.length;
     165    bool containsEnd = state != RenderObject::HighlightState::Start && endOffset > textBoxRange.start && endOffset <= lastSelectable;
     166    if (containsStart && containsEnd)
     167        return RenderObject::HighlightState::Both;
     168    if (containsStart)
     169        return RenderObject::HighlightState::Start;
     170    if (containsEnd)
     171        return RenderObject::HighlightState::End;
     172    if ((state == RenderObject::HighlightState::End || startOffset < textBoxRange.start) && (state == RenderObject::HighlightState::Start || endOffset > lastSelectable))
     173        return RenderObject::HighlightState::Inside;
     174
     175    return RenderObject::HighlightState::None;
     176}
     177
     178std::pair<unsigned, unsigned> HighlightData::rangeForTextBox(const RenderText& renderer, const TextBoxSelectableRange& textBoxRange)
     179{
     180    auto state = highlightStateForTextBox(renderer, textBoxRange);
     181
     182    switch (state) {
     183    case RenderObject::HighlightState::Inside:
     184        return textBoxRange.clamp(0, std::numeric_limits<unsigned>::max());
     185    case RenderObject::HighlightState::Start:
     186        return textBoxRange.clamp(startOffset(), std::numeric_limits<unsigned>::max());
     187    case RenderObject::HighlightState::End:
     188        return textBoxRange.clamp(0, endOffset());
     189    case RenderObject::HighlightState::Both:
     190        return textBoxRange.clamp(startOffset(), endOffset());
     191    case RenderObject::HighlightState::None:
     192        return { 0, 0 };
     193    };
     194}
     195
    146196} // namespace WebCore
  • trunk/Source/WebCore/rendering/HighlightData.h

    r268484 r278561  
    3636
    3737struct HighlightRangeData;
     38struct TextBoxSelectableRange;
    3839class RenderMultiColumnSpannerPlaceholder;
    3940
    … …  
    8182class HighlightData {
    8283public:
     84    enum IsSelectionTag { IsSelection };
     85    HighlightData() = default;
     86    HighlightData(IsSelectionTag)
     87        : m_isSelection(true)
     88    { }
     89
    8390    void setRenderRange(const RenderRange&);
    8491    bool setRenderRange(const HighlightRangeData&); // Returns true if successful.
    … …  
    9299
    93100    RenderObject::HighlightState highlightStateForRenderer(const RenderObject&);
     101    RenderObject::HighlightState highlightStateForTextBox(const RenderText&, const TextBoxSelectableRange&);
     102    std::pair<unsigned, unsigned> rangeForTextBox(const RenderText&, const TextBoxSelectableRange&);
    94103
    95104protected:
    96105    RenderRange m_renderRange;
     106    const bool m_isSelection { false };
    97107};
    98108
  • trunk/Source/WebCore/rendering/LegacyInlineTextBox.cpp

    r278545 r278561  
    162162RenderObject::HighlightState LegacyInlineTextBox::selectionState()
    163163{
    164     auto state = verifySelectionState(renderer().selectionState(), renderer().view().selection());
     164    auto state = renderer().view().selection().highlightStateForTextBox(renderer(), selectableRange());
    165165   
    166166    // FIXME: this code mutates selection state, but it's used at a simple getter elsewhere
    … …  
    186186}
    187187
    188 RenderObject::HighlightState LegacyInlineTextBox::verifySelectionState(RenderObject::HighlightState state, HighlightData& selection) const
    189 {
    190     if (state == RenderObject::HighlightState::Start || state == RenderObject::HighlightState::End || state == RenderObject::HighlightState::Both) {
    191         auto startOffset = selection.startOffset();
    192         auto endOffset = selection.endOffset();
    193         // The position after a hard line break is considered to be past its end.
    194         ASSERT(start() + len() >= (isLineBreak() ? 1 : 0));
    195         unsigned lastSelectable = start() + len() - (isLineBreak() ? 1 : 0);
    196 
    197         bool start = (state != RenderObject::HighlightState::End && startOffset >= m_start && startOffset < m_start + m_len);
    198         bool end = (state != RenderObject::HighlightState::Start && endOffset > m_start && endOffset <= lastSelectable);
    199         if (start && end)
    200             state = RenderObject::HighlightState::Both;
    201         else if (start)
    202             state = RenderObject::HighlightState::Start;
    203         else if (end)
    204             state = RenderObject::HighlightState::End;
    205         else if ((state == RenderObject::HighlightState::End || startOffset < m_start)
    206             && (state == RenderObject::HighlightState::Start || endOffset > lastSelectable))
    207             state = RenderObject::HighlightState::Inside;
    208         else if (state == RenderObject::HighlightState::Both)
    209             state = RenderObject::HighlightState::None;
    210     }
    211 
    212     return state;
    213 }
    214 
    215188inline const FontCascade& LegacyInlineTextBox::lineFont() const
    216189{
    … …  
    667640        m_len,
    668641        additionalLengthAtEnd,
     642        isLineBreak(),
    669643        truncation
    670644    };
    671645}
    672646
    673 std::pair<unsigned, unsigned> LegacyInlineTextBox::clampedStartEndForState(unsigned start, unsigned end, RenderObject::HighlightState selectionState) const
    674 {
    675     if (selectionState == RenderObject::HighlightState::Inside)
    676         return { 0, selectableRange().clamp(m_start + m_len) };
    677    
    678     if (selectionState == RenderObject::HighlightState::Start)
    679         end = renderer().text().length();
    680     else if (selectionState == RenderObject::HighlightState::End)
    681         start = 0;
    682     return selectableRange().clamp(start, end);
    683 }
    684 
    685647std::pair<unsigned, unsigned> LegacyInlineTextBox::selectionStartEnd() const
    686648{
    687     auto selectionState = renderer().selectionState();
    688    
    689     return clampedStartEndForState(renderer().view().selection().startOffset(), renderer().view().selection().endOffset(), selectionState);
    690 }
    691 
    692 std::pair<unsigned, unsigned> LegacyInlineTextBox::highlightStartEnd(HighlightData &rangeData) const
    693 {
    694     auto state = rangeData.highlightStateForRenderer(renderer());
    695     state = verifySelectionState(state, rangeData);
    696    
    697     if (state == RenderObject::HighlightState::None)
    698         return {0, 0};
    699    
    700     return clampedStartEndForState(rangeData.startOffset(), rangeData.endOffset(), state);
     649    return renderer().view().selection().rangeForTextBox(renderer(), selectableRange());
     650}
     651
     652std::pair<unsigned, unsigned> LegacyInlineTextBox::highlightStartEnd(HighlightData& rangeData) const
     653{
     654    return rangeData.rangeForTextBox(renderer(), selectableRange());
    701655}
    702656
  • trunk/Source/WebCore/rendering/LegacyInlineTextBox.h

    r278545 r278561  
    135135    void attachLine() final;
    136136   
    137     RenderObject::HighlightState verifySelectionState(RenderObject::HighlightState, HighlightData&) const;
    138     std::pair<unsigned, unsigned> clampedStartEndForState(unsigned, unsigned, RenderObject::HighlightState) const;
    139 
    140137public:
    141138    RenderObject::HighlightState selectionState() final;
  • trunk/Source/WebCore/rendering/SelectionRangeData.cpp

    r277274 r278561  
    109109
    110110SelectionRangeData::SelectionRangeData(RenderView& view)
    111     : m_renderView(view)
     111    : HighlightData(IsSelection)
     112    , m_renderView(view)
    112113#if ENABLE(SERVICE_CONTROLS)
    113114    , m_selectionGeometryGatherer(view)
  • trunk/Source/WebCore/rendering/TextBoxSelectableRange.h

    r278545 r278561  
    3333    const unsigned length;
    3434    const unsigned additionalLengthAtEnd { 0 };
     35    const bool isLineBreak { false };
    3536    const std::optional<unsigned> truncation { };
    3637
Note: See TracChangeset for help on using the changeset viewer.