diff options
| author | Alex Kovar | 2010-10-30 17:29:21 -0500 |
|---|---|---|
| committer | Alex Kovar | 2010-10-30 17:29:21 -0500 |
| commit | 51d08f17f40d5da07d49b424b3ec94d17dc59cf0 (patch) | |
| tree | e32cdac63546d3c6e9b5131f0949943a9e3030be /vimiumFrontend.js | |
| parent | 8feb7df5e4185e2f28262a3524f7fb3d9b1e470d (diff) | |
| parent | 7df813ef221be04e4d4a459ecc941dcbddfb6056 (diff) | |
| download | vimium-51d08f17f40d5da07d49b424b3ec94d17dc59cf0.tar.bz2 | |
Merge branch 'master' of http://github.com/philc/vimium
Diffstat (limited to 'vimiumFrontend.js')
| -rw-r--r-- | vimiumFrontend.js | 112 |
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) { |
