From 5ecfb72308bd2d9a8521d6371743aff02a0c0b45 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Tue, 15 Jan 2013 04:18:26 -0500 Subject: [PATCH] Kill E4X in locateManager --- chrome/content/zotero/xpcom/locateManager.js | 58 ++++++++++++-------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/chrome/content/zotero/xpcom/locateManager.js b/chrome/content/zotero/xpcom/locateManager.js index 02aac8f8d..cefad9238 100644 --- a/chrome/content/zotero/xpcom/locateManager.js +++ b/chrome/content/zotero/xpcom/locateManager.js @@ -346,51 +346,63 @@ Zotero.LocateManager = new function() { "http://a9.com/-/spec/opensearchdescription/1.1/", "http://a9.com/-/spec/opensearchdescription/1.0/" ]; - - var xml = Zotero.Styles.cleanXML(xmlStr); - if(OPENSEARCH_NAMESPACES.indexOf(xml.namespace()) === "-1") { + + var parser = Components.classes["@mozilla.org/xmlextras/domparser;1"] + .createInstance(Components.interfaces.nsIDOMParser), + doc = parser.parseFromString(xmlStr, "application/xml"), + docEl = doc.documentElement, + ns = docEl.namespaceURI, + xns = {"s":doc.documentElement.namespaceURI, + "xmlns":"http://www.w3.org/2000/xmlns"}; + if(OPENSEARCH_NAMESPACES.indexOf(ns) === -1) { throw "Invalid namespace"; } - default xml namespace = xml.namespace(); - // get simple attributes - this.alias = xml.ShortName.toString(); - this.name = xml.LongName.toString(); + this.alias = Zotero.Utilities.xpathText(docEl, 's:ShortName', xns); + this.name = Zotero.Utilities.xpathText(docEl, 's:LongName', xns); if(!this.name) this.name = this.alias; - this.description = xml.Description.toString(); + this.description = Zotero.Utilities.xpathText(docEl, 's:Description', xns); // get the URL template this._urlTemplate = undefined; - for each(var urlTag in xml.Url.(@type.toLowerCase() == "text/html")) { - if(urlTag.@rel == undefined || urlTag.@rel == "results") { - this._urlTemplate = urlTag.@template.toString(); - break; - } - this._method = urlTag.@method.toUpperCase() === "POST" ? "POST" : "GET"; + var urlTags = Zotero.Utilities.xpath(docEl, 's:Url[@type="text/html"]', xns), + i = 0; + while(urlTags[i].hasAttribute("rel") && urlTags[i].getAttribute("rel") != "results") { + i++; + if(i == urlTags.length) throw "No Url tag found"; } // TODO: better error handling - if(!this._urlTemplate) throw "No URL found for required content type"; + var urlTag = urlTags[i]; + this._urlTemplate = urlTag.getAttribute("template") + this._method = urlTag.getAttribute("method").toString().toUpperCase() === "POST" ? "POST" : "GET"; // get namespaces this._urlNamespaces = {}; - for each(var ns in urlTag.inScopeNamespaces()) { - this._urlNamespaces[ns.prefix] = ns.uri; + var node = urlTag; + while(node && node.attributes) { + for(var i=0; i