1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-19 22:58:07 +02:00

Merge pull request #18461 from calixteman/bug1908938

Load the image-to-text model when opening the pdf viewer in Firefox (bug 1908938)
This commit is contained in:
calixteman 2024-07-19 23:08:50 +02:00 committed by GitHub
commit ed83d7c5e1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 62 additions and 24 deletions

View file

@ -430,7 +430,8 @@ class StampEditor extends AnnotationEditor {
return;
}
this.#hasMLBeenQueried = true;
if (!this._uiManager.isMLEnabledFor("altText") || this.hasAltText()) {
const isMLEnabled = await this._uiManager.isMLEnabledFor("altText");
if (!isMLEnabled || this.hasAltText()) {
return;
}
const offscreen = new OffscreenCanvas(width, height);
@ -447,7 +448,7 @@ class StampEditor extends AnnotationEditor {
height
);
const response = await this._uiManager.mlGuess({
service: "image-to-text",
service: "moz-image-to-text",
request: {
data: ctx.getImageData(0, 0, width, height).data,
width,

View file

@ -855,8 +855,8 @@ class AnnotationEditorUIManager {
return this.#mlManager?.guess(data) || null;
}
isMLEnabledFor(name) {
return !!this.#mlManager?.isEnabledFor(name);
async isMLEnabledFor(name) {
return !!(await this.#mlManager?.isEnabledFor(name));
}
get useNewAltTextFlow() {

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;
}