fix non-triggering setTimeout calls and restore r9383

This commit is contained in:
Simon Kornblith 2011-06-14 19:24:39 +00:00
parent 65bd289910
commit 11e337a189

View File

@ -196,10 +196,21 @@ if(appInfo.platformVersion[0] >= 2) {
var _broadcastInitComplete = false; var _broadcastInitComplete = false;
/** /**
* A set of nsITimerCallbacks to be executed when Zotero.wait() completes * Maintains nsITimers to be used when Zotero.wait() completes (to reduce performance penalty
* of initializing new objects)
*/
var _waitTimers = [];
/**
* Maintains nsITimerCallbacks to be used when Zotero.wait() completes
*/ */
var _waitTimerCallbacks = []; var _waitTimerCallbacks = [];
/**
* Maintains running nsITimers in global scope, so that they don't disappear randomly
*/
var _runningTimers = [];
/** /**
* Initialize the extension * Initialize the extension
*/ */
@ -1501,11 +1512,10 @@ if(appInfo.platformVersion[0] >= 2) {
_waiting = false; _waiting = false;
// requeue nsITimerCallbacks that came up during Zotero.wait() but couldn't execute // requeue nsITimerCallbacks that came up during Zotero.wait() but couldn't execute
for each(var timerCallback in _waitTimerCallbacks) { for(var i in _waitTimers) {
var timer = Components.classes["@mozilla.org/timer;1"]. _waitTimers[i].initWithCallback(_waitTimerCallbacks[i], 0, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
createInstance(Components.interfaces.nsITimer);
timer.initWithCallback(timerCallback, 0, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
} }
_waitTimers = [];
_waitTimerCallbacks = []; _waitTimerCallbacks = [];
//Zotero.debug("Waited " + cycles + " cycles"); //Zotero.debug("Waited " + cycles + " cycles");
@ -1523,19 +1533,21 @@ if(appInfo.platformVersion[0] >= 2) {
var timer = Components.classes["@mozilla.org/timer;1"]. var timer = Components.classes["@mozilla.org/timer;1"].
createInstance(Components.interfaces.nsITimer); createInstance(Components.interfaces.nsITimer);
var timerCallback = {"notify":function() { var timerCallback = {"notify":function() {
// if(_waiting) {
// DEBUG: This can result in the callback not being triggered in Fx4+
//
//if(_waiting) {
// if our callback gets called during Zotero.wait(), queue it to be set again // if our callback gets called during Zotero.wait(), queue it to be set again
// when Zotero.wait() completes // when Zotero.wait() completes
//_waitTimerCallbacks.push(timerCallback); _waitTimers.push(timer);
//} else { _waitTimerCallbacks.push(timerCallback);
// otherwise, execute callback function } else {
// execute callback function
func(); func();
//} // remove timer from global scope, so it can be garbage collected
_runningTimers.splice(_runningTimers.indexOf(timer), 1);
}
}} }}
timer.initWithCallback(timerCallback, ms, Components.interfaces.nsITimer.TYPE_ONE_SHOT); timer.initWithCallback(timerCallback, ms, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
// add timer to global scope so that it doesn't get garbage collected before it completes
_runningTimers.push(timer);
} }
/** /**