1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-20 15:18:08 +02:00

Load the image-to-text model when opening the pdf viewer in Firefox (bug 1908938)

This commit is contained in:
Calixte Denizet 2024-07-19 17:57:53 +02:00
parent 5b0e15ab18
commit b71fa727e1
5 changed files with 62 additions and 24 deletions

View file

@ -155,6 +155,7 @@ const PDFViewerApplication = {
isViewerEmbedded: window.parent !== window,
url: "",
baseUrl: "",
mlManager: null,
_downloadUrl: "",
_eventBusAbortController: null,
_windowAbortController: null,
@ -205,6 +206,11 @@ const PDFViewerApplication = {
if (mode) {
document.documentElement.classList.add(mode);
}
} else {
// We want to load the image-to-text AI engine as soon as possible.
this.mlManager = new MLManager({
enableAltText: AppOptions.get("enableAltText"),
});
}
// Ensure that the `L10n`-instance has been initialized before creating
@ -370,11 +376,14 @@ const PDFViewerApplication = {
let eventBus;
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) {
eventBus = AppOptions.eventBus = new FirefoxEventBus(
AppOptions.get("allowedGlobalEvents"),
externalServices,
AppOptions.get("isInAutomation")
);
eventBus =
AppOptions.eventBus =
this.mlManager.eventBus =
new FirefoxEventBus(
AppOptions.get("allowedGlobalEvents"),
externalServices,
AppOptions.get("isInAutomation")
);
} else {
eventBus = new EventBus();
}
@ -731,15 +740,6 @@ const PDFViewerApplication = {
return shadow(this, "externalServices", new ExternalServices());
},
get mlManager() {
const enableAltText = AppOptions.get("enableAltText");
return shadow(
this,
"mlManager",
enableAltText === true ? new MLManager({ enableAltText }) : null
);
},
get initialized() {
return this._initializedCapability.settled;
},

View file

@ -308,19 +308,56 @@ class FirefoxScripting {
}
class MLManager {
#enabled = new Map();
#enabled = null;
constructor({ enableAltText }) {
this.#enabled.set("altText", enableAltText);
eventBus = null;
constructor(options) {
this.enable({ ...options, listenToProgress: false });
}
isEnabledFor(name) {
return this.#enabled.get(name);
async isEnabledFor(name) {
return !!(await this.#enabled?.get(name));
}
guess(data) {
return FirefoxCom.requestAsync("mlGuess", data);
}
enable({ enableAltText, listenToProgress }) {
if (enableAltText) {
this.#loadAltTextEngine(listenToProgress);
}
}
async #loadAltTextEngine(listenToProgress) {
if (this.#enabled?.has("altText")) {
// We already have a promise for the "altText" service.
return;
}
const promise = FirefoxCom.requestAsync("loadAIEngine", {
service: "moz-image-to-text",
listenToProgress,
});
(this.#enabled ||= new Map()).set("altText", promise);
if (listenToProgress) {
const callback = ({ detail }) => {
this.eventBus.dispatch("loadaiengineprogress", {
source: this,
detail,
});
if (detail.finished) {
window.removeEventListener("loadAIEngineProgress", callback);
}
};
window.addEventListener("loadAIEngineProgress", callback);
promise.then(ok => {
if (!ok) {
window.removeEventListener("loadAIEngineProgress", callback);
}
});
}
}
}
class ExternalServices extends BaseExternalServices {

View file

@ -48,7 +48,7 @@ class ExternalServices extends BaseExternalServices {
}
class MLManager {
isEnabledFor(_name) {
async isEnabledFor(_name) {
return false;
}