Skip to content

Commit e91d91b

Browse files
authored
Replace all uses of loadDocuments with HiddenBrowser and add artificial delay (zotero#15)
1 parent 464dcb1 commit e91d91b

2 files changed

Lines changed: 52 additions & 39 deletions

File tree

src/translation/translate.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,7 +1113,7 @@ Zotero.Translate.Base.prototype = {
11131113
if(t) promises.push(t);
11141114
}
11151115
if(!promises.length) return Zotero.Promise.reject(new Error("getTranslators: no valid translators were set"));
1116-
potentialTranslators = Zotero.Promise.all(promises);
1116+
potentialTranslators = Zotero.Promise.all(promises).then(val => [val]);
11171117
} else {
11181118
potentialTranslators = this._getTranslatorsGetPotentialTranslators();
11191119
}
@@ -1720,6 +1720,16 @@ Zotero.Translate.Base.prototype = {
17201720
if (returnValue !== undefined) this._returnValue = returnValue;
17211721
this.decrementAsyncProcesses("Zotero.Translate#getTranslators");
17221722

1723+
// If the translator started an async process in detect* (like loading another translator),
1724+
// wait for it in the promise we return
1725+
if (this._runningAsyncProcesses) {
1726+
return new Promise((resolve, reject) => {
1727+
this.setHandler('translators', () => resolve(this._returnValue));
1728+
this.setHandler('error', (_, err) => reject(err));
1729+
});
1730+
}
1731+
1732+
// Otherwise, immediately return what detect* returned
17231733
return returnValue;
17241734
},
17251735

@@ -1798,14 +1808,14 @@ Zotero.Translate.Base.prototype = {
17981808
}.bind(this);
17991809

18001810
if (this.noWait) {
1801-
let codePromise = Zotero.Translators.getCodeForTranslator(translator);
1811+
let codePromise = this._translatorProvider.getCodeForTranslator(translator);
18021812
if (!codePromise.isResolved()) {
18031813
throw new Error("Code promise is not resolved in noWait mode");
18041814
}
18051815
parse(codePromise.value());
18061816
}
18071817
else {
1808-
return Zotero.Translators.getCodeForTranslator(translator).then(parse);
1818+
return this._translatorProvider.getCodeForTranslator(translator).then(parse);
18091819
}
18101820
}),
18111821

testTranslators/translatorTester.js

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -414,35 +414,41 @@ Zotero_TranslatorTester.prototype._runTestsRecursively = function(testDoneCallba
414414
* @param {Object} test - Test to execute
415415
* @param {Function} testDoneCallback - A callback to be executed when test is complete
416416
*/
417-
Zotero_TranslatorTester.prototype.fetchPageAndRunTest = function (test, testDoneCallback) {
417+
Zotero_TranslatorTester.prototype.fetchPageAndRunTest = async function (test, testDoneCallback) {
418418
// Scaffold
419419
if (Zotero.isFx) {
420-
let browser = Zotero.HTTP.loadDocuments(
421-
test.url,
422-
(doc) => {
423-
if (test.defer) {
424-
Zotero.debug("Waiting " + (Zotero_TranslatorTester.DEFER_DELAY / 1000)
425-
+ " second(s) for page content to settle");
426-
}
427-
setTimeout(() => {
428-
// Use cookies from document in translator HTTP requests
429-
this._cookieSandbox = new Zotero.CookieSandbox(null, test.url, doc.cookie);
430-
431-
this.runTest(test, doc, function (obj, test, status, message) {
432-
Zotero.Browser.deleteHiddenBrowser(browser);
433-
testDoneCallback(obj, test, status, message);
434-
});
435-
}, test.defer ? Zotero_TranslatorTester.DEFER_DELAY : 0);
436-
},
437-
null,
438-
(e) => {
439-
Zotero.Browser.deleteHiddenBrowser(browser);
440-
testDoneCallback(this, test, "failed", "Translation failed to initialize: " + e);
441-
},
442-
true
443-
);
444-
browser.docShell.allowMetaRedirects = true;
445-
return
420+
const { HiddenBrowser } = ChromeUtils.import("chrome://zotero/content/HiddenBrowser.jsm");
421+
const { RemoteTranslate } = ChromeUtils.import("chrome://zotero/content/RemoteTranslate.jsm");
422+
let browser = await HiddenBrowser.create(test.url, {
423+
requireSuccessfulStatus: true,
424+
docShell: { allowMetaRedirects: true }
425+
});
426+
let translate = new RemoteTranslate();
427+
try {
428+
if (test.defer) {
429+
Zotero.debug("Waiting " + (Zotero_TranslatorTester.DEFER_DELAY / 1000)
430+
+ " second(s) for page content to settle");
431+
await Zotero.Promise.delay(Zotero_TranslatorTester.DEFER_DELAY);
432+
}
433+
else {
434+
// Wait just a bit for things to settle
435+
await Zotero.Promise.delay(100);
436+
}
437+
438+
await translate.setBrowser(browser);
439+
await translate.setTranslatorProvider(this.translatorProvider);
440+
translate.setTranslator(this.translator);
441+
translate.setHandler("debug", (_, obj) => this._debug(this, obj));
442+
translate.setHandler("error", (_, err) => this._debug(this, err));
443+
let { test: newTest, status, message } = await translate.runTest(test);
444+
translate.dispose();
445+
testDoneCallback(this, newTest, status, message);
446+
}
447+
finally {
448+
HiddenBrowser.destroy(browser);
449+
translate.dispose();
450+
}
451+
return;
446452
}
447453

448454
if (typeof process === 'object' && process + '' === '[object process]'){
@@ -609,6 +615,11 @@ Zotero_TranslatorTester.prototype._checkResult = function(test, translate, retur
609615
testDoneCallback(this, test, "failed", "Translation failed; examine debug output for errors");
610616
return;
611617
}
618+
619+
// Save items. This makes it easier to correct tests automatically.
620+
test.itemsReturned = test.items === "multiple"
621+
? "multiple"
622+
: translate.newItems.map(item => Zotero_TranslatorTester._sanitizeItem(item));
612623

613624
if(!translate.newItems.length) {
614625
testDoneCallback(this, test, "failed", "Translation failed: no items returned");
@@ -629,14 +640,6 @@ Zotero_TranslatorTester.prototype._checkResult = function(test, translate, retur
629640
// Show diff
630641
this._debug(this, "TranslatorTester: Data mismatch detected:");
631642
this._debug(this, Zotero_TranslatorTester._generateDiff(testItem, translatedItem));
632-
633-
// Save items. This makes it easier to correct tests automatically.
634-
var m = translate.newItems.length;
635-
test.itemsReturned = new Array(m);
636-
for(var j=0; j<m; j++) {
637-
test.itemsReturned[j] = Zotero_TranslatorTester._sanitizeItem(translate.newItems[i]);
638-
}
639-
640643
testDoneCallback(this, test, "unknown", "Item "+i+" does not match");
641644
return;
642645
}
@@ -663,7 +666,7 @@ Zotero_TranslatorTester.prototype.newTest = async function (doc, testReadyCallba
663666
}
664667
translate.setDocument(doc);
665668
// Use cookies from document
666-
if (doc.cookie) {
669+
if (doc.cookie && Zotero.CookieSandbox) {
667670
translate.setCookieSandbox(new Zotero.CookieSandbox(
668671
null,
669672
doc.location.href,

0 commit comments

Comments
 (0)