aboutsummaryrefslogtreecommitdiffstats
path: root/vimiumFrontend.js
diff options
context:
space:
mode:
Diffstat (limited to 'vimiumFrontend.js')
-rw-r--r--vimiumFrontend.js112
1 files changed, 77 insertions, 35 deletions
diff --git a/vimiumFrontend.js b/vimiumFrontend.js
index 9e9ec87a..1b44aecd 100644
--- a/vimiumFrontend.js
+++ b/vimiumFrontend.js
@@ -47,8 +47,7 @@ function setSetting(args) { settings[args.key] = args.value; }
function initializePreDomReady() {
for (var i in settingsToLoad) { getSetting(settingsToLoad[i]); }
- var isEnabledForUrlPort = chrome.extension.connect({ name: "isEnabledForUrl" });
- isEnabledForUrlPort.postMessage({ url: window.location.toString() });
+ checkIfEnabledForUrl();
var getZoomLevelPort = chrome.extension.connect({ name: "getZoomLevel" });
getZoomLevelPort.postMessage({ domain: window.location.host });
@@ -117,15 +116,6 @@ function initializePreDomReady() {
if (isEnabledForUrl)
setPageZoomLevel(currentZoomLevel);
});
- } else if (port.name == "returnIsEnabledForUrl") {
- port.onMessage.addListener(function(args) {
- isEnabledForUrl = args.isEnabledForUrl;
- if (isEnabledForUrl)
- initializeWhenEnabled();
- else if (HUD.isReady())
- // Quickly hide any HUD we might already be showing, e.g. if we entered insertMode on page load.
- HUD.hide();
- });
} else if (port.name == "returnSetting") {
port.onMessage.addListener(setSetting);
} else if (port.name == "refreshCompletionKeys") {
@@ -141,6 +131,7 @@ function initializePreDomReady() {
*/
function initializeWhenEnabled() {
document.addEventListener("keydown", onKeydown, true);
+ document.addEventListener("keypress", onKeypress, true);
document.addEventListener("focus", onFocusCapturePhase, true);
document.addEventListener("blur", onBlurCapturePhase, true);
enterInsertModeIfElementIsFocused();
@@ -286,7 +277,11 @@ function toggleViewSource() {
}
function copyCurrentUrl() {
- getCurrentUrlHandlers.push(function (url) { Clipboard.copy(url); });
+ // TODO(ilya): When the following bug is fixed, revisit this approach of sending back to the background page
+ // to copy.
+ // http://code.google.com/p/chromium/issues/detail?id=55188
+ //getCurrentUrlHandlers.push(function (url) { Clipboard.copy(url); });
+ getCurrentUrlHandlers.push(function (url) { chrome.extension.sendRequest({ handler: "copyToClipboard", data: url }); });
// TODO(ilya): Convert to sendRequest.
var getCurrentUrlPort = chrome.extension.connect({ name: "getCurrentTabUrl" });
@@ -309,7 +304,7 @@ function toggleViewSourceCallback(url) {
*
* Note that some keys will only register keydown events and not keystroke events, e.g. ESC.
*/
-function onKeydown(event) {
+function onKeypress(event) {
var keyChar = "";
if (linkHintsModeActivated || BookmarkMode.isEnabled())
@@ -317,33 +312,61 @@ function onKeydown(event) {
// Ignore modifier keys by themselves.
if (event.keyCode > 31) {
- keyChar = getKeyChar(event);
+ keyChar = String.fromCharCode(event.charCode);
// Enter insert mode when the user enables the native find interface.
- if (keyChar == "f" && !event.shiftKey && isPrimaryModifierKey(event))
- {
+ if (keyChar == "f" && isPrimaryModifierKey(event)) {
enterInsertMode();
return;
}
+ if (keyChar) {
+ if (findMode) {
+ handleKeyCharForFindMode(keyChar);
+
+ // Don't let the space scroll us if we're searching.
+ if (event.keyCode == keyCodes.space)
+ event.preventDefault();
+ } else if (!insertMode && !findMode) {
+ if (currentCompletionKeys.indexOf(keyChar) != -1) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+
+ keyPort.postMessage({keyChar:keyChar, frameId:frameId});
+ }
+ }
+ }
+}
+
+function onKeydown(event) {
+ var keyChar = "";
+
+ if (linkHintsModeActivated)
+ return;
+
+ // handle modifiers being pressed.don't handle shiftKey alone (to avoid / being interpreted as ?
+ if (event.metaKey && event.keyCode > 31 || event.ctrlKey && event.keyCode > 31 || event.altKey && event.keyCode > 31) {
+ keyChar = getKeyChar(event);
+
if (keyChar != "") // Again, ignore just modifiers. Maybe this should replace the keyCode > 31 condition.
{
var modifiers = [];
if (event.shiftKey)
- keyChar = keyChar.toUpperCase();
+ keyChar = keyChar.toUpperCase();
if (event.metaKey)
- modifiers.push("m");
+ modifiers.push("m");
if (event.ctrlKey)
- modifiers.push("c");
+ modifiers.push("c");
if (event.altKey)
- modifiers.push("a");
+ modifiers.push("a");
for (var i in modifiers)
- keyChar = modifiers[i] + "-" + keyChar;
+ keyChar = modifiers[i] + "-" + keyChar;
if (modifiers.length > 0 || keyChar.length > 1)
- keyChar = "<" + keyChar + ">";
+ keyChar = "<" + keyChar + ">";
}
}
@@ -354,20 +377,16 @@ function onKeydown(event) {
// Remove focus so the user can't just get himself back into insert mode by typing in the same input box.
if (isEditable(event.srcElement)) { event.srcElement.blur(); }
exitInsertMode();
+
+ // Added to prevent Google Instant from reclaiming the keystroke and putting us back into the search box.
+ // TOOD(ilya): Revisit this. Not sure it's the absolute best approach.
+ event.stopPropagation();
}
}
else if (findMode)
{
if (isEscape(event))
exitFindMode();
- else if (keyChar)
- {
- handleKeyCharForFindMode(keyChar);
-
- // Don't let the space scroll us if we're searching.
- if (event.keyCode == keyCodes.space)
- event.preventDefault();
- }
// Don't let backspace take us back in history.
else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey)
{
@@ -383,17 +402,40 @@ function onKeydown(event) {
}
else if (!insertMode && !findMode) {
if (keyChar) {
- if (currentCompletionKeys.indexOf(keyChar) != -1) {
- event.preventDefault();
- event.stopPropagation();
- }
+ if (currentCompletionKeys.indexOf(keyChar) != -1) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
- keyPort.postMessage({keyChar:keyChar, frameId:frameId});
+ keyPort.postMessage({keyChar:keyChar, frameId:frameId});
}
else if (isEscape(event)) {
keyPort.postMessage({keyChar:"<ESC>", frameId:frameId});
}
}
+
+ // Added to prevent propagating this event to other listeners if it's one that'll trigger a Vimium command.
+ // The goal is to avoid the scenario where Google Instant Search uses every keydown event to dump us
+ // back into the search box. As a side effect, this should also prevent overriding by other sites.
+ //
+ // Subject to internationalization issues since we're using keyIdentifier instead of charCode (in keypress).
+ //
+ // TOOD(ilya): Revisit this. Not sure it's the absolute best approach.
+ if (keyChar == "" && !insertMode && currentCompletionKeys.indexOf(getKeyChar(event)) != -1)
+ event.stopPropagation();
+}
+
+function checkIfEnabledForUrl() {
+ var url = window.location.toString();
+
+ chrome.extension.sendRequest({ handler: "isEnabledForUrl", url: url }, function (response) {
+ isEnabledForUrl = response.isEnabledForUrl;
+ if (isEnabledForUrl)
+ initializeWhenEnabled();
+ else if (HUD.isReady())
+ // Quickly hide any HUD we might already be showing, e.g. if we entered insertMode on page load.
+ HUD.hide();
+ });
}
function refreshCompletionKeys(completionKeys) {