fx-compat: Run translation and SingleFile in [hidden] browser

And replace loadDocuments().
This commit is contained in:
Abe Jellinek 2023-04-14 11:37:07 -04:00
parent b2947aede0
commit 0612a9e6f5
19 changed files with 1652 additions and 649 deletions

View file

@ -26,6 +26,8 @@
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
var { E10SUtils } = ChromeUtils.import("resource://gre/modules/E10SUtils.jsm");
var { Subprocess } = ChromeUtils.import("resource://gre/modules/Subprocess.jsm");
var { RemoteTranslate } = ChromeUtils.import("chrome://zotero/content/RemoteTranslate.jsm");
var { ContentDOMReference } = ChromeUtils.import("resource://gre/modules/ContentDOMReference.jsm");
import FilePicker from 'zotero/modules/filePicker';
@ -959,24 +961,20 @@ var Scaffold = new function () {
/*
* run translator in given mode with given input
*/
function _run(functionToRun, input, selectItems, itemDone, detectHandler, done) {
async function _run(functionToRun, input, selectItems, itemDone, detectHandler, done) {
let translate;
let isRemoteWeb = false;
if (functionToRun == "detectWeb" || functionToRun == "doWeb") {
var translate = new Zotero.Translate.Web();
translate = new RemoteTranslate();
isRemoteWeb = true;
if (!_testTargetRegex(input)) {
_logOutput("Target did not match " + _getDocumentURL(input));
_logOutput("Target did not match " + _getCurrentURI(input));
if (done) {
done();
}
return;
}
translate.setDocument(input);
// Use cookies from browser pane
translate.setCookieSandbox(new Zotero.CookieSandbox(
null,
_getDocumentURL(input),
input.cookie
));
await translate.setBrowser(input);
}
else if (functionToRun == "detectImport" || functionToRun == "doImport") {
translate = new Zotero.Translate.Import();
@ -1000,15 +998,33 @@ var Scaffold = new function () {
// get translator
var translator = _getTranslatorFromPane();
if (functionToRun.startsWith('detect')) {
// don't let target prevent translator from operating
translator.target = null;
// generate sandbox
translate.setHandler("translators", detectHandler);
// internal hack to call detect on this translator
translate._potentialTranslators = [translator];
translate._foundTranslators = [];
translate._currentState = "detect";
translate._detect();
if (isRemoteWeb) {
translate.setTranslator(translator);
detectHandler(translate, await translate.detect());
translate.dispose();
}
else {
// don't let target prevent translator from operating
translator.target = null;
// generate sandbox
translate.setHandler("translators", detectHandler);
// internal hack to call detect on this translator
translate._potentialTranslators = [translator];
translate._foundTranslators = [];
translate._currentState = "detect";
translate._detect();
}
}
else if (isRemoteWeb) {
translate.setHandler("select", selectItems);
translate.setTranslator(translator);
let items = await translate.translate({ libraryID: false });
if (items) {
for (let item of items) {
itemDone(translate, item);
}
}
translate.dispose();
}
else {
// don't let the detectCode prevent the translator from operating
@ -1049,14 +1065,14 @@ var Scaffold = new function () {
* Test target regular expression against document URL and log the result
*/
this.logTargetRegex = async function () {
_logOutput(_testTargetRegex(await _getDocument()));
_logOutput(_testTargetRegex(_browser));
};
/**
* Test target regular expression against document URL and return the result
*/
function _testTargetRegex(doc) {
var url = _getDocumentURL(doc);
function _testTargetRegex(browser) {
var url = _getCurrentURI(browser);
try {
var targetRe = new RegExp(document.getElementById('textbox-target').value, "i");
@ -1191,7 +1207,7 @@ var Scaffold = new function () {
async function _getInput(typeOrMethod) {
typeOrMethod = typeOrMethod.toLowerCase();
if (typeOrMethod.endsWith('web')) {
return _getDocument();
return _browser;
}
else if (typeOrMethod.endsWith('import')) {
return _getImport();
@ -1875,12 +1891,12 @@ var Scaffold = new function () {
for (let item of items) {
item.getElementsByTagName("label")[1].setAttribute("value", "Running");
var test = JSON.parse(item.dataset.testString);
test["ui-item"] = item;
test["ui-item"] = ContentDOMReference.get(item);
tests.push(test);
}
this.runTests(tests, (obj, test, status, message) => {
test["ui-item"].getElementsByTagName("label")[1].setAttribute("value", message);
ContentDOMReference.resolve(test["ui-item"]).getElementsByTagName("label")[1].setAttribute("value", message);
});
};
@ -1975,7 +1991,7 @@ var Scaffold = new function () {
this._updateTests();
};
TestUpdater.prototype._updateTests = function () {
TestUpdater.prototype._updateTests = async function () {
if (!this.testsToUpdate.length) {
this.doneCallback(this.newTests);
return;
@ -1986,49 +2002,52 @@ var Scaffold = new function () {
if (test.type == 'web') {
_logOutput("Loading web page from " + test.url);
var hiddenBrowser = Zotero.HTTP.loadDocuments(
test.url,
(doc) => {
_logOutput("Page loaded");
if (test.defer) {
_logOutput("Waiting " + (Zotero_TranslatorTester.DEFER_DELAY / 1000)
+ " second(s) for page content to settle"
);
}
Zotero.setTimeout(
() => {
doc = hiddenBrowser.contentDocument;
if (doc.location.href != test.url) {
_logOutput("Page URL differs from test. Will be updated. " + doc.location.href);
}
this.tester.newTest(doc,
(obj, newTest) => {
Zotero.Browser.deleteHiddenBrowser(hiddenBrowser);
if (test.defer) {
newTest.defer = true;
}
newTest = _sanitizeItemsInTest(newTest);
this.newTests.push(newTest);
this.testDoneCallback(newTest);
this._updateTests();
},
_confirmCreateExpectedFailTest);
},
test.defer ? Zotero_TranslatorTester.DEFER_DELAY : 0,
true
);
},
null,
(e) => {
Zotero.logError(e);
this.newTests.push(false);
this.testDoneCallback(false);
this._updateTests();
},
true
);
hiddenBrowser.docShell.allowMetaRedirects = true;
const { HiddenBrowser } = ChromeUtils.import("chrome://zotero/content/HiddenBrowser.jsm");
let browser;
try {
browser = await HiddenBrowser.create(test.url, {
requireSuccessfulStatus: true,
docShell: { allowMetaRedirects: true }
});
if (test.defer) {
_logOutput("Waiting " + (Zotero_TranslatorTester.DEFER_DELAY / 1000)
+ " second(s) for page content to settle");
await Zotero.Promise.delay(Zotero_TranslatorTester.DEFER_DELAY);
}
else {
// Wait just a bit for things to settle
await Zotero.Promise.delay(1000);
}
if (browser.currentURI.spec != test.url) {
_logOutput("Page URL differs from test. Will be updated. " + browser.currentURI.spec);
}
let translate = new RemoteTranslate();
await translate.setBrowser(browser);
await translate.setTranslatorProvider(_translatorProvider);
translate.setTranslator(_getTranslatorFromPane());
translate.setHandler("debug", _debug);
translate.setHandler("error", _error);
translate.setHandler("newTestDetectionFailed", _confirmCreateExpectedFailTest);
let newTest = await translate.newTest();
translate.dispose();
newTest = _sanitizeItemsInTest(newTest);
this.newTests.push(newTest);
this.testDoneCallback(newTest);
this._updateTests();
}
catch (e) {
Zotero.logError(e);
this.newTests.push(false);
this.testDoneCallback(false);
this._updateTests();
}
finally {
if (browser) HiddenBrowser.destroy(browser);
}
}
else {
test.items = [];
@ -2092,23 +2111,8 @@ var Scaffold = new function () {
return guid;
}
/*
* gets selected frame/document
*/
function _getDocument() {
return new Promise((resolve) => {
window.messageManager.addMessageListener('Scaffold:Document', function onDocument({ data }) {
window.messageManager.removeMessageListener('Scaffold:Document', onDocument);
let doc = new DOMParser().parseFromString(data.html, 'text/html');
doc = Zotero.HTTP.wrapDocument(doc, data.url);
resolve(doc);
});
window.messageManager.broadcastAsyncMessage('Scaffold:GetDocument');
});
}
function _getDocumentURL(doc) {
return Zotero.Proxies.proxyToProper(doc.location.href);
function _getCurrentURI(browser) {
return Zotero.Proxies.proxyToProper(browser.currentURI.spec);
}
function _findTestObjectTops(monaco, model) {