diff options
| author | Stephen Blott | 2015-01-11 15:01:12 +0000 |
|---|---|---|
| committer | Stephen Blott | 2015-01-11 15:54:47 +0000 |
| commit | 8066a3838ef44b010f6dfb46cea8b47c6bdfc087 (patch) | |
| tree | 209fe896b61e34c6d622584d9e0d7773b288828e /content_scripts | |
| parent | f76c15c6ae6565c0c08569a127974dfd3383ed88 (diff) | |
| download | vimium-8066a3838ef44b010f6dfb46cea8b47c6bdfc087.tar.bz2 | |
Modes; yet more tweaks, yet more tests.
Diffstat (limited to 'content_scripts')
| -rw-r--r-- | content_scripts/mode.coffee | 14 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 42 |
2 files changed, 32 insertions, 24 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee index dd797c46..1c6cddb1 100644 --- a/content_scripts/mode.coffee +++ b/content_scripts/mode.coffee @@ -44,7 +44,7 @@ count = 0 class Mode # If Mode.debug is true, then we generate a trace of modes being activated and deactivated on the console, along # with a list of the currently active modes. - debug: false + debug: true @modes: [] # Constants; short, readable names for handlerStack event-handler return values. @@ -205,10 +205,14 @@ class Mode log: (args...) -> console.log args... + # Return the name of the must-recently activated mode. + @top: -> + @modes[@modes.length-1]?.name + # BadgeMode is a pseudo mode for triggering badge updates on focus changes and state updates. It sits at the # bottom of the handler stack, and so it receives state changes *after* all other modes, and can override the # badge choice of the other active modes. -# Note. We create the the one-and-only instance, here. +# Note. We create the the one-and-only instance here. new class BadgeMode extends Mode constructor: () -> super @@ -223,16 +227,18 @@ new class BadgeMode extends Mode "focus": => @alwaysContinueBubbling -> Mode.updateBadge() chooseBadge: (badge) -> - # If we're not enabled, then post an empty badge. + # If we're not enabled, then post an empty badge. BadgeMode is last, so this takes priority. badge.badge = "" unless @enabled + # When the registerStateChange event bubbles to the bottom of the stack, all modes have been notified. So + # it's now time to update the badge. registerStateChange: -> Mode.updateBadge() # KeySuppressor is a pseudo mode (near the bottom of the stack) which suppresses keyboard events tagged with # the "vimium_suppress_event" property. This allows modes higher up in the stack to tag events for # suppression, but only after verifying that no other mode (notably, normal mode) wants to handle the event. -# Note. We create the the one-and-only instance, here. +# Note. We create the the one-and-only instance here. new class KeySuppressor extends Mode constructor: -> super diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index ed5844dc..09e19486 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -108,9 +108,9 @@ class NormalMode extends Mode super name: "normal" badge: "N" - keydown: onKeydown - keypress: onKeypress - keyup: onKeyup + keydown: (event) => onKeydown.call @, event + keypress: (event) => onKeypress.call @, event + keyup: (event) => onKeyup.call @, event chooseBadge: (badge) -> super badge @@ -460,7 +460,7 @@ KeydownEvents = # # Note that some keys will only register keydown events and not keystroke events, e.g. ESC. # - +# @/this, here, is the the normal-mode Mode object. onKeypress = (event) -> keyChar = "" @@ -471,25 +471,26 @@ onKeypress = (event) -> # Enter insert mode when the user enables the native find interface. if (keyChar == "f" && KeyboardUtils.isPrimaryModifierKey(event)) enterInsertModeWithoutShowingIndicator() - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue if (keyChar) if (findMode) handleKeyCharForFindMode(keyChar) DomUtils.suppressEvent(event) - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue else if (!isInsertMode() && !findMode) if (isPassKey keyChar) - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue if currentCompletionKeys.indexOf(keyChar) != -1 or isValidFirstKey(keyChar) DomUtils.suppressEvent(event) keyPort.postMessage({ keyChar:keyChar, frameId:frameId }) - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue keyPort.postMessage({ keyChar:keyChar, frameId:frameId }) - return true + return @continueBubbling +# @/this, here, is the the normal-mode Mode object. onKeydown = (event) -> keyChar = "" @@ -529,37 +530,37 @@ onKeydown = (event) -> exitInsertMode() DomUtils.suppressEvent event KeydownEvents.push event - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue else if (findMode) if (KeyboardUtils.isEscape(event)) handleEscapeForFindMode() DomUtils.suppressEvent event KeydownEvents.push event - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) handleDeleteForFindMode() DomUtils.suppressEvent event KeydownEvents.push event - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue else if (event.keyCode == keyCodes.enter) handleEnterForFindMode() DomUtils.suppressEvent event KeydownEvents.push event - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue else if (!modifiers) DomUtils.suppressPropagation(event) KeydownEvents.push event - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue else if (isShowingHelpDialog && KeyboardUtils.isEscape(event)) hideHelpDialog() DomUtils.suppressEvent event KeydownEvents.push event - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue else if (!isInsertMode() && !findMode) if (keyChar) @@ -567,7 +568,7 @@ onKeydown = (event) -> DomUtils.suppressEvent event KeydownEvents.push event keyPort.postMessage({ keyChar:keyChar, frameId:frameId }) - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue keyPort.postMessage({ keyChar:keyChar, frameId:frameId }) @@ -589,14 +590,15 @@ onKeydown = (event) -> isValidFirstKey(KeyboardUtils.getKeyChar(event)))) DomUtils.suppressPropagation(event) KeydownEvents.push event - return handlerStack.stopBubblingAndTrue + return @stopBubblingAndTrue - return true + return @continueBubbling +# @/this, here, is the the normal-mode Mode object. onKeyup = (event) -> - return true unless KeydownEvents.pop event + return @continueBubbling unless KeydownEvents.pop event DomUtils.suppressPropagation(event) - handlerStack.stopBubblingAndTrue + @stopBubblingAndTrue checkIfEnabledForUrl = -> url = window.location.toString() |
