aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/mode.coffee18
-rw-r--r--content_scripts/mode_find.coffee4
-rw-r--r--content_scripts/mode_visual.coffee5
-rw-r--r--content_scripts/vimium_frontend.coffee6
-rw-r--r--lib/utils.coffee11
-rw-r--r--tests/dom_tests/dom_tests.coffee2
6 files changed, 12 insertions, 34 deletions
diff --git a/content_scripts/mode.coffee b/content_scripts/mode.coffee
index 205b8288..d5775ad7 100644
--- a/content_scripts/mode.coffee
+++ b/content_scripts/mode.coffee
@@ -109,15 +109,14 @@ class Mode
"scroll": (event) => @alwaysContinueBubbling => @exit event
# Some modes are singletons: there may be at most one instance active at any time. A mode is a singleton
- # if @options.singleton is truthy. The value of @options.singleton should be the key which is intended to
- # be unique. New instances deactivate existing instances with the same key.
+ # if @options.singleton is set. The value of @options.singleton should be the key which is intended to be
+ # unique. New instances deactivate existing instances with the same key.
if @options.singleton
- do =>
- singletons = Mode.singletons ||= {}
- key = Utils.getIdentity @options.singleton
- @onExit -> delete singletons[key]
- @deactivateSingleton @options.singleton
- singletons[key] = this
+ singletons = Mode.singletons ||= {}
+ key = @options.singleton
+ @onExit -> delete singletons[key]
+ singletons[key]?.exit()
+ singletons[key] = this
# If @options.passInitialKeyupEvents is set, then we pass initial non-printable keyup events to the page
# or to other extensions (because the corresponding keydown events were passed). This is used when
@@ -182,9 +181,6 @@ class Mode
@modeIsActive = false
@setIndicator()
- deactivateSingleton: (singleton) ->
- Mode.singletons?[Utils.getIdentity singleton]?.exit()
-
# Shorthand for an otherwise long name. This wraps a handler with an arbitrary return value, and always
# yields @continueBubbling instead. This simplifies handlers if they always continue bubbling (a common
# case), because they do not need to be concerned with the value they yield.
diff --git a/content_scripts/mode_find.coffee b/content_scripts/mode_find.coffee
index e863b553..ad7cc136 100644
--- a/content_scripts/mode_find.coffee
+++ b/content_scripts/mode_find.coffee
@@ -33,8 +33,8 @@ class PostFindMode extends SuppressPrintable
super
name: "post-find"
- # PostFindMode shares a singleton with the modes launched by focusInput; each displaces the other.
- singleton: element
+ # PostFindMode shares a singleton with focusInput; each displaces the other.
+ singleton: "post-find-mode/focus-input"
exitOnBlur: element
exitOnClick: true
keydown: (event) -> InsertMode.suppressEvent event # Always truthy, so always continues bubbling.
diff --git a/content_scripts/mode_visual.coffee b/content_scripts/mode_visual.coffee
index 20560298..a6102987 100644
--- a/content_scripts/mode_visual.coffee
+++ b/content_scripts/mode_visual.coffee
@@ -212,9 +212,6 @@ class VisualMode extends KeyHandlerMode
"c": -> @movement.collapseSelectionToAnchor(); new CaretMode
"o": -> @movement.reverseSelection()
- # TODO(smblott): "aw", etc.
- # TODO(smblott): simplify singletons.
-
constructor: (options = {}) ->
@movement = new Movement options.alterMethod ? "extend"
@selection = @movement.selection
@@ -236,7 +233,7 @@ class VisualMode extends KeyHandlerMode
super extend options,
name: options.name ? "visual"
indicator: options.indicator ? "Visual mode"
- singleton: VisualMode
+ singleton: "visual-mode-group" # Visual mode, visual-line mode and caret mode each displace each other.
exitOnEscape: true
suppressAllKeyboardEvents: true
keyMapping: keyMapping
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index ade14029..1801a3fd 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -392,8 +392,6 @@ extend window,
selectedInputIndex += hints.length + (if event.shiftKey then -1 else 1)
selectedInputIndex %= hints.length
hints[selectedInputIndex].classList.add 'internalVimiumSelectedInputHint'
- # Deactivate any active modes on this element (PostFindMode, or a suspended edit mode).
- @deactivateSingleton visibleInputs[selectedInputIndex].element
DomUtils.simulateSelect visibleInputs[selectedInputIndex].element
@suppressEvent
else unless event.keyCode == KeyboardUtils.keyCodes.shiftKey
@@ -405,8 +403,6 @@ extend window,
id: "vimiumInputMarkerContainer"
className: "vimiumReset"
- # Deactivate any active modes on this element (PostFindMode, or a suspended edit mode).
- @deactivateSingleton visibleInputs[selectedInputIndex].element
DomUtils.simulateSelect visibleInputs[selectedInputIndex].element
if visibleInputs.length == 1
@exit()
@@ -419,7 +415,7 @@ extend window,
DomUtils.removeElement @hintContainingDiv
if mode and document.activeElement and DomUtils.isEditable document.activeElement
new mode
- singleton: document.activeElement
+ singleton: "post-find-mode/focus-input"
targetElement: document.activeElement
indicator: false
diff --git a/lib/utils.coffee b/lib/utils.coffee
index 31f4bec6..60d29998 100644
--- a/lib/utils.coffee
+++ b/lib/utils.coffee
@@ -197,17 +197,6 @@ Utils =
# locale-sensitive uppercase detection
hasUpperCase: (s) -> s.toLowerCase() != s
- # Give objects (including elements) distinct identities.
- getIdentity: do ->
- identities = []
-
- (obj) ->
- index = identities.indexOf obj
- if index < 0
- index = identities.length
- identities.push obj
- "identity-" + index
-
# Return a copy of object, but with some of its properties omitted.
copyObjectOmittingProperties: (obj, properties...) ->
obj = extend {}, obj
diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee
index dad4def9..979500f5 100644
--- a/tests/dom_tests/dom_tests.coffee
+++ b/tests/dom_tests/dom_tests.coffee
@@ -744,7 +744,7 @@ context "Mode utilities",
count = 0
class Test extends Mode
- constructor: -> count += 1; super singleton: Test
+ constructor: -> count += 1; super singleton: "test"
exit: -> count -= 1; super()
assert.isTrue count == 0