diff --git a/Libraries/LibWeb/Selection/Selection.cpp b/Libraries/LibWeb/Selection/Selection.cpp index 51b268749cd..c2cf68f4678 100644 --- a/Libraries/LibWeb/Selection/Selection.cpp +++ b/Libraries/LibWeb/Selection/Selection.cpp @@ -567,59 +567,54 @@ GC::Ptr Selection::cursor_position() const void Selection::move_offset_to_next_character(bool collapse_selection) { - auto anchor_node = this->anchor_node(); - if (!anchor_node || !is(*anchor_node)) + auto* text_node = as_if(anchor_node().ptr()); + if (!text_node) return; - auto& text_node = static_cast(*anchor_node); - if (auto offset = text_node.grapheme_segmenter().next_boundary(focus_offset()); offset.has_value()) { + if (auto offset = text_node->grapheme_segmenter().next_boundary(focus_offset()); offset.has_value()) { if (collapse_selection) { - MUST(collapse(*anchor_node, *offset)); + MUST(collapse(text_node, *offset)); m_document->reset_cursor_blink_cycle(); } else { - MUST(set_base_and_extent(*anchor_node, anchor_offset(), *anchor_node, *offset)); + MUST(set_base_and_extent(*text_node, anchor_offset(), *text_node, *offset)); } } } void Selection::move_offset_to_previous_character(bool collapse_selection) { - auto anchor_node = this->anchor_node(); - if (!anchor_node || !is(*anchor_node)) + auto* text_node = as_if(anchor_node().ptr()); + if (!text_node) return; - auto& text_node = static_cast(*anchor_node); - if (auto offset = text_node.grapheme_segmenter().previous_boundary(focus_offset()); offset.has_value()) { + if (auto offset = text_node->grapheme_segmenter().previous_boundary(focus_offset()); offset.has_value()) { if (collapse_selection) { - MUST(collapse(*anchor_node, *offset)); + MUST(collapse(text_node, *offset)); m_document->reset_cursor_blink_cycle(); } else { - MUST(set_base_and_extent(*anchor_node, anchor_offset(), *anchor_node, *offset)); + MUST(set_base_and_extent(*text_node, anchor_offset(), *text_node, *offset)); } } } void Selection::move_offset_to_next_word(bool collapse_selection) { - auto anchor_node = this->anchor_node(); - if (!anchor_node || !is(*anchor_node)) { + auto* text_node = as_if(anchor_node().ptr()); + if (!text_node) return; - } - auto& text_node = static_cast(*anchor_node); while (true) { auto focus_offset = this->focus_offset(); - if (focus_offset == text_node.data().length_in_code_units()) { + if (focus_offset == text_node->data().length_in_code_units()) return; - } - if (auto offset = text_node.word_segmenter().next_boundary(focus_offset); offset.has_value()) { - auto word = text_node.data().substring_view(focus_offset, *offset - focus_offset); + if (auto offset = text_node->word_segmenter().next_boundary(focus_offset); offset.has_value()) { + auto word = text_node->data().substring_view(focus_offset, *offset - focus_offset); if (collapse_selection) { - MUST(collapse(anchor_node, *offset)); + MUST(collapse(text_node, *offset)); m_document->reset_cursor_blink_cycle(); } else { - MUST(set_base_and_extent(*anchor_node, this->anchor_offset(), *anchor_node, *offset)); + MUST(set_base_and_extent(*text_node, anchor_offset(), *text_node, *offset)); } if (Unicode::Segmenter::should_continue_beyond_word(word)) continue; @@ -630,21 +625,19 @@ void Selection::move_offset_to_next_word(bool collapse_selection) void Selection::move_offset_to_previous_word(bool collapse_selection) { - auto anchor_node = this->anchor_node(); - if (!anchor_node || !is(*anchor_node)) { + auto* text_node = as_if(anchor_node().ptr()); + if (!text_node) return; - } - auto& text_node = static_cast(*anchor_node); while (true) { auto focus_offset = this->focus_offset(); - if (auto offset = text_node.word_segmenter().previous_boundary(focus_offset); offset.has_value()) { - auto word = text_node.data().substring_view(*offset, focus_offset - *offset); + if (auto offset = text_node->word_segmenter().previous_boundary(focus_offset); offset.has_value()) { + auto word = text_node->data().substring_view(*offset, focus_offset - *offset); if (collapse_selection) { - MUST(collapse(anchor_node, *offset)); + MUST(collapse(text_node, *offset)); m_document->reset_cursor_blink_cycle(); } else { - MUST(set_base_and_extent(*anchor_node, anchor_offset(), *anchor_node, *offset)); + MUST(set_base_and_extent(*text_node, anchor_offset(), *text_node, *offset)); } if (Unicode::Segmenter::should_continue_beyond_word(word)) continue;