aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/hud.coffee24
-rw-r--r--content_scripts/vimium.css15
-rw-r--r--content_scripts/vimium_frontend.coffee2
-rw-r--r--pages/hud.coffee22
-rw-r--r--pages/hud.html2
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>