www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 4b80a5210674c147f8307f160342b11016c568c5
parent 00e30dea71622fb41ea72aa7edbbf59c030628ff
Author: Simon Kornblith <simon@simonster.com>
Date:   Tue,  6 Nov 2012 00:47:49 -0500

Use separate hiddenBrowsers for each request in Zotero.HTTP.processDocuments

Diffstat:
Mchrome/content/zotero/xpcom/http.js | 80+++++++++++++++++++++++++++++++++++++++----------------------------------------
Mchrome/content/zotero/xpcom/zotero.js | 19++++++++++++-------
2 files changed, 51 insertions(+), 48 deletions(-)

diff --git a/chrome/content/zotero/xpcom/http.js b/chrome/content/zotero/xpcom/http.js @@ -492,38 +492,33 @@ Zotero.HTTP = new function() { // (Approximately) how many seconds to wait if the document is left in the loading state and // pageshow is called before we call pageshow with an incomplete document const LOADING_STATE_TIMEOUT = 120; - - var firedLoadEvent; - /** - * Removes event listener for the load event and deletes the hidden browser - */ - var removeListeners = function() { - hiddenBrowser.removeEventListener(loadEvent, onLoad, true); - if(!dontDelete) Zotero.Browser.deleteHiddenBrowser(hiddenBrowser); - } + var firedLoadEvent = 0; /** * Loads the next page * @inner */ var doLoad = function() { - if(urls.length) { - var url = urls.shift(); + if(currentURL < urls.length) { + var url = urls[currentURL], + hiddenBrowser = hiddenBrowsers[currentURL]; firedLoadEvent = 0; + currentURL++; try { - Zotero.debug("loading "+url); + Zotero.debug("Zotero.HTTP.processDocuments: Loading "+url); hiddenBrowser.loadURI(url); } catch(e) { - removeListeners(); if(exception) { exception(e); return; } else { throw(e); } + } finally { + doLoad(); } } else { - removeListeners(); + if(!dontDelete) Zotero.Browser.deleteHiddenBrowser(hiddenBrowsers); if(done) done(); } }; @@ -532,46 +527,49 @@ Zotero.HTTP = new function() { * Callback to be executed when a page load completes * @inner */ - var onLoad = function() { - var doc = hiddenBrowser.contentDocument; - if(!doc) return; + var onLoad = function(e) { + var hiddenBrowser = e.currentTarget, + doc = hiddenBrowser.contentDocument; + if(!doc || doc !== e.target) return; var url = doc.location.href.toString(); - if(url == "about:blank") return; - if(doc.readyState === "loading" && firedLoadEvent < 120) { - // Try again in a second - firedLoadEvent++; - Zotero.setTimeout(onLoad, 1000); + if(url === "about:blank") return; + if(doc.readyState === "loading" && (firedLoadEvent++) < 120) { + // Try again in a second + Zotero.setTimeout(onLoad.bind(this, e), 1000); return; } - if(url !== prevUrl) { // Just in case it fires too many times - prevUrl = url; - try { - processor(doc); - } catch(e) { - removeListeners(); - if(exception) { - exception(e); - return; - } else { - throw(e); - } + + Zotero.debug("Zotero.HTTP.processDocuments: "+url+" loaded"); + hiddenBrowser.removeEventListener("pageshow", onLoad, true); + + try { + processor(doc); + } catch(e) { + if(exception) { + exception(e); + return; + } else { + throw(e); } + } finally { doLoad(); } }; if(typeof(urls) == "string") urls = [urls]; - var prevUrl; - var loadEvent = Zotero.isFx2 ? "load" : "pageshow"; - - var hiddenBrowser = Zotero.Browser.createHiddenBrowser(); - hiddenBrowser.addEventListener(loadEvent, onLoad, true); - if(cookieSandbox) cookieSandbox.attachToBrowser(hiddenBrowser); + var hiddenBrowsers = [], + currentURL = 0; + for(var i=0; i<urls.length; i++) { + var hiddenBrowser = Zotero.Browser.createHiddenBrowser(); + if(cookieSandbox) cookieSandbox.attachToBrowser(hiddenBrowser); + hiddenBrowser.addEventListener("pageshow", onLoad, true); + hiddenBrowsers[i] = hiddenBrowser; + } doLoad(); - return hiddenBrowser; + return hiddenBrowsers.length === 1 ? hiddenBrowsers[0] : hiddenBrowsers.slice(); } /** diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js @@ -2423,17 +2423,22 @@ Zotero.Browser = new function() { hiddenBrowser.docShell.allowJavascript = true; hiddenBrowser.docShell.allowMetaRedirects = false; hiddenBrowser.docShell.allowPlugins = false; - Zotero.debug("created hidden browser (" + Zotero.debug("Created hidden browser (" + (win.document.getElementsByTagName('browser').length - 1) + ")"); return hiddenBrowser; } - function deleteHiddenBrowser(myBrowser) { - myBrowser.stop(); - myBrowser.destroy(); - myBrowser.parentNode.removeChild(myBrowser); - myBrowser = null; - Zotero.debug("deleted hidden browser"); + function deleteHiddenBrowser(myBrowsers) { + if(!myBrowsers instanceof Array) myBrowsers = [myBrowsers]; + for(var i=0; i<myBrowsers.length; i++) { + var myBrowser = myBrowsers[i]; + myBrowser.stop(); + myBrowser.destroy(); + myBrowser.parentNode.removeChild(myBrowser); + myBrowser = null; + Zotero.debug("Deleted hidden browser (" + + (win.document.getElementsByTagName('browser').length - 1) + ")"); + } } }