From 2fe40dd69bb93b620da60464b9cb57c36adaeca1 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Thu, 8 Jan 2015 12:02:03 +0000 Subject: Modes; incorporate small changes from #1413. Slightly more significant: Move several utilities to dome_utils. --- lib/dom_utils.coffee | 18 ++++++++++++++++++ lib/handler_stack.coffee | 6 +++--- 2 files changed, 21 insertions(+), 3 deletions(-) (limited to 'lib') 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) -> -- cgit v1.2.3