diff options
| author | Stephen Blott | 2015-01-22 15:10:50 +0000 | 
|---|---|---|
| committer | Stephen Blott | 2015-01-22 15:10:50 +0000 | 
| commit | 5493c2f3f878f495a41eb524ab1a8030c7411796 (patch) | |
| tree | 190a4b0dc9969c1dc6f46982d8d88b892b495951 | |
| parent | d7b416747e5cf6971737a3f70243618419a1ac4b (diff) | |
| download | vimium-5493c2f3f878f495a41eb524ab1a8030c7411796.tar.bz2 | |
Visual/edit modes: faster "o" implementation.
| -rw-r--r-- | content_scripts/mode_visual_edit.coffee | 21 | 
1 files changed, 15 insertions, 6 deletions
diff --git a/content_scripts/mode_visual_edit.coffee b/content_scripts/mode_visual_edit.coffee index a5d8ff45..0f335a9b 100644 --- a/content_scripts/mode_visual_edit.coffee +++ b/content_scripts/mode_visual_edit.coffee @@ -68,6 +68,7 @@ class Movement extends MaintainCount    # Get the direction of the selection, either forward or backward.    # FIXME(smblott).  There has to be a better way! +  # NOTE(smblott).  There is. See here: https://dom.spec.whatwg.org/#interface-range.    getDirection: ->      # Try to move the selection forward or backward, then check whether it got bigger or smaller (then restore      # it). @@ -119,15 +120,23 @@ class Movement extends MaintainCount      "W": -> @moveByWord backward      "o": -> -      # FIXME(smblott).  This is super slow if the selection is large. -      length = @selection.toString().length +      # Swap the anchor and focus. +      # Note(smblott). I can't find an approach which works for both cases, so we have to implement each case +      # separately. +      original = @selection.getRangeAt 0        switch @getDirection()          when forward -          @selection.collapseToEnd() -          @selection.modify "extend", backward, character for [0...length] +          range = original.cloneRange() +          range.collapse false +          @selection.removeAllRanges() +          @selection.addRange range +          @selection.extend original.startContainer, original.startOffset          when backward -          @selection.collapseToStart() -          @selection.modify "extend", forward, character for [0...length] +          range = document.createRange() +          range.setStart @selection.focusNode, @selection.focusOffset +          range.setEnd @selection.anchorNode, @selection.anchorOffset +          @selection.removeAllRanges() +          @selection.addRange range    # TODO(smblott). What do we do if there is no initial selection?  Or multiple ranges?    constructor: (options) ->  | 
