Use modern DOM methods a bit more (PR 15031 follow-up)

Apparently the ESLint rule added in PR 15031 wasn't able to catch all cases that can be converted, which is probably not all that surprising given how some of these call-sites look.

 - Use `Element.prepend()` to insert nodes before all other ones in the element, rather than using `firstChild` with `insertBefore`-calls; see https://developer.mozilla.org/en-US/docs/Web/API/Element/prepend

 - Fix one *incorrect* `insertBefore` call, in the AnnotationLayer-code.
   Initially the patch simply changed that to an `Element.before()`-call, however that broke one of the integration-tests. It turns out that the `index` may try to access a non-existent select-child, which triggers undefined behaviour; note the warning in https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore#parameters
This commit is contained in:
Jonas Jenwald 2022-06-12 23:15:56 +02:00
parent 1a6ae5f034
commit 4902ad8923
5 changed files with 13 additions and 9 deletions

View File

@ -27,6 +27,7 @@
- Removes window._ assignment.
- Remove compatibility code for OldIE.
- Replaces `String.prototype.substr()` with `String.prototype.substring()`.
- Replaces one `Node.insertBefore()` with `Element.prepend()`.
- Removes `fireL10nReadyEvent` since the "localized" event it dispatches
is unused and may clash with an identically named event in the viewer.
*/
@ -921,7 +922,7 @@ document.webL10n = (function(window, document, undefined) {
// first element child.
if (!found) {
var textNode = document.createTextNode(data[gTextProp]);
element.insertBefore(textNode, element.firstChild);
element.prepend(textNode);
}
}
delete data[gTextProp];

View File

@ -1499,7 +1499,7 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {
noneOptionElement.value = " ";
noneOptionElement.setAttribute("hidden", true);
noneOptionElement.setAttribute("selected", true);
selectElement.insertBefore(noneOptionElement, selectElement.firstChild);
selectElement.prepend(noneOptionElement);
removeEmptyEntry = () => {
noneOptionElement.remove();
@ -1573,13 +1573,16 @@ class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement {
},
insert(event) {
const { index, displayValue, exportValue } = event.detail.insert;
const selectChild = selectElement.children[index];
const optionElement = document.createElement("option");
optionElement.textContent = displayValue;
optionElement.value = exportValue;
selectElement.insertBefore(
optionElement,
selectElement.children[index]
);
if (selectChild) {
selectChild.before(optionElement);
} else {
selectElement.append(optionElement);
}
storage.setValue(id, {
value: getValue(event, /* isExport */ true),
items: getItems(event),

View File

@ -87,7 +87,7 @@ class BaseTreeViewer {
this._toggleTreeItem(div, shouldShowAll);
}
};
div.insertBefore(toggler, div.firstChild);
div.prepend(toggler);
}
/**

View File

@ -51,7 +51,7 @@ class OverlayManager {
const style = document.createElement("style");
style.textContent = PDFJSDev.eval("DIALOG_POLYFILL_CSS");
document.head.insertBefore(style, document.head.firstElementChild);
document.head.prepend(style);
}
}

View File

@ -176,7 +176,7 @@ class TextHighlighter {
let div = textDivs[divIdx];
if (div.nodeType === Node.TEXT_NODE) {
const span = document.createElement("span");
div.parentNode.insertBefore(span, div);
div.before(span);
span.append(div);
textDivs[divIdx] = span;
div = span;