www

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

commit 9adbf332e3247016c4bbed3af6fa6f8b84f7c4af
parent 59459df0ffd7f7351ee9becbda912f5644cb4570
Author: Simon Kornblith <simon@simonster.com>
Date:   Wed, 13 Jul 2011 23:56:37 +0000

Streamline browser.js and fix ZoteroItemUpdated event


Diffstat:
Mchrome/content/zotero/browser.js | 123+++++++++++++++++++++++++++++++++----------------------------------------------
1 file changed, 51 insertions(+), 72 deletions(-)

diff --git a/chrome/content/zotero/browser.js b/chrome/content/zotero/browser.js @@ -45,7 +45,6 @@ var Zotero_Browser = new function() { this.toggleMode = toggleMode; this.toggleCollapsed = toggleCollapsed; this.chromeLoad = chromeLoad; - this.chromeUnload = chromeUnload; this.contentLoad = contentLoad; this.contentHide = contentHide; this.tabClose = tabClose; @@ -110,8 +109,6 @@ var Zotero_Browser = new function() { window.addEventListener("load", function(e) { Zotero_Browser.chromeLoad(e) }, false); - window.addEventListener("unload", - function(e) { Zotero_Browser.chromeUnload(e) }, false); ZoteroPane_Local.addReloadListener(reload); reload(); @@ -322,26 +319,17 @@ var Zotero_Browser = new function() { } /* - * Called when chrome is unloaded - */ - function chromeUnload() { - } - - /* * An event handler called when a new document is loaded. Creates a new document * object, and updates the status of the capture icon */ function contentLoad(event) { - var isHTML = event.originalTarget instanceof HTMLDocument; var doc = event.originalTarget; - var rootDoc = doc; + var isHTML = doc instanceof HTMLDocument; + var rootDoc = (doc instanceof HTMLDocument ? doc.defaultView.top.document : doc); + var browser = Zotero_Browser.tabbrowser.getBrowserForDocument(rootDoc); + if(!browser) return; if(isHTML) { - // get the appropriate root document to check which browser we're on - while(rootDoc.defaultView.frameElement) { - rootDoc = rootDoc.defaultView.frameElement.ownerDocument; - } - // ignore blacklisted domains try { if(doc.domain) { @@ -368,18 +356,6 @@ var Zotero_Browser = new function() { } catch (e) {} - // Figure out what browser this contentDocument is associated with - var browser; - var browsers = Zotero_Browser.tabbrowser.browsers; - var nBrowsers = Zotero_Browser.tabbrowser.browsers.length; - for(var i=0; i<nBrowsers; i++) { - if(rootDoc == browsers[i].contentDocument) { - browser = browsers[i] - break; - } - } - if(!browser) return; - // get data object var tab = _getTabObject(browser); @@ -406,43 +382,56 @@ var Zotero_Browser = new function() { tab.detectTranslators(rootDoc, doc); // register metadata updated event - doc.addEventListener("ZoteroItemUpdated", contentLoad, false); + if(isHTML) { + var contentWin = doc.defaultView; + if(!contentWin.haveZoteroEventListener) { + contentWin.addEventListener("ZoteroItemUpdated", itemUpdated, false); + contentWin.haveZoteroEventListener = true; + Zotero.debug("event listener registered"); + } + } } /* * called to unregister Zotero icon, etc. */ function contentHide(event) { - if(event.originalTarget instanceof HTMLDocument) { - // Get root document if this is a frameset - var doc = event.originalTarget; - var rootDoc = doc; - while(rootDoc.defaultView.frameElement) { - rootDoc = rootDoc.defaultView.frameElement.ownerDocument; - } - - // Figure out what browser this contentDocument is associated with - var browser; - for(var i=0; i<this.tabbrowser.browsers.length; i++) { - if(rootDoc == this.tabbrowser.browsers[i].contentDocument) { - browser = this.tabbrowser.browsers[i]; - break; - } - } - - var tab = _getTabObject(browser); - if(!tab) return; - if(doc == tab.page.document || doc == rootDoc) { - // clear translator only if the page on which the pagehide event was called is - // either the page to which the translator corresponded, or the root document - // (the second check is probably paranoid, but won't hurt) - tab.clear(); - } - - // update status - if(this.tabbrowser.selectedBrowser == browser) { - updateStatus(); - } + var doc = event.originalTarget; + if(!(doc instanceof HTMLDocument)) return; + + var rootDoc = (doc instanceof HTMLDocument ? doc.defaultView.top.document : doc); + var browser = Zotero_Browser.tabbrowser.getBrowserForDocument(rootDoc); + if(!browser) return; + + var tab = _getTabObject(browser); + if(!tab) return; + + if(doc == tab.page.document || doc == rootDoc) { + // clear translator only if the page on which the pagehide event was called is + // either the page to which the translator corresponded, or the root document + // (the second check is probably paranoid, but won't hurt) + tab.clear(); + } + + // update status + if(Zotero_Browser.tabbrowser.selectedBrowser == browser) { + updateStatus(); + } + } + + /** + * Called when item should be updated due to a DOM event + */ + function itemUpdated(event) { + try { + var doc = event.originalTarget; + var rootDoc = (doc instanceof HTMLDocument ? doc.defaultView.top.document : doc); + var browser = Zotero_Browser.tabbrowser.getBrowserForDocument(rootDoc); + var tab = _getTabObject(browser); + if(doc == tab.page.document || doc == rootDoc) tab.clear(); + tab.detectTranslators(rootDoc, doc); + } catch(e) { + Zotero.debug(e); } } @@ -457,7 +446,6 @@ var Zotero_Browser = new function() { tab.clear(); // To execute if document object does not exist - _deleteTabObject(event.target.linkedBrowser); toggleMode(); } @@ -562,19 +550,10 @@ var Zotero_Browser = new function() { */ function _getTabObject(browser) { if(!browser) return false; - try { - var key = browser.getAttribute("zotero-key"); - if(_browserData[key]) { - return _browserData[key]; - } - } finally { - if(!key) { - var key = (new Date()).getTime(); - browser.setAttribute("zotero-key", key); - return (_browserData[key] = new Zotero_Browser.Tab(browser)); - } + if(!browser.zoteroBrowserData) { + browser.zoteroBrowserData = new Zotero_Browser.Tab(browser); } - return false; + return browser.zoteroBrowserData; } /*