Properly ignore PopupAnnotations with custom trigger-elements

A number of Annotation-types are currently creating their own PopupAnnotations, since they need to use a custom `trigger`-element. However, because of where that check is currently implemented[1] we end up attaching empty/unused containers for those PopupAnnotations to the DOM[2]; see e.g. the `annotation-line.pdf` file in the test-suite for one example.

By instead moving the types-check into the `PopupAnnotationElement` constructor, we can completely skip those PopupAnnotations that are being explicitly handled elsewhere.
Note that I don't *believe* that this is a new issue, although I've not tried to bisect it, but this likely goes back quite some time (possibly even as far as PR 8228).

---
[1] In the `PopupAnnotationElement.render` method.

[2] Please note that the actual Popup-element *itself* isn't being attached/rendered here, just its container which by itself serves no purpose as far as I can tell.
This commit is contained in:
Jonas Jenwald 2022-08-29 16:12:20 +02:00
parent 86370bd5c5
commit 0ecf6458ee

View File

@ -1736,35 +1736,31 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {
} }
class PopupAnnotationElement extends AnnotationElement { class PopupAnnotationElement extends AnnotationElement {
// Do not render popup annotations for parent elements with these types as
// they create the popups themselves (because of custom trigger divs).
static IGNORE_TYPES = new Set([
"Line",
"Square",
"Circle",
"PolyLine",
"Polygon",
"Ink",
]);
constructor(parameters) { constructor(parameters) {
const isRenderable = !!( const { data } = parameters;
parameters.data.titleObj?.str || const isRenderable =
parameters.data.contentsObj?.str || !PopupAnnotationElement.IGNORE_TYPES.has(data.parentType) &&
parameters.data.richText?.str !!(data.titleObj?.str || data.contentsObj?.str || data.richText?.str);
);
super(parameters, { isRenderable }); super(parameters, { isRenderable });
} }
render() { render() {
// Do not render popup annotations for parent elements with these types as
// they create the popups themselves (because of custom trigger divs).
const IGNORE_TYPES = [
"Line",
"Square",
"Circle",
"PolyLine",
"Polygon",
"Ink",
];
this.container.className = "popupAnnotation"; this.container.className = "popupAnnotation";
if (IGNORE_TYPES.includes(this.data.parentType)) { const parentElements = this.layer.querySelectorAll(
return this.container; `[data-annotation-id="${this.data.parentId}"]`
} );
const selector = `[data-annotation-id="${this.data.parentId}"]`;
const parentElements = this.layer.querySelectorAll(selector);
if (parentElements.length === 0) { if (parentElements.length === 0) {
return this.container; return this.container;
} }