commit 7c41618a4294df98a569666b09c92f690544e24a
parent ad0d6765d75842b1bd0b19c627381aae96deb3b5
Author: Dan Stillman <dstillman@zotero.org>
Date: Thu, 11 Feb 2016 04:19:04 -0500
Asyncify Zotero.Translate.ItemGetter.prototype.setCollection()/setAll()
And some of the calling functions, but there's a lot more to do.
Addresses #520 and #734
Diffstat:
2 files changed, 32 insertions(+), 36 deletions(-)
diff --git a/chrome/content/zotero/xpcom/translation/translate.js b/chrome/content/zotero/xpcom/translation/translate.js
@@ -370,7 +370,8 @@ Zotero.Translate.Sandbox = {
var translator = translation.translator[0];
translator = typeof translator === "object" ? translator : Zotero.Translators.get(translator);
- translation._loadTranslator(translator).then(function() {
+ translation._loadTranslator(translator)
+ .then(function() {
if(Zotero.isFx && !Zotero.isBookmarklet) {
// do same origin check
var secMan = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
@@ -392,7 +393,9 @@ Zotero.Translate.Sandbox = {
}
}
- translation._prepareTranslation();
+ return translation._prepareTranslation();
+ })
+ .then(function () {
setDefaultHandlers(translate, translation);
sandbox = translation._sandboxManager.sandbox;
if(!Zotero.Utilities.isEmpty(sandbox.exports)) {
@@ -1252,12 +1255,14 @@ Zotero.Translate.Base.prototype = {
/**
* Called when translator has been retrieved and loaded
*/
- "_translateTranslatorLoaded":function() {
+ "_translateTranslatorLoaded": Zotero.Promise.coroutine(function* () {
// set display options to default if they don't exist
if(!this._displayOptions) this._displayOptions = this._translatorInfo.displayOptions || {};
// prepare translation
- this._prepareTranslation();
+ this.incrementAsyncProcesses("Zotero.Translate#prepareTranslation()");
+ yield this._prepareTranslation();
+ this.decrementAsyncProcesses("Zotero.Translate#prepareTranslation()");
Zotero.debug("Translate: Beginning translation with "+this.translator[0].label);
@@ -1272,7 +1277,7 @@ Zotero.Translate.Base.prototype = {
}
this.decrementAsyncProcesses("Zotero.Translate#translate()");
- },
+ }),
/**
* Return the progress of the import operation, or null if progress cannot be determined
@@ -1773,7 +1778,7 @@ Zotero.Translate.Base.prototype = {
/**
* No-op for preparing translation
*/
- "_prepareTranslation":function() {}
+ "_prepareTranslation": function () { return Zotero.Promise.resolve(); }
}
/**
@@ -1860,7 +1865,7 @@ Zotero.Translate.Web.prototype._getParameters = function() {
/**
* Prepare translation
*/
-Zotero.Translate.Web.prototype._prepareTranslation = function() {
+Zotero.Translate.Web.prototype._prepareTranslation = Zotero.Promise.method(function () {
this._itemSaver = new Zotero.Translate.ItemSaver({
"libraryID":this._libraryID,
"collections": this._collections,
@@ -1870,7 +1875,7 @@ Zotero.Translate.Web.prototype._prepareTranslation = function() {
"baseURI":this.location
});
this.newItems = [];
-}
+});
/**
* Overload translate to set selectedItems
@@ -2171,7 +2176,7 @@ Zotero.Translate.Import.prototype._loadTranslatorPrepareIO = function(translator
/**
* Prepare translation
*/
-Zotero.Translate.Import.prototype._prepareTranslation = function() {
+Zotero.Translate.Import.prototype._prepareTranslation = Zotero.Promise.method(function () {
this._progress = undefined;
var baseURI = null;
@@ -2190,7 +2195,7 @@ Zotero.Translate.Import.prototype._prepareTranslation = function() {
});
this.newItems = [];
this.newCollections = [];
-}
+});
/**
* Return the progress of the import operation, or null if progress cannot be determined
@@ -2296,7 +2301,7 @@ Zotero.Translate.Export.prototype.getTranslators = function() {
/**
* Does the actual export, after code has been loaded and parsed
*/
-Zotero.Translate.Export.prototype._prepareTranslation = function() {
+Zotero.Translate.Export.prototype._prepareTranslation = Zotero.Promise.coroutine(function* () {
this._progress = undefined;
// initialize ItemGetter
@@ -2309,13 +2314,13 @@ Zotero.Translate.Export.prototype._prepareTranslation = function() {
getCollections = configOptions.getCollections || false;
switch (this._export.type) {
case 'collection':
- this._itemGetter.setCollection(this._export.collection, getCollections);
+ yield this._itemGetter.setCollection(this._export.collection, getCollections);
break;
case 'items':
this._itemGetter.setItems(this._export.items);
break;
case 'library':
- this._itemGetter.setAll(this._export.id, getCollections);
+ yield this._itemGetter.setAll(this._export.id, getCollections);
break;
default:
throw new Error('No export set up');
@@ -2344,7 +2349,7 @@ Zotero.Translate.Export.prototype._prepareTranslation = function() {
}
this._sandboxManager.importObject(this._io);
-}
+});
/**
* Overload Zotero.Translate.Base#translate to make sure that
diff --git a/chrome/content/zotero/xpcom/translation/translate_item.js b/chrome/content/zotero/xpcom/translation/translate_item.js
@@ -657,45 +657,36 @@ Zotero.Translate.ItemGetter.prototype = {
this.numItems = this._itemsLeft.length;
},
- "setCollection":function(collection, getChildCollections) {
+ "setCollection": Zotero.Promise.coroutine(function* (collection, getChildCollections) {
// get items in this collection
- var haveItems = {};
- this._itemsLeft = collection.getChildItems();
- for each(var item in this._itemsLeft) haveItems[item.id] = true;
- if(!this._itemsLeft) {
- this._itemsLeft = [];
- }
+ yield collection.loadChildItems();
+ var items = new Set(collection.getChildItems());
if(getChildCollections) {
// get child collections
- this._collectionsLeft = Zotero.getCollections(collection.id, true); // TODO: Replace with Zotero.Collections.getByParent()
+ this._collectionsLeft = yield Zotero.Collections.getByParent(collection.id, true);
// get items in child collections
- for each(var collection in this._collectionsLeft) {
+ for (let collection of this._collectionsLeft) {
+ yield collection.loadChildItems();
var childItems = collection.getChildItems();
- if(childItems) {
- for each(var item in childItems) {
- if(!haveItems[item.id]) {
- haveItems[item.id] = true;
- this._itemsLeft.push(item);;
- }
- }
- }
+ childItems.forEach(item => items.add(item));
}
}
+ this._itemsLeft = Array.from(items.values);
this.numItems = this._itemsLeft.length;
- },
+ }),
- "setAll": function (libraryID, getChildCollections) {
- this._itemsLeft = Zotero.Items.getAll(libraryID, true);
+ "setAll": Zotero.Promise.coroutine(function* (libraryID, getChildCollections) {
+ this._itemsLeft = yield Zotero.Items.getAll(libraryID, true);
if(getChildCollections) {
- this._collectionsLeft = Zotero.getCollections(null, true, libraryID); // TODO: Replace with Zotero.Collections.getByLibrary()
+ this._collectionsLeft = yield Zotero.Collections.getByLibrary(libraryID, true);
}
this.numItems = this._itemsLeft.length;
- },
+ }),
"exportFiles":function(dir, extension) {
// generate directory