diff options
| author | Stephen Blott | 2015-01-03 18:32:47 +0000 | 
|---|---|---|
| committer | Stephen Blott | 2015-01-03 18:33:33 +0000 | 
| commit | 7537736a0898f736d689092b9bd350886f327ab0 (patch) | |
| tree | 78cc0cd10b1576b01c17c73b1c6b4e69c19a6858 | |
| parent | 6a817e575d55daec146203e7ef8929fdfd81bace (diff) | |
| download | vimium-7537736a0898f736d689092b9bd350886f327ab0.tar.bz2 | |
Modes; add ConstrainedMode.
| -rw-r--r-- | content_scripts/mode.coffee | 19 | ||||
| -rw-r--r-- | content_scripts/mode_visual.coffee | 6 | 
2 files changed, 22 insertions, 3 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee index a19c3df0..e4e2679d 100644 --- a/content_scripts/mode.coffee +++ b/content_scripts/mode.coffee @@ -83,7 +83,26 @@ class MultiMode extends Mode    exit: ->      mode.exit() for mode in modes +# When the user clicks anywhere outside of the given element, the mode is exited. +class ConstrainedMode extends Mode +  constructor: (@element, options) -> +    options.name = if options.name? then "constrained-#{options.name}" else "constrained" +    super options + +    @handlers.push handlerStack.push +      "click": (event) => +        @exit() unless @isDOMDescendant @element, event.srcElement +        @continueBubbling + +  isDOMDescendant: (parent, child) -> +    node = child +    while (node != null) +      return true if (node == parent) +      node = node.parentNode +    false +  root = exports ? window  root.Mode = Mode  root.SingletonMode = SingletonMode  root.MultiMode = MultiMode +root.ConstrainedMode = ConstrainedMode diff --git a/content_scripts/mode_visual.coffee b/content_scripts/mode_visual.coffee index 67f485a0..07530e94 100644 --- a/content_scripts/mode_visual.coffee +++ b/content_scripts/mode_visual.coffee @@ -1,12 +1,12 @@ -class VisualMode extends Mode +class VisualMode extends ConstrainedMode    # Proposal...  The visual selection must stay within element.  This will become relevant if we ever get so    # far as implementing a vim-like editing mode for text areas/content editable.    #    constructor: (element=document.body) -> -    super -      name: "Visual" +    super element, +      name: "visual"        badge: "V"        keydown: (event) =>  | 
