diff options
| -rw-r--r-- | content_scripts/hud.coffee | 24 | ||||
| -rw-r--r-- | content_scripts/vimium.css | 15 | ||||
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 2 | ||||
| -rw-r--r-- | pages/hud.coffee | 22 | ||||
| -rw-r--r-- | pages/hud.html | 2 | 
5 files changed, 54 insertions, 11 deletions
| diff --git a/content_scripts/hud.coffee b/content_scripts/hud.coffee index 64ebd8e3..787be6a9 100644 --- a/content_scripts/hud.coffee +++ b/content_scripts/hud.coffee @@ -28,10 +28,6 @@ HUD =    showFindMode: (text = "") ->      return unless @enabled() -    # NOTE(mrmr1993): We set findModeQuery.rawQuery here rather in search while we still handle keys in the -    # main frame. When key handling is moved to the HUD iframe, this line should be deleted, and the -    # equivalent in search should be uncommented. -    findModeQuery.rawQuery = text      @hudUI.show {name: "showFindMode", text}      @tween.fade 1.0, 150 @@ -39,10 +35,7 @@ HUD =      @hudUI.postMessage {name: "updateMatchesCount", matchCount, showMatchText}    search: (data) -> -    # NOTE(mrmr1993): The following line is disabled as it is currently vulnerable to a race condition when a -    # user types quickly. When all of the key handling is done in the HUD iframe, this should be uncommented, -    # and the equivalent line in showFindMode should be deleted. -    #findModeQuery.rawQuery = data.query +    findModeQuery.rawQuery = data.query      updateFindModeQuery()      performFindInPlace()      showFindModeHUDForQuery() @@ -63,6 +56,21 @@ HUD =      else        @tween.fade 0, 150, => @hide true, updateIndicator +  hideFindMode: (data) -> +    # An element element won't receive a focus event if the search landed on it while we were in the HUD +    # iframe. To end up with the correct modes active, we create a focus/blur event manually after refocusing +    # this window. +    window.focus() +    focusNode = window.getSelection().focusNode +    focusNode = focusNode.parentElement if focusNode? and focusNode.nodeType != focusNode.ELEMENT_NODE +    if focusNode? and DomUtils.isFocusable focusNode +      focusNode.focus() +    else +      document.activeElement?.blur() + +    findModeQuery.rawQuery = data.query +    handlerStack.bubbleEvent "keydown", data.event +    isReady: do ->      ready = false      DomUtils.documentReady -> ready = true diff --git a/content_scripts/vimium.css b/content_scripts/vimium.css index 7b501f94..e02df7c2 100644 --- a/content_scripts/vimium.css +++ b/content_scripts/vimium.css @@ -284,9 +284,20 @@ iframe.vimiumHUDFrame {    opacity: 0;  } +div.vimiumHUD span#hud-find-input, div.vimiumHUD span#hud-match-count { +  display: inline; +  outline: none; +  white-space: nowrap; +  overflow-y: hidden; +} + +div.vimiumHUD span#hud-find-input br { +  display: none; +} +  div.vimiumHUD span#hud-find-input * { -    display: inline; -    white-space: nowrap; +  display: inline; +  white-space: nowrap;  }  body.vimiumFindMode ::selection { diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 70a8fef7..685dc527 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -776,7 +776,7 @@ class FindMode extends Mode            HUD.showFindMode rawQuery            @suppressEvent          else -          DomUtils.suppressPropagation(event) +          DomUtils.suppressPropagation event if HandlerStack::isChromeEvent event            handlerStack.stopBubblingAndFalse        keypress: (event) => diff --git a/pages/hud.coffee b/pages/hud.coffee index 130d866f..c5a4130d 100644 --- a/pages/hud.coffee +++ b/pages/hud.coffee @@ -1,3 +1,20 @@ +document.addEventListener "keydown", (event) -> +  inputElement = document.getElementById "hud-find-input" +  return unless inputElement? # Don't do anything if we're not in find mode. +  transferrableEvent = {} +  for key, value of event +    transferrableEvent[key] = value if typeof value in ["number", "string"] + +  if (event.keyCode in [keyCodes.backspace, keyCodes.deleteKey] and inputElement.textContent.length == 0) or +     event.keyCode in [keyCodes.enter, keyCodes.upArrow, keyCodes.downArrow] or +     KeyboardUtils.isEscape event + +    DomUtils.suppressEvent event +    UIComponentServer.postMessage +      name: "hideFindMode" +      event: transferrableEvent +      query: inputElement.textContent +  handlers =    show: (data) ->      document.getElementById("hud").innerText = data.text @@ -15,13 +32,18 @@ handlers =      hud.innerText = "/"      inputElement = document.createElement "span" +    inputElement.contentEditable = "plaintext-only"      inputElement.textContent = data.text      inputElement.id = "hud-find-input"      hud.appendChild inputElement +    inputElement.addEventListener "input", (event) -> +      UIComponentServer.postMessage {name: "search", query: inputElement.textContent} +      countElement = document.createElement "span"      countElement.id = "hud-match-count"      hud.appendChild countElement +    inputElement.focus()      UIComponentServer.postMessage {name: "search", query: inputElement.textContent} diff --git a/pages/hud.html b/pages/hud.html index bcb38e04..031c2fbf 100644 --- a/pages/hud.html +++ b/pages/hud.html @@ -2,6 +2,8 @@    <head>      <title>HUD</title>      <link rel="stylesheet" type="text/css" href="../content_scripts/vimium.css" /> +    <script type="text/javascript" src="../lib/dom_utils.js"></script> +    <script type="text/javascript" src="../lib/keyboard_utils.js"></script>      <script type="text/javascript" src="ui_component_server.js"></script>      <script type="text/javascript" src="hud.js"></script>    </head> | 
