aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2014-12-31 19:04:26 +0000
committerStephen Blott2014-12-31 20:00:07 +0000
commitf2b428b4fe1eecd66ee95513da779470f7c621aa (patch)
tree038032ba697ec0a46b1647b73866901195b27520
parent4a00f76f2ad3d0ec8cdb70c7e45f561d5a73ff27 (diff)
downloadvimium-f2b428b4fe1eecd66ee95513da779470f7c621aa.tar.bz2
Modes proof-of-concept.
-rw-r--r--content_scripts/mode.coffee12
-rw-r--r--content_scripts/vimium_frontend.coffee22
-rw-r--r--lib/handler_stack.coffee8
-rw-r--r--manifest.json1
4 files changed, 30 insertions, 13 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee
new file mode 100644
index 00000000..f7bf9e69
--- /dev/null
+++ b/content_scripts/mode.coffee
@@ -0,0 +1,12 @@
+root = exports ? window
+
+class root.Mode
+ constructor: (onKeydown, onKeypress, onKeyup, @popModeCallback) ->
+ @handlerId = handlerStack.push
+ keydown: onKeydown
+ keypress: onKeypress
+ keyup: onKeyup
+
+ popMode: ->
+ handlerStack.remove @handlerId
+ @popModeCallback()
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index ae275f0c..5f8b050f 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -4,7 +4,6 @@
# background page that we're in domReady and ready to accept normal commands by connectiong to a port named
# "domReady".
#
-window.handlerStack = new HandlerStack
insertModeLock = null
findMode = false
@@ -110,6 +109,8 @@ initializePreDomReady = ->
settings.addEventListener("load", LinkHints.init.bind(LinkHints))
settings.load()
+ nf = -> true
+ new Mode(onKeydown, onKeypress, onKeyup, nf)
Scroller.init settings
checkIfEnabledForUrl()
@@ -169,9 +170,11 @@ initializeWhenEnabled = (newPassKeys) ->
if (!installedListeners)
# Key event handlers fire on window before they do on document. Prefer window for key events so the page
# can't set handlers to grab the keys before us.
- installListener window, "keydown", onKeydown
- installListener window, "keypress", onKeypress
- installListener window, "keyup", onKeyup
+ for type in ["keydown", "keypress", "keyup"]
+ do (type) ->
+ installListener window, type, (event) ->
+ console.log type
+ handlerStack.bubbleEvent type, event
installListener document, "focus", onFocusCapturePhase
installListener document, "blur", onBlurCapturePhase
installListener document, "DOMActivate", onDOMActivate
@@ -398,8 +401,6 @@ KeydownEvents =
# Note that some keys will only register keydown events and not keystroke events, e.g. ESC.
#
onKeypress = (event) ->
- return unless handlerStack.bubbleEvent('keypress', event)
-
keyChar = ""
# Ignore modifier keys by themselves.
@@ -424,8 +425,7 @@ onKeypress = (event) ->
keyPort.postMessage({ keyChar:keyChar, frameId:frameId })
onKeydown = (event) ->
- return unless handlerStack.bubbleEvent('keydown', event)
-
+ console.log "onKeydown"
keyChar = ""
# handle special keys, and normal input keys with modifiers being pressed. don't handle shiftKey alone (to
@@ -518,11 +518,7 @@ onKeydown = (event) ->
KeydownEvents.push event
onKeyup = (event) ->
- handledKeydown = KeydownEvents.pop event
- return unless handlerStack.bubbleEvent("keyup", event)
-
- # Don't propagate the keyup to the underlying page if Vimium has handled it. See #733.
- DomUtils.suppressPropagation(event) if handledKeydown
+ DomUtils.suppressPropagation(event) if KeydownEvents.pop event
checkIfEnabledForUrl = ->
url = window.location.toString()
diff --git a/lib/handler_stack.coffee b/lib/handler_stack.coffee
index 858f2ec9..728ea4bc 100644
--- a/lib/handler_stack.coffee
+++ b/lib/handler_stack.coffee
@@ -5,6 +5,7 @@ class root.HandlerStack
constructor: ->
@stack = []
@counter = 0
+ @passThrough = {}
genId: -> @counter = ++@counter & 0xffff
@@ -18,6 +19,7 @@ class root.HandlerStack
# propagation by returning a falsy value.
bubbleEvent: (type, event) ->
for i in [(@stack.length - 1)..0] by -1
+ console.log i, type
handler = @stack[i]
# We need to check for existence of handler because the last function call may have caused the release
# of more than one handler.
@@ -27,6 +29,10 @@ class root.HandlerStack
if not passThrough
DomUtils.suppressEvent(event)
return false
+ # If @passThrough is returned, then discontinue further bubbling and pass the event through to the
+ # underlying page. The event is not suppresssed.
+ if passThrough == @passThrough
+ return false
true
remove: (id = @currentId) ->
@@ -35,3 +41,5 @@ class root.HandlerStack
if handler.id == id
@stack.splice(i, 1)
break
+
+root.handlerStack = new HandlerStack
diff --git a/manifest.json b/manifest.json
index a365f390..dca01b49 100644
--- a/manifest.json
+++ b/manifest.json
@@ -43,6 +43,7 @@
"content_scripts/vomnibar.js",
"content_scripts/scroller.js",
"content_scripts/marks.js",
+ "content_scripts/mode.js",
"content_scripts/vimium_frontend.js"
],
"css": ["content_scripts/vimium.css"],