Changeset 278561 in webkit
- Timestamp:
- Jun 7, 2021, 8:06:49 AM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
-
ChangeLog (modified) (1 diff)
-
layout/integration/LayoutIntegrationRunIteratorModernPath.h (modified) (1 diff)
-
rendering/HighlightData.cpp (modified) (3 diffs)
-
rendering/HighlightData.h (modified) (3 diffs)
-
rendering/LegacyInlineTextBox.cpp (modified) (3 diffs)
-
rendering/LegacyInlineTextBox.h (modified) (1 diff)
-
rendering/SelectionRangeData.cpp (modified) (1 diff)
-
rendering/TextBoxSelectableRange.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r278560 r278561 1 2021-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 1 30 2021-06-07 Wenson Hsieh <wenson_hsieh@apple.com> 2 31 -
trunk/Source/WebCore/layout/integration/LayoutIntegrationRunIteratorModernPath.h
r278545 r278561 210 210 start(), 211 211 length(), 212 run().style().hyphenString().length() 212 run().style().hyphenString().length(), 213 run().isLineBreak() 213 214 }; 214 215 } -
trunk/Source/WebCore/rendering/HighlightData.cpp
r270362 r278561 42 42 #include "RenderObject.h" 43 43 #include "RenderView.h" 44 #include "TextBoxSelectableRange.h" 44 45 #include "VisibleSelection.h" 45 46 #include <wtf/text/TextStream.h> … … 121 122 RenderObject::HighlightState HighlightData::highlightStateForRenderer(const RenderObject& renderer) 122 123 { 124 if (m_isSelection) 125 return renderer.selectionState(); 126 123 127 if (&renderer == m_renderRange.start()) { 124 128 if (m_renderRange.start() && m_renderRange.end() && m_renderRange.start() == m_renderRange.end()) … … 144 148 } 145 149 150 RenderObject::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 178 std::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 146 196 } // namespace WebCore -
trunk/Source/WebCore/rendering/HighlightData.h
r268484 r278561 36 36 37 37 struct HighlightRangeData; 38 struct TextBoxSelectableRange; 38 39 class RenderMultiColumnSpannerPlaceholder; 39 40 … … 81 82 class HighlightData { 82 83 public: 84 enum IsSelectionTag { IsSelection }; 85 HighlightData() = default; 86 HighlightData(IsSelectionTag) 87 : m_isSelection(true) 88 { } 89 83 90 void setRenderRange(const RenderRange&); 84 91 bool setRenderRange(const HighlightRangeData&); // Returns true if successful. … … 92 99 93 100 RenderObject::HighlightState highlightStateForRenderer(const RenderObject&); 101 RenderObject::HighlightState highlightStateForTextBox(const RenderText&, const TextBoxSelectableRange&); 102 std::pair<unsigned, unsigned> rangeForTextBox(const RenderText&, const TextBoxSelectableRange&); 94 103 95 104 protected: 96 105 RenderRange m_renderRange; 106 const bool m_isSelection { false }; 97 107 }; 98 108 -
trunk/Source/WebCore/rendering/LegacyInlineTextBox.cpp
r278545 r278561 162 162 RenderObject::HighlightState LegacyInlineTextBox::selectionState() 163 163 { 164 auto state = verifySelectionState(renderer().selectionState(), renderer().view().selection());164 auto state = renderer().view().selection().highlightStateForTextBox(renderer(), selectableRange()); 165 165 166 166 // FIXME: this code mutates selection state, but it's used at a simple getter elsewhere … … 186 186 } 187 187 188 RenderObject::HighlightState LegacyInlineTextBox::verifySelectionState(RenderObject::HighlightState state, HighlightData& selection) const189 {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 215 188 inline const FontCascade& LegacyInlineTextBox::lineFont() const 216 189 { … … 667 640 m_len, 668 641 additionalLengthAtEnd, 642 isLineBreak(), 669 643 truncation 670 644 }; 671 645 } 672 646 673 std::pair<unsigned, unsigned> LegacyInlineTextBox::clampedStartEndForState(unsigned start, unsigned end, RenderObject::HighlightState selectionState) const674 {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 685 647 std::pair<unsigned, unsigned> LegacyInlineTextBox::selectionStartEnd() const 686 648 { 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 652 std::pair<unsigned, unsigned> LegacyInlineTextBox::highlightStartEnd(HighlightData& rangeData) const 653 { 654 return rangeData.rangeForTextBox(renderer(), selectableRange()); 701 655 } 702 656 -
trunk/Source/WebCore/rendering/LegacyInlineTextBox.h
r278545 r278561 135 135 void attachLine() final; 136 136 137 RenderObject::HighlightState verifySelectionState(RenderObject::HighlightState, HighlightData&) const;138 std::pair<unsigned, unsigned> clampedStartEndForState(unsigned, unsigned, RenderObject::HighlightState) const;139 140 137 public: 141 138 RenderObject::HighlightState selectionState() final; -
trunk/Source/WebCore/rendering/SelectionRangeData.cpp
r277274 r278561 109 109 110 110 SelectionRangeData::SelectionRangeData(RenderView& view) 111 : m_renderView(view) 111 : HighlightData(IsSelection) 112 , m_renderView(view) 112 113 #if ENABLE(SERVICE_CONTROLS) 113 114 , m_selectionGeometryGatherer(view) -
trunk/Source/WebCore/rendering/TextBoxSelectableRange.h
r278545 r278561 33 33 const unsigned length; 34 34 const unsigned additionalLengthAtEnd { 0 }; 35 const bool isLineBreak { false }; 35 36 const std::optional<unsigned> truncation { }; 36 37
Note:
See TracChangeset
for help on using the changeset viewer.