diff options
| -rw-r--r-- | lib/utils.js | 19 | ||||
| -rw-r--r-- | linkHints.js | 16 | ||||
| -rw-r--r-- | vimiumFrontend.js | 16 | 
3 files changed, 31 insertions, 20 deletions
diff --git a/lib/utils.js b/lib/utils.js index 0c992ad4..ef961833 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -11,4 +11,23 @@ var utils = {      var func = obj[components.pop()];      return func.apply(obj, argArray);    }, + +  /* +   * Takes an array of XPath selectors, adds the necessary namespaces (currently only XHTML), and applies them +   * to the document root. The namespaceResolver in evaluateXPath should be kept in sync with the namespaces +   * here. +   */ +  makeXPath: function(elementArray) { +    var xpath = []; +    for (var i in elementArray) +      xpath.push("//" + elementArray[i], "//xhtml:" + elementArray[i]); +    return xpath.join(" | "); +  }, + +  evaluateXPath: function(xpath, resultType) { +    function namespaceResolver(namespace) { +      return namespace == "xhtml" ? "http://www.w3.org/1999/xhtml" : null; +    } +    return document.evaluate(xpath, document.documentElement, namespaceResolver, resultType, null); +  },  }; diff --git a/linkHints.js b/linkHints.js index fbbf8a51..fed190dc 100644 --- a/linkHints.js +++ b/linkHints.js @@ -39,14 +39,8 @@ var linkHints = {     * Generate an XPath describing what a clickable element is.     * The final expression will be something like "//button | //xhtml:button | ..."     */ -  clickableElementsXPath: (function() { -    var clickableElements = ["a", "area[@href]", "textarea", "button", "select", "input[not(@type='hidden')]", -                             "*[@onclick or @tabindex or @role='link' or @role='button']"]; -    var xpath = []; -    for (var i in clickableElements) -      xpath.push("//" + clickableElements[i], "//xhtml:" + clickableElements[i]); -    return xpath.join(" | ") -  })(), +  clickableElementsXPath: utils.makeXPath(["a", "area[@href]", "textarea", "button", "select","input[not(@type='hidden')]", +                             "*[@onclick or @tabindex or @role='link' or @role='button']"]),    // We need this as a top-level function because our command system doesn't yet support arguments.    activateModeToOpenInNewTab: function() { this.activateMode(true, false, false); }, @@ -115,11 +109,7 @@ var linkHints = {     * of digits needed to enumerate all of the links on screen.     */    getVisibleClickableElements: function() { -    var resultSet = document.evaluate(this.clickableElementsXPath, document.body, -      function(namespace) { -        return namespace == "xhtml" ? "http://www.w3.org/1999/xhtml" : null; -      }, -      XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); +    var resultSet = utils.evaluateXPath(this.clickableElementsXPath, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);      var visibleElements = []; diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 5baffa47..56c425bb 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -27,11 +27,15 @@ var linkHintCss;  // fetch it each time.  //  // Should we include the HTML5 date pickers here? -var textInputTypes = ["text", "search", "email", "url", "number"]; +  // The corresponding XPath for such elements. -var textInputXPath = '//input[' + -                     textInputTypes.map(function (type) { return '@type="' + type + '"'; }).join(" or ") + -                     ' or not(@type)]'; +var textInputXPath = (function() { +  var textInputTypes = ["text", "search", "email", "url", "number"]; +  var inputElements = ["input[" + +    textInputTypes.map(function (type) { return '@type="' + type + '"'; }).join(" or ") + "or not(@type)]", +    "textarea"]; +  return utils.makeXPath(inputElements); +})();  var settings = {    values: {}, @@ -223,9 +227,7 @@ function scrollLeft() { window.scrollBy(-1 * settings.get("scrollStepSize"), 0);  function scrollRight() { window.scrollBy(settings.get("scrollStepSize"), 0); }  function focusInput(count) { -  var results = document.evaluate(textInputXPath, -                                  document.documentElement, null, -                                  XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); +  var results = utils.evaluateXPath(textInputXPath, XPathResult.ORDERED_NODE_ITERATOR_TYPE);    var lastInputBox;    var i = 0;  | 
