Bug 6350

Summary: Selection shouldn't exclude collapsed whitespace
Product: WebKit Reporter: Alexey Proskuryakov <ap>
Component: HTML EditingAssignee: Nobody <webkit-unassigned>
Status: RESOLVED CONFIGURATION CHANGED    
Severity: Normal CC: ahmad.saleem792, bfulgham, emacemac7, eric, evan, ian, michael.vm, rniwa, webkit-bug-importer
Priority: P2 Keywords: HasReduction, InRadar
Version: 420+   
Hardware: Mac   
OS: OS X 10.4   
Bug Depends on: 23793    
Bug Blocks:    
Attachments:
Description Flags
test case none

Description Alexey Proskuryakov 2006-01-03 03:29:54 PST
If a selection range set via setBaseAndExtent starts or ends with collapsed whitespace, it is excluded from 
the range, which doesn't happen in Firefox.
Comment 1 Alexey Proskuryakov 2006-01-03 03:30:34 PST
Created attachment 5446 [details]
test case
Comment 2 Justin Garcia 2006-01-04 01:23:55 PST
Here's why this happens:

Positions passed to Selection::setBaseAndExtent are used to construct VisiblePositions.  VisiblePositions 
take the input position and find its canonical position: the position that is visually equivalent but "deep" 
and at a rendered offset (this canonical position is referred to internally as a "deep equivalent" and is 
returned by VisiblePosition::deepEquivalent())  For example:

<div><b>hello   world</b></div>

A VisiblePosition created with the Position (div, 0), would have a "deep equivalent" of (textnode, 0).
A VisiblePosition created with the Positions (textnode, 6), (textnode, 7), and (textnode, 8) would all 
have deep equivalents of (textnode, 8).

The behavior you see is caused because SelectionController takes the Positions passed to 
setBaseAndExxtent, creates VisiblePositions, then sets the base and the extent to the deep equivalents 
of those VisiblePositions.

SelectionController does even more fiddling with its positions.  When it creates start/end (from base/
extent), it upstream()s the end and downstream()s the start.  Comments in SelectionController claim 
that this is necessary to "constrain" the selection to the fewest possible nodes, in order to make it 
canonical for purposes of comparison with other selections.  I'm not sure why this is necessary, since 
VisiblePosition's are already canonical.

Both of these things need to be addressed to fix this kind of bug (when ranges change when they are 
used to make selections).
Comment 3 Alexey Proskuryakov 2007-12-29 11:17:38 PST
See also: bug 15256.
Comment 4 Ahmad Saleem 2022-07-30 10:25:51 PDT
I am able to reproduce this bug using attached test case in Safari 15.6 on macOS 12.5 and it shows offSet of 1 & 7 rather than 0 and 8.

*** Safari 15.6 on macOS 12.5 ***

body.firstChild.nodeValue: \n123456\n
anchor: [object Text], offset: 1
focus: [object Text], offset: 7

*** Chrome Canary 106 ***

body.firstChild.nodeValue: \n123456\n
anchor: [object Text], offset: 0
focus: [object Text], offset: 8

*** Firefox Nightly 105 ***

body.firstChild.nodeValue: \n123456\n
anchor: [object Text], offset: 0
focus: [object Text], offset: 8

________

I am not sure on web-spec but just wanted to share latest test results. Thanks!
Comment 5 Radar WebKit Bug Importer 2022-07-30 10:41:38 PDT
<rdar://problem/97840483>
Comment 6 Ahmad Saleem 2023-02-25 07:37:06 PST
Fixed by Live Range Selection API. Confirmed on Safari Technology Preview 164.

Marking this as "RESOLVED CONFIGURATION CHANGED". Thanks!