diff --git a/src/core/annotation.js b/src/core/annotation.js index bab094937..fff00fa8d 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -4092,4 +4092,5 @@ export { AnnotationFactory, getQuadPoints, MarkupAnnotation, + PopupAnnotation, }; diff --git a/src/core/document.js b/src/core/document.js index 5fc6ebc3e..ae789cacd 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -13,6 +13,7 @@ * limitations under the License. */ +import { AnnotationFactory, PopupAnnotation } from "./annotation.js"; import { assert, FormatError, @@ -42,7 +43,6 @@ import { } from "./core_utils.js"; import { Dict, isName, Name, Ref } from "./primitives.js"; import { getXfaFontDict, getXfaFontName } from "./xfa_fonts.js"; -import { AnnotationFactory } from "./annotation.js"; import { BaseStream } from "./base_stream.js"; import { calculateMD5 } from "./crypto.js"; import { Catalog } from "./catalog.js"; @@ -656,7 +656,32 @@ class Page { } return Promise.all(annotationPromises).then(function (annotations) { - return annotations.filter(annotation => !!annotation); + if (annotations.length === 0) { + return annotations; + } + + const sortedAnnotations = []; + let popupAnnotations; + // Ensure that PopupAnnotations are handled last, since they depend on + // their parent Annotation in the display layer; fixes issue 11362. + for (const annotation of annotations) { + if (!annotation) { + continue; + } + if (annotation instanceof PopupAnnotation) { + if (!popupAnnotations) { + popupAnnotations = []; + } + popupAnnotations.push(annotation); + continue; + } + sortedAnnotations.push(annotation); + } + if (popupAnnotations) { + sortedAnnotations.push(...popupAnnotations); + } + + return sortedAnnotations; }); }); diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index 89e712a03..c5ba9a662 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -2477,30 +2477,13 @@ class AnnotationLayer { this.#setDimensions(div, viewport); - const sortedAnnotations = [], - popupAnnotations = []; - // Ensure that Popup annotations are handled last, since they're dependant - // upon the parent annotation having already been rendered (please refer to - // the `PopupAnnotationElement.render` method); fixes issue 11362. for (const data of annotations) { - if (!data) { - continue; + if (data.annotationType !== AnnotationType.POPUP) { + const { width, height } = getRectDims(data.rect); + if (width <= 0 || height <= 0) { + continue; // Ignore empty annotations. + } } - if (data.annotationType === AnnotationType.POPUP) { - popupAnnotations.push(data); - continue; - } - const { width, height } = getRectDims(data.rect); - if (width <= 0 || height <= 0) { - continue; // Ignore empty annotations. - } - sortedAnnotations.push(data); - } - if (popupAnnotations.length) { - sortedAnnotations.push(...popupAnnotations); - } - - for (const data of sortedAnnotations) { const element = AnnotationElementFactory.create({ data, layer: div,