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(); } | 
