commit 23b9d6fdb95c902b325636acea68007261a527f7
parent 9e5c9716e2c0e09feeb0e81edcf8face2f0b4922
Author: Simon Kornblith <simon@simonster.com>
Date: Tue, 20 Sep 2011 06:17:06 +0000
- Forward compatible handling of version comparisons
- Add Zotero.repaint(window), which forces a UI repaint but doesn't execute any other events. We should use this within transactions to eliminate the nondeterminism of Zotero.wait().
Diffstat:
1 file changed, 36 insertions(+), 2 deletions(-)
diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js
@@ -211,6 +211,8 @@ if(appInfo.platformVersion[0] >= 2) {
var observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
+ var versionComparator = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
+ .getService(Components.interfaces.nsIVersionComparator);
// Load in the preferences branch for the extension
Zotero.Prefs.init();
@@ -226,8 +228,8 @@ if(appInfo.platformVersion[0] >= 2) {
this.isFx35 = appInfo.platformVersion.indexOf('1.9.1') === 0;
this.isFx31 = this.isFx35;
this.isFx36 = appInfo.platformVersion.indexOf('1.9.2') === 0;
- this.isFx4 = appInfo.platformVersion[0] >= 2;
- this.isFx5 = appInfo.platformVersion[0] >= 5;
+ this.isFx4 = versionComparator.compare(appInfo.platformVersion[0], "2.0a1") >= 0;
+ this.isFx5 = versionComparator.compare(appInfo.platformVersion[0], "5.0a1") >= 0;
this.isStandalone = appInfo.ID == ZOTERO_CONFIG['GUID'];
if(this.isStandalone) {
@@ -1496,6 +1498,38 @@ if(appInfo.platformVersion[0] >= 2) {
return;
};
+
+ /**
+ * Repaint UI on given window, without executing any events.
+ *
+ * @param {window} window Window to repaint
+ * @param {Boolean} [force=false] Whether to force a repaint. If false, a repaint only takes
+ * place if the last repaint was more than 100 ms ago.
+ */
+ this.repaint = function(window, force) {
+ var now = Date.now();
+
+ // Don't repaint more than 10 times per second unless forced.
+ if(!force && window.zoteroLastRepaint && (now - window.zoteroLastRepaint) < 100) return
+
+ // Start a nested event queue
+ Zotero.mainThread.pushEventQueue(null);
+ try {
+ // Add the redraw event onto event queue
+ window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIDOMWindowUtils)
+ .redraw();
+
+ // Process redraw event
+ Zotero.mainThread.processNextEvent(false);
+ } finally {
+ // Close nested event queue
+ Zotero.mainThread.popEventQueue();
+ }
+
+ window.zoteroLastRepaint = now;
+ };
+
/**
* Emulates the behavior of window.setTimeout, but ensures that callbacks do not get called
* during Zotero.wait()