aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/utils.js19
-rw-r--r--linkHints.js16
-rw-r--r--vimiumFrontend.js16
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;