From b10eebf7a014556fbee7d7df0d8589536d0090c1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 29 Feb 2024 13:59:17 +0530 Subject: [PATCH] Workaround chromium causing selection start to also change when end is changed in some circumstances Fixes #2054934 [Extra text copied when selecting across pages](https://bugs.launchpad.net/calibre/+bug/2054934) --- src/pyj/select.pyj | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/pyj/select.pyj b/src/pyj/select.pyj index 6840e995fe..9b887f556d 100644 --- a/src/pyj/select.pyj +++ b/src/pyj/select.pyj @@ -228,13 +228,15 @@ def move_end_of_selection(pos, start): else: # point is inside the selection start = False + new_range = document.createRange() if start: - if r.startContainer is not p.offsetNode or r.startOffset is not p.offset: - r.setStart(p.offsetNode, p.offset) - sel.removeAllRanges() - sel.addRange(r) + new_range.setStart(p.offsetNode, p.offset) + new_range.setEnd(r.endContainer, r.endOffset) + other_boundary_changed = r.endContainer is not new_range.endContainer or r.endOffset is not new_range.endOffset else: - if r.endContainer is not p.offsetNode or r.endOffset is not p.offset: - r.setEnd(p.offsetNode, p.offset) - sel.removeAllRanges() - sel.addRange(r) + new_range.setStart(r.startContainer, r.startOffset) + new_range.setEnd(p.offsetNode, p.offset) + other_boundary_changed = r.startContainer is not new_range.startContainer or r.startOffset is not new_range.startOffset + if not new_range.collapsed or not other_boundary_changed: + sel.removeAllRanges() + sel.addRange(new_range)