diff options
Diffstat (limited to 'content_scripts/vimium_frontend.coffee')
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 54 | 
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.  | 
