aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorStephen Blott2015-01-08 12:02:03 +0000
committerStephen Blott2015-01-08 12:40:34 +0000
commit2fe40dd69bb93b620da60464b9cb57c36adaeca1 (patch)
treefb88cbc9081da1f66ec435dd96b0872ce45762e4 /lib
parent637d90be6847051d20a4cf3b704d599c877a97d3 (diff)
downloadvimium-2fe40dd69bb93b620da60464b9cb57c36adaeca1.tar.bz2
Modes; incorporate small changes from #1413.
Slightly more significant: Move several utilities to dome_utils.
Diffstat (limited to 'lib')
-rw-r--r--lib/dom_utils.coffee18
-rw-r--r--lib/handler_stack.coffee6
2 files changed, 21 insertions, 3 deletions
diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee
index 1a992b43..9d7ca867 100644
--- a/lib/dom_utils.coffee
+++ b/lib/dom_utils.coffee
@@ -141,6 +141,24 @@ DomUtils =
(element.nodeName.toLowerCase() == "input" && unselectableTypes.indexOf(element.type) == -1) ||
element.nodeName.toLowerCase() == "textarea"
+ # Input or text elements are considered focusable and able to receieve their own keyboard events, and will
+ # enter insert mode if focused. Also note that the "contentEditable" attribute can be set on any element
+ # which makes it a rich text editor, like the notes on jjot.com.
+ isEditable: (element) ->
+ return true if element.isContentEditable
+ nodeName = element.nodeName?.toLowerCase()
+ # Use a blacklist instead of a whitelist because new form controls are still being implemented for html5.
+ if nodeName == "input" and element.type not in ["radio", "checkbox"]
+ return true
+ nodeName in ["textarea", "select"]
+
+ # Embedded elements like Flash and quicktime players can obtain focus.
+ isEmbed: (element) ->
+ element.nodeName?.toLowerCase() in ["embed", "object"]
+
+ isFocusable: (element) ->
+ @isEditable(element) or @isEmbed element
+
isDOMDescendant: (parent, child) ->
node = child
while (node != null)
diff --git a/lib/handler_stack.coffee b/lib/handler_stack.coffee
index 718bee9d..97e189c5 100644
--- a/lib/handler_stack.coffee
+++ b/lib/handler_stack.coffee
@@ -58,10 +58,10 @@ class HandlerStack
@stack.splice(i, 1)
break
- # The handler stack handles chrome events (which may need to be suppressed) and internal (fake) events.
- # This checks whether that the event at hand is a chrome event.
+ # The handler stack handles chrome events (which may need to be suppressed) and internal (pseudo) events.
+ # This checks whether the event at hand is a chrome event.
isChromeEvent: (event) ->
- event?.preventDefault? and event?.stopImmediatePropagation?
+ event?.preventDefault? or event?.stopImmediatePropagation?
# Convenience wrappers.
alwaysContinueBubbling: (handler) ->