commit da6149b06fda43ae178255f05f7fa66559d38562
parent 36871467b678ba5e3c262594f84297d0cd0f6507
Author: Simon Kornblith <simon@simonster.com>
Date: Sun, 29 Jul 2012 21:27:51 -0400
Tweak XPath utilities to behave more appropriately on IE XML documents
Diffstat:
1 file changed, 28 insertions(+), 13 deletions(-)
diff --git a/chrome/content/zotero/xpcom/utilities.js b/chrome/content/zotero/xpcom/utilities.js
@@ -974,18 +974,29 @@ Zotero.Utilities = {
throw new Error("First argument must be either element(s) or document(s) in Zotero.Utilities.xpath(elements, '"+xpath+"')");
}
- try {
- var xpathObject = rootDoc.evaluate(xpath, element, nsResolver, 5, // 5 = ORDERED_NODE_ITERATOR_TYPE
- null);
- } catch(e) {
- // rethrow so that we get a stack
- throw new Error(e.name+": "+e.message);
- }
-
- var newEl;
- while(newEl = xpathObject.iterateNext()) {
- // Firefox 5 hack
- results.push(isWrapped ? Zotero.Translate.DOMWrapper.wrap(newEl) : newEl);
+ if(!Zotero.isIE || "evaluate" in rootDoc) {
+ try {
+ var xpathObject = rootDoc.evaluate(xpath, element, nsResolver, 5, // 5 = ORDERED_NODE_ITERATOR_TYPE
+ null);
+ } catch(e) {
+ // rethrow so that we get a stack
+ throw new Error(e.name+": "+e.message);
+ }
+
+ var newEl;
+ while(newEl = xpathObject.iterateNext()) {
+ // Firefox 5 hack
+ results.push(isWrapped ? Zotero.Translate.DOMWrapper.wrap(newEl) : newEl);
+ }
+ } else if("selectNodes" in element) {
+ // We use JavaScript-XPath in IE for HTML documents, but with an XML
+ // document, we need to use selectNodes
+ var nodes = element.selectNodes(xpath);
+ for(var i=0; i<nodes.length; i++) {
+ results.push(nodes[i]);
+ }
+ } else {
+ throw new Error("XPath functionality not available");
}
}
@@ -1008,7 +1019,11 @@ Zotero.Utilities = {
var strings = new Array(elements.length);
for(var i=0, n=elements.length; i<n; i++) {
- strings[i] = elements[i].textContent;
+ var el = elements[i];
+ strings[i] = "textContent" in el ? el.textContent
+ : "innerText" in el ? el.innerText
+ : "text" in el ? el.text
+ : el.nodeValue;
}
return strings.join(delimiter !== undefined ? delimiter : ", ");