diff options
| -rw-r--r-- | README.markdown | 2 | ||||
| -rw-r--r-- | background_page.html | 7 | ||||
| -rw-r--r-- | commands.js | 18 | ||||
| -rw-r--r-- | test_harnesses/form.html | 4 | ||||
| -rw-r--r-- | vimiumFrontend.js | 30 |
5 files changed, 44 insertions, 17 deletions
diff --git a/README.markdown b/README.markdown index cba2bd8a..2e144110 100644 --- a/README.markdown +++ b/README.markdown @@ -83,7 +83,7 @@ Release Notes - In link hints mode, holding down the shift key will now toggle between opening in the current tab and opening in a new tab. - Two new commands (`zH` and `zL`) to scroll to the left and right edges of the page. -- A new command (`gi`) to focus the first text input box on the page. +- A new command (`gi`) to focus the first (or n-th) text input box on the page. - Bug fixes. 1.19 (06/29/2010) diff --git a/background_page.html b/background_page.html index 349212ef..94595b2b 100644 --- a/background_page.html +++ b/background_page.html @@ -507,8 +507,11 @@ if (!registryEntry.isBackgroundCommand) { var port = chrome.tabs.connect(tabId, { name: "executePageCommand" }); - port.postMessage({ command: registryEntry.command, count: count, - completionKeys: generateCompletionKeys("") }); + port.postMessage({ command: registryEntry.command, + count: count, + passCountToFunction: registryEntry.passCountToFunction, + completionKeys: generateCompletionKeys("") + }); refreshedCompletionKeys = true; } else { diff --git a/commands.js b/commands.js index fa24dee8..a9fa0aba 100644 --- a/commands.js +++ b/commands.js @@ -1,14 +1,17 @@ var availableCommands = {}; var keyToCommandRegistry = {}; -function addCommand(command, description, isBackgroundCommand) { +function addCommand(command, description, isBackgroundCommand, passCountToFunction) { if (availableCommands[command]) { console.log(command, "is already defined! Check commands.js for duplicates."); return; } - availableCommands[command] = { description: description, isBackgroundCommand: isBackgroundCommand }; + availableCommands[command] = { description: description, + isBackgroundCommand: isBackgroundCommand, + passCountToFunction: passCountToFunction + }; } function mapKeyToCommand(key, command) { @@ -18,7 +21,10 @@ function mapKeyToCommand(key, command) { return; } - keyToCommandRegistry[key] = { command: command, isBackgroundCommand: availableCommands[command].isBackgroundCommand }; + keyToCommandRegistry[key] = { command: command, + isBackgroundCommand: availableCommands[command].isBackgroundCommand, + passCountToFunction: availableCommands[command].passCountToFunction + }; } function unmapKey(key) { delete keyToCommandRegistry[key]; } @@ -102,7 +108,7 @@ function clearKeyMappingsAndSetDefaults() { mapKeyToCommand('zi', 'zoomIn'); mapKeyToCommand('zo', 'zoomOut'); - mapKeyToCommand('gi', 'focusFirstInput'); + mapKeyToCommand('gi', 'focusInput'); mapKeyToCommand('f', 'activateLinkHintsMode'); mapKeyToCommand('F', 'activateLinkHintsModeToOpenInNewTab'); @@ -146,7 +152,7 @@ addCommand('copyCurrentUrl', 'Copy the current URL to the clipboard'); addCommand('enterInsertMode', 'Enter insert mode'); -addCommand('focusFirstInput', 'Focus the first text box on the page'); +addCommand('focusInput', 'Focus the first (or n-th) text box on the page', false, true); addCommand('activateLinkHintsMode', 'Enter link hints mode to open links in current tab'); addCommand('activateLinkHintsModeToOpenInNewTab', 'Enter link hints mode to open links in new tab'); @@ -178,7 +184,7 @@ var commandGroups = { "scrollToTop", "scrollToBottom", "scrollToLeft", "scrollToRight", "scrollPageDown", "scrollPageUp", "scrollFullPageDown", "reload", "toggleViewSource", "zoomIn", "zoomOut", "copyCurrentUrl", "goUp", - "enterInsertMode", "focusFirstInput", + "enterInsertMode", "focusInput", "activateLinkHintsMode", "activateLinkHintsModeToOpenInNewTab", "enterFindMode", "performFind", "performBackwardsFind"], historyNavigation: diff --git a/test_harnesses/form.html b/test_harnesses/form.html index 52ac9308..740edb46 100644 --- a/test_harnesses/form.html +++ b/test_harnesses/form.html @@ -9,9 +9,11 @@ <form action="#"> <p> Text: <input type="text" name="text" value="" /> + Text 2: <input type="text" name="text" value="" /> </p> <p> Search: <input type="search" /> + Search 2: <input type="search" /> </p> <p> Radio:<br/> @@ -32,4 +34,4 @@ </p> </form> </body> -</html>
\ No newline at end of file +</html> diff --git a/vimiumFrontend.js b/vimiumFrontend.js index d74c6d53..7677f96c 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -76,7 +76,11 @@ function initializePreDomReady() { if (port.name == "executePageCommand") { port.onMessage.addListener(function(args) { if (this[args.command]) { - for (var i = 0; i < args.count; i++) { this[args.command].call(); } + if (args.passCountToFunction) { + this[args.command].call(null, args.count); + } else { + for (var i = 0; i < args.count; i++) { this[args.command].call(); } + } } refreshCompletionKeys(args.completionKeys); @@ -198,13 +202,25 @@ function scrollFullPageDown() { window.scrollBy(0, window.innerHeight); } function scrollLeft() { window.scrollBy(-1 * settings["scrollStepSize"], 0); } function scrollRight() { window.scrollBy(settings["scrollStepSize"], 0); } -function focusFirstInput() { +function focusInput(count) { var xpath = '//input[@type="text" or @type="search"]'; - var result = document.evaluate(xpath, document.documentElement, null, - XPathResult.FIRST_ORDERED_NODE_TYPE, null); - if (!result.singleNodeValue) - return; - result.singleNodeValue.focus(); + var results = document.evaluate(xpath, document.documentElement, null, + XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); + + var lastInputBox; + var i = 0; + + while (i < count) + { + i += 1; + + var currentInputBox = results.iterateNext(); + if (!currentInputBox) { break; } + + lastInputBox = currentInputBox; + } + + if (lastInputBox) { lastInputBox.focus(); } } function reload() { window.location.reload(); } |
