[webkit-dev] DOMRange and khtml::Selection direction

Duncan Wilcox duncan at mclink.it
Sun Aug 14 08:13:12 PDT 2005


So far I have added support for this:

typedef enum {
     WebTextSelectForward,
     WebTextSelectBackward
} WebTextSelectionDirection;

typedef enum {
     WebTextSelectByCharacter,
     WebTextSelectByWord,
     WebTextSelectByLine,
     WebTextSelectByParagraph
} WebTextSelectionGranularity;

@interface WebSelection : NSObject
{
     DOMRange *range;
     NSSelectionAffinity affinity;
     WebTextSelectionDirection direction;
     WebTextSelectionGranularity granularity;
}

+ (id)webSelectionWithRange:(DOMRange *)selectionRange affinity: 
(NSSelectionAffinity)selectionAffinity direction: 
(WebTextSelectionDirection)selectionDirection granularity: 
(WebTextSelectionGranularity)selectionGranularity;
- (DOMRange *)range;
- (void)setRange:(DOMRange *)newRange;
- (NSSelectionAffinity)affinity;
- (void)setAffinity:(NSSelectionAffinity)newAffinity;
- (WebTextSelectionDirection)direction;
- (void)setDirection:(WebTextSelectionDirection)newDirection;
- (WebTextSelectionGranularity)granularity;
- (void)setGranularity:(WebTextSelectionGranularity)newGranularity;

@end

@interface WebView (WebPendingPublic)
- (void)setSelection:(WebSelection *)selection;
- (WebSelection *)selection;
@end

@interface NSObject (WebEditingDelegatePendingPublic)
- (BOOL)webView:(WebView *)webView shouldChangeSelection: 
(WebSelection *)current toSelection:(WebSelection *)proposed  
stillSelecting:(BOOL)flag;
@end

The original problem of dragging backwards with the mouse is mostly  
solved, except for when the selection granularity is not character.

What I think is happening is that the khtml::Selection m_base and  
m_extent contain text range the mouse actually dragged over, while  
m_start and m_end contain the same selection expanded with the  
current granularity.

Again, this information is not being carried through neither the  
DOMRange nor the WebSelection, so when dragging over some text with a  
delegate like this:

- (BOOL)webView:(WebView *)webView shouldChangeSelection: 
(WebSelection *)current toSelection:(WebSelection *)proposed  
stillSelecting:(BOOL)flag
{
     [webView setSelection:proposed];
     return NO;
}

what happens is that the granularity-expanded selection is re- 
expanded at every mouse drag event, because the programmatically set  
selection doesn't have the correct m_base/m_extent, and the selection  
quickly expands all the way to the end of line (and on to the end of  
page).

So the issue is extending the WebSelection to add this state  
information, but I'm unsure about what might be the best way. Clearly  
adding m_base and m_extent (as DOMNode *node; long offset; pairs),  
would mean the direction becomes redundant. Another option would be  
retaining the direction and adding a straightened m_base/m_extent  
pair encoded as a DOMRange, that would contain the non-expanded  
selection.

Ideas?

Thanks,
Duncan




More information about the webkit-dev mailing list