aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts
diff options
context:
space:
mode:
Diffstat (limited to 'content_scripts')
-rw-r--r--content_scripts/mode.coffee19
-rw-r--r--content_scripts/mode_visual.coffee6
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) =>