aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/vimium_frontend.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'content_scripts/vimium_frontend.coffee')
-rw-r--r--content_scripts/vimium_frontend.coffee54
1 files changed, 43 insertions, 11 deletions
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 2df2e226..c0f98d85 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -8,9 +8,7 @@
insertMode = null
passKeysMode = null
insertModeLock = null
-# FIXME(smblott). Temporary hack: attach findMode to the window (so passKeysMode can see it). This will be
-# fixed when find mode is rationalized or #1401 is merged.
-window.findMode = false
+findMode = false
findModeQuery = { rawQuery: "", matchCount: 0 }
findModeQueryHasResults = false
findModeAnchorNode = null
@@ -729,6 +727,42 @@ handleEnterForFindMode = ->
document.body.classList.add("vimiumFindMode")
settings.set("findModeRawQuery", findModeQuery.rawQuery)
+class FindMode extends Mode
+ constructor: ->
+ super
+ name: "find"
+ badge: "F"
+
+ keydown: (event) =>
+ if KeyboardUtils.isEscape event
+ handleEscapeForFindMode()
+ @exit()
+ Mode.suppressPropagation
+ else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey)
+ handleDeleteForFindMode()
+ Mode.suppressPropagation
+ else if (event.keyCode == keyCodes.enter)
+ handleEnterForFindMode()
+ @exit()
+ Mode.suppressPropagation
+ else
+ DomUtils.suppressPropagation(event)
+ handlerStack.eventConsumed
+
+ keypress: (event) ->
+ handlerStack.neverPropagate ->
+ if event.keyCode > 31
+ keyChar = String.fromCharCode event.charCode
+ handleKeyCharForFindMode keyChar if keyChar
+
+ keyup: (event) -> handlerStack.neverPropagate -> false
+
+ # Prevent insert mode from detecting a focused editable element.
+ @handlers.push handlerStack.push
+ focus: (event) -> handlerStack.neverPropagate (event) ->
+
+ Mode.updateBadge()
+
performFindInPlace = ->
cachedScrollX = window.scrollX
cachedScrollY = window.scrollY
@@ -747,25 +781,21 @@ performFindInPlace = ->
# :options is an optional dict. valid parameters are 'caseSensitive' and 'backwards'.
executeFind = (query, options) ->
+ result = null
options = options || {}
- # rather hacky, but this is our way of signalling to the insertMode listener not to react to the focus
- # changes that find() induces.
- oldFindMode = findMode
- window.findMode = true # Same hack, see comment at window.findMode definition.
-
document.body.classList.add("vimiumFindMode")
# prevent find from matching its own search query in the HUD
HUD.hide(true)
# ignore the selectionchange event generated by find()
document.removeEventListener("selectionchange",restoreDefaultSelectionHighlight, true)
- result = window.find(query, options.caseSensitive, options.backwards, true, false, true, false)
+ Mode.runIn FindMode, ->
+ result = window.find(query, options.caseSensitive, options.backwards, true, false, true, false)
setTimeout(
-> document.addEventListener("selectionchange", restoreDefaultSelectionHighlight, true)
0)
- window.findMode = oldFindMode # Same hack, see comment at window.findMode definition.
# we need to save the anchor node here because <esc> seems to nullify it, regardless of whether we do
# preventDefault()
findModeAnchorNode = document.getSelection().anchorNode
@@ -839,6 +869,7 @@ findAndFocus = (backwards) ->
if (KeyboardUtils.isEscape(event))
DomUtils.simulateSelect(document.activeElement)
enterInsertModeWithoutShowingIndicator(document.activeElement)
+ insertMode.activate()
return false # we have "consumed" this event, so do not propagate
return true
})
@@ -958,8 +989,9 @@ showFindModeHUDForQuery = ->
window.enterFindMode = ->
findModeQuery = { rawQuery: "" }
- window.findMode = true # Same hack, see comment at window.findMode definition.
+ # window.findMode = true # Same hack, see comment at window.findMode definition.
HUD.show("/")
+ new FindMode()
exitFindMode = ->
window.findMode = false # Same hack, see comment at window.findMode definition.