diff options
| author | Stephen Blott | 2015-01-08 11:09:06 +0000 |
|---|---|---|
| committer | Stephen Blott | 2015-01-08 11:30:55 +0000 |
| commit | 637d90be6847051d20a4cf3b704d599c877a97d3 (patch) | |
| tree | 15af5d34cc20915579b4e0a19c0680bfe76fd4a0 /content_scripts/mode.coffee | |
| parent | 5d199e6c786bb2874f7ecb700d505e7b2d70d982 (diff) | |
| download | vimium-637d90be6847051d20a4cf3b704d599c877a97d3.tar.bz2 | |
Modes; more changes...
- Simplify InsertMode Trigger/Blocker (yet again).
- Reduce badge flicker for singletons.
Diffstat (limited to 'content_scripts/mode.coffee')
| -rw-r--r-- | content_scripts/mode.coffee | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee index 160debc4..632d3e99 100644 --- a/content_scripts/mode.coffee +++ b/content_scripts/mode.coffee @@ -143,15 +143,19 @@ class Mode # without having to be concerned with the result of the handler itself. alwaysContinueBubbling: (func) -> handlerStack.alwaysContinueBubbling func + # User for sometimes suppressing badge updates. + @badgeSuppressor: new Utils.Suppressor() + # Static method. Used externally and internally to initiate bubbling of an updateBadge event and to send # the resulting badge to the background page. We only update the badge if this document (hence this frame) # has the focus. @updateBadge: -> - if document.hasFocus() - handlerStack.bubbleEvent "updateBadge", badge = {badge: ""} - chrome.runtime.sendMessage - handler: "setBadge" - badge: badge.badge + @badgeSuppressor.unlessSuppressed -> + if document.hasFocus() + handlerStack.bubbleEvent "updateBadge", badge = {badge: ""} + chrome.runtime.sendMessage + handler: "setBadge" + badge: badge.badge # Temporarily install a mode to protect a function call, then exit the mode. For example, temporarily # install an InsertModeBlocker. @@ -163,14 +167,18 @@ class Mode registerSingleton: do -> singletons = {} # Static. (key) -> - singletons[key].exit() if singletons[key] + # We're currently installing a new mode. So we'll be updating the badge shortly. Therefore, we can + # suppress badge updates while exiting any existing active singleton. This prevents the badge from + # flickering in some cases. + Mode.badgeSuppressor.runSuppresed => + singletons[key].exit() if singletons[key] singletons[key] = @ @onExit => delete singletons[key] if singletons[key] == @ # 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 choices of other modes. +# badge choice of the other active modes. # Note. We also create the the one-and-only instance, here. new class BadgeMode extends Mode constructor: (options) -> @@ -179,7 +187,7 @@ new class BadgeMode extends Mode trackState: true @push - "focus": => @alwaysContinueBubbling => Mode.updateBadge() + "focus": => @alwaysContinueBubbling -> Mode.updateBadge() chooseBadge: (badge) -> # If we're not enabled, then post an empty badge. |
