Skip to content

Commit

Permalink
Improve the StructTreeLayerBuilder.render method
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Snuffleupagus committed Sep 4, 2024
1 parent d369822 commit 4b86286
Showing 1 changed file with 18 additions and 6 deletions.
24 changes: 18 additions & 6 deletions web/struct_tree_layer_builder.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,9 @@ const HEADING_PATTERN = /^H(\d+)$/;
class StructTreeLayerBuilder {
#promise;

#treeDom = undefined;
#treeDom = null;

#treePromise;

#elementAttributes = new Map();

Expand All @@ -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) {
Expand Down

0 comments on commit 4b86286

Please sign in to comment.