Skip to content

Commit

Permalink
Pause translation when appending the textLayer and structTreeLayer to…
Browse files Browse the repository at this point in the history
… the page

Note that we must append the textLayer to the DOM *before* enabling the `highlighter` and `accessibilityManager`, to avoid breaking e.g. a pending searching operation.
The least invasive solution, that I was able to come up with, is to introduce a new `TextLayerBuilder` callback-function for this purpose.
  • Loading branch information
Snuffleupagus committed Oct 27, 2023
1 parent 3478112 commit 1ed88e7
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
10 changes: 9 additions & 1 deletion web/pdf_page_view.js
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,10 @@ class PDFPageView {
: null);
const treeDom = this.structTreeLayer?.render(tree);
if (treeDom) {
// Pause translation when inserting the structTree in the DOM.
this.l10n.pause();
this.canvas?.append(treeDom);
this.l10n.resume();
}
this.structTreeLayer?.show();
}
Expand Down Expand Up @@ -863,7 +866,12 @@ class PDFPageView {
enablePermissions:
this.#textLayerMode === TextLayerMode.ENABLE_PERMISSIONS,
});
div.append(this.textLayer.div);
this.textLayer.onAppend = textLayerDiv => {
// Pause translation when inserting the textLayer in the DOM.
this.l10n.pause();
this.div.append(textLayerDiv);
this.l10n.resume();
};
}

if (
Expand Down
14 changes: 11 additions & 3 deletions web/text_layer_builder.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,14 @@ class TextLayerBuilder {
this.isOffscreenCanvasSupported = isOffscreenCanvasSupported;
this.#enablePermissions = enablePermissions === true;

/**
* Callback used to attach the textLayer to the DOM.
* @type {function}
*/
this.onAppend = null;

this.div = document.createElement("div");
this.div.className = "textLayer";
this.hide();
}

#finishRendering() {
Expand Down Expand Up @@ -131,12 +136,15 @@ class TextLayerBuilder {
this.#finishRendering();
this.#scale = scale;
this.#rotation = rotation;
this.show();
// Ensure that the textLayer is appended to the DOM *before* handling
// e.g. a pending search operation.
this.onAppend(this.div);
this.highlighter?.enable();
this.accessibilityManager?.enable();
}

hide() {
if (!this.div.hidden) {
if (!this.div.hidden && this.renderingDone) {
// We turn off the highlighter in order to avoid to scroll into view an
// element of the text layer which could be hidden.
this.highlighter?.disable();
Expand Down

0 comments on commit 1ed88e7

Please sign in to comment.