summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2023-01-12 20:27:16 +0100
committerAndreas Kling <kling@serenityos.org>2023-01-12 20:27:16 +0100
commitd132ce54e1e90c5932090911f80f5a7d58c9b24e (patch)
treed12b9d8249e40932f7b0ad0efdceace1163c80e6 /Userland
parent2eaebdea5b59e1ed9004b1342fae345e318c27b4 (diff)
downloadserenity-d132ce54e1e90c5932090911f80f5a7d58c9b24e.zip
LibWeb: Don't mark layout tree as selected when selection is zero-length
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibWeb/Layout/InitialContainingBlock.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/Userland/Libraries/LibWeb/Layout/InitialContainingBlock.cpp b/Userland/Libraries/LibWeb/Layout/InitialContainingBlock.cpp
index df74329fbc..90504c4559 100644
--- a/Userland/Libraries/LibWeb/Layout/InitialContainingBlock.cpp
+++ b/Userland/Libraries/LibWeb/Layout/InitialContainingBlock.cpp
@@ -79,7 +79,23 @@ void InitialContainingBlock::recompute_selection_states()
auto* start_container = range->start_container();
auto* end_container = range->end_container();
- // 3. If the selection starts and ends in the same text node, mark it as StartAndEnd and return.
+ // 3. If the selection starts and ends in the same node:
+ if (start_container == end_container) {
+ // 1. If the selection starts and ends at the same offset, return.
+ if (range->start_offset() == range->end_offset()) {
+ // NOTE: A zero-length selection should not be visible.
+ return;
+ }
+
+ // 2. If it's a text node, mark it as StartAndEnd and return.
+ if (is<DOM::Text>(*start_container)) {
+ if (auto* layout_node = start_container->layout_node()) {
+ layout_node->set_selection_state(SelectionState::StartAndEnd);
+ }
+ return;
+ }
+ }
+
if (start_container == end_container && is<DOM::Text>(*start_container)) {
if (auto* layout_node = start_container->layout_node()) {
layout_node->set_selection_state(SelectionState::StartAndEnd);