Files
Anarios e500088e65 Prepare 4.0.5 Firefox update and Shorts fixes
Add Firefox data consent, repair contributor sign-in, and introduce optional Hide clutter buttons. Harden video navigation, voting, and action layouts with shared browser regression coverage and reproducible release packaging.
2026-09-06 12:51:12 +02:00

74 lines
1.9 KiB
JavaScript

function defaultGetActivationTarget(control) {
if (control?.matches?.("button, tp-yt-paper-button#button")) {
return control;
}
return control?.querySelector?.("button, tp-yt-paper-button#button") ?? control ?? null;
}
function isHiddenWithinButtons(activationTarget, buttons) {
let current = activationTarget;
while (current) {
if (
current.hidden === true ||
current.getAttribute?.("aria-hidden") === "true" ||
current.hasAttribute?.("inert") ||
current.style?.display === "none" ||
current.style?.visibility === "hidden"
) {
return true;
}
if (current === buttons) {
return false;
}
current = current.parentElement;
}
return true;
}
function eventActivatesTarget(event, activationTarget) {
const eventPath = typeof event?.composedPath === "function" ? event.composedPath() : [];
if (eventPath.includes(activationTarget)) {
return true;
}
const eventTarget = event?.target;
return Boolean(eventTarget && activationTarget?.contains?.(eventTarget));
}
function resolveDelegatedVoteActivation({
buttons,
dislikeButton,
event,
getActivationTarget = defaultGetActivationTarget,
likeButton,
}) {
if (!event || !buttons?.isConnected) {
return null;
}
for (const [action, control] of [
["dislike", dislikeButton],
["like", likeButton],
]) {
if (!control?.isConnected || !buttons.contains(control)) {
continue;
}
const activationTarget = getActivationTarget(control);
if (
!activationTarget?.isConnected ||
!control.contains(activationTarget) ||
isHiddenWithinButtons(activationTarget, buttons) ||
activationTarget.disabled === true ||
activationTarget.getAttribute?.("aria-disabled") === "true"
) {
continue;
}
if (eventActivatesTarget(event, activationTarget)) {
return { action, activationTarget };
}
}
return null;
}
export { resolveDelegatedVoteActivation };