mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-14 18:24:14 +01:00
Avoid showing unnecessary JS errors when there are elements with different origin on the page (#29081) (#29089)
Backport #29081 by wxiaoguang Try to fix #29080 Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> (cherry picked from commit 9a4d283e9ac472dca869356c27db05039673c638)
This commit is contained in:
parent
628e1036cf
commit
614ba2b257
3 changed files with 19 additions and 9 deletions
|
@ -1,5 +1,6 @@
|
||||||
// for performance considerations, it only uses performant syntax
|
import {isDocumentFragmentOrElementNode} from '../utils/dom.js';
|
||||||
|
|
||||||
|
// for performance considerations, it only uses performant syntax
|
||||||
function attachDirAuto(el) {
|
function attachDirAuto(el) {
|
||||||
if (el.type !== 'hidden' &&
|
if (el.type !== 'hidden' &&
|
||||||
el.type !== 'checkbox' &&
|
el.type !== 'checkbox' &&
|
||||||
|
@ -18,7 +19,7 @@ export function initDirAuto() {
|
||||||
const len = mutation.addedNodes.length;
|
const len = mutation.addedNodes.length;
|
||||||
for (let i = 0; i < len; i++) {
|
for (let i = 0; i < len; i++) {
|
||||||
const addedNode = mutation.addedNodes[i];
|
const addedNode = mutation.addedNodes[i];
|
||||||
if (addedNode.nodeType !== Node.ELEMENT_NODE && addedNode.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) continue;
|
if (!isDocumentFragmentOrElementNode(addedNode)) continue;
|
||||||
if (addedNode.nodeName === 'INPUT' || addedNode.nodeName === 'TEXTAREA') attachDirAuto(addedNode);
|
if (addedNode.nodeName === 'INPUT' || addedNode.nodeName === 'TEXTAREA') attachDirAuto(addedNode);
|
||||||
const children = addedNode.querySelectorAll('input, textarea');
|
const children = addedNode.querySelectorAll('input, textarea');
|
||||||
const len = children.length;
|
const len = children.length;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import tippy, {followCursor} from 'tippy.js';
|
import tippy, {followCursor} from 'tippy.js';
|
||||||
|
import {isDocumentFragmentOrElementNode} from '../utils/dom.js';
|
||||||
|
|
||||||
const visibleInstances = new Set();
|
const visibleInstances = new Set();
|
||||||
|
|
||||||
|
@ -136,8 +137,6 @@ function attachChildrenLazyTooltip(target) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const elementNodeTypes = new Set([Node.ELEMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE]);
|
|
||||||
|
|
||||||
export function initGlobalTooltips() {
|
export function initGlobalTooltips() {
|
||||||
// use MutationObserver to detect new "data-tooltip-content" elements added to the DOM, or attributes changed
|
// use MutationObserver to detect new "data-tooltip-content" elements added to the DOM, or attributes changed
|
||||||
const observerConnect = (observer) => observer.observe(document, {
|
const observerConnect = (observer) => observer.observe(document, {
|
||||||
|
@ -152,11 +151,10 @@ export function initGlobalTooltips() {
|
||||||
if (mutation.type === 'childList') {
|
if (mutation.type === 'childList') {
|
||||||
// mainly for Vue components and AJAX rendered elements
|
// mainly for Vue components and AJAX rendered elements
|
||||||
for (const el of mutation.addedNodes) {
|
for (const el of mutation.addedNodes) {
|
||||||
if (elementNodeTypes.has(el.nodeType)) {
|
if (!isDocumentFragmentOrElementNode(el)) continue;
|
||||||
attachChildrenLazyTooltip(el);
|
attachChildrenLazyTooltip(el);
|
||||||
if (el.hasAttribute('data-tooltip-content')) {
|
if (el.hasAttribute('data-tooltip-content')) {
|
||||||
attachLazyTooltip(el);
|
attachLazyTooltip(el);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (mutation.type === 'attributes') {
|
} else if (mutation.type === 'attributes') {
|
||||||
|
|
|
@ -59,6 +59,17 @@ export function onDomReady(cb) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// checks whether an element is owned by the current document, and whether it is a document fragment or element node
|
||||||
|
// if it is, it means it is a "normal" element managed by us, which can be modified safely.
|
||||||
|
export function isDocumentFragmentOrElementNode(el) {
|
||||||
|
try {
|
||||||
|
return el.ownerDocument === document && el.nodeType === Node.ELEMENT_NODE || el.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
|
||||||
|
} catch {
|
||||||
|
// in case the el is not in the same origin, then the access to nodeType would fail
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// autosize a textarea to fit content. Based on
|
// autosize a textarea to fit content. Based on
|
||||||
// https://github.com/github/textarea-autosize
|
// https://github.com/github/textarea-autosize
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in a new issue