mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-19 22:58:07 +02:00
Improve the StructTreeLayerBuilder.render
method
In hindsight it occurred to me that there's a couple of smaller issues with this method after it's made asynchronous (in PR 18658). - If the `render`-method is invoked back-to-back the existing caching doesn't guarantee that re-parsing won't occur, which we can address by introducing a new (private) promise. - If there's any errors fetching and/or parsing the structTree-data, we'd attempt to parse it again on re-rendering despite that being pointless.
This commit is contained in:
parent
d3698223a8
commit
4b8628637a
1 changed files with 18 additions and 6 deletions
|
@ -76,7 +76,9 @@ const HEADING_PATTERN = /^H(\d+)$/;
|
|||
class StructTreeLayerBuilder {
|
||||
#promise;
|
||||
|
||||
#treeDom = undefined;
|
||||
#treeDom = null;
|
||||
|
||||
#treePromise;
|
||||
|
||||
#elementAttributes = new Map();
|
||||
|
||||
|
@ -85,13 +87,23 @@ class StructTreeLayerBuilder {
|
|||
}
|
||||
|
||||
async render() {
|
||||
if (this.#treeDom !== undefined) {
|
||||
return this.#treeDom;
|
||||
if (this.#treePromise) {
|
||||
return this.#treePromise;
|
||||
}
|
||||
const { promise, resolve, reject } = Promise.withResolvers();
|
||||
this.#treePromise = promise;
|
||||
|
||||
try {
|
||||
this.#treeDom = this.#walk(await this.#promise);
|
||||
} catch (ex) {
|
||||
reject(ex);
|
||||
}
|
||||
const treeDom = (this.#treeDom = this.#walk(await this.#promise));
|
||||
this.#promise = null;
|
||||
treeDom?.classList.add("structTree");
|
||||
return treeDom;
|
||||
|
||||
this.#treeDom?.classList.add("structTree");
|
||||
resolve(this.#treeDom);
|
||||
|
||||
return promise;
|
||||
}
|
||||
|
||||
async getAriaAttributes(annotationId) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue