From d81643b423efb51de54c7fc37dffc4be7453a74c Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 27 Jan 2026 03:46:40 +0000 Subject: [PATCH] Fix CI failures in popover engine, tag trimming, and canvas mock - Guard `js/ui/overlay/popoverEngine.js` against missing `window` and detached elements in `updatePosition`. - Update `js/ui/components/VideoModal.js` `normalizeVideoTags` to strip `#` prefix, aligning with test expectations and display logic. - Mock `HTMLCanvasElement.prototype.getContext` in `tests/video-modal-accessibility.test.mjs` to silence benign warnings. Co-authored-by: PR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> --- js/ui/components/VideoModal.js | 2 +- js/ui/overlay/popoverEngine.js | 15 ++++++++++++++- tests/video-modal-accessibility.test.mjs | 6 +++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/js/ui/components/VideoModal.js b/js/ui/components/VideoModal.js index 8bf412dd..d6fceca8 100644 --- a/js/ui/components/VideoModal.js +++ b/js/ui/components/VideoModal.js @@ -3244,7 +3244,7 @@ export class VideoModal { seen.add(key); - const display = trimmed.startsWith("#") ? trimmed : `#${trimmed}`; + const display = trimmed.startsWith("#") ? trimmed.slice(1) : trimmed; normalized.push(display); } diff --git a/js/ui/overlay/popoverEngine.js b/js/ui/overlay/popoverEngine.js index ef0e9ea2..46fda272 100644 --- a/js/ui/overlay/popoverEngine.js +++ b/js/ui/overlay/popoverEngine.js @@ -320,7 +320,9 @@ export function createPopover(trigger, render, options = {}) { } function getView() { - return documentRef?.defaultView || globalThis; + if (typeof window !== "undefined") return window; + if (typeof globalThis !== "undefined") return globalThis; + return undefined; } function focusWithoutScroll(node) { @@ -774,10 +776,18 @@ export function createPopover(trigger, render, options = {}) { } async function updatePosition() { + if (typeof window === "undefined") { + return; + } + if (!anchor || !panel) { return; } + if (anchor.isConnected === false || panel.isConnected === false) { + return; + } + try { const effectiveGap = Number.isFinite(gap) ? gap : 0; const safePadding = Number.isFinite(viewportPadding) ? viewportPadding : 0; @@ -848,6 +858,9 @@ export function createPopover(trigger, render, options = {}) { syncPopoverStyles(); } catch (error) { + if (error instanceof ReferenceError && error.message.includes("window")) { + return; + } logger.user.error("[popover] positioning failed", error); } } diff --git a/tests/video-modal-accessibility.test.mjs b/tests/video-modal-accessibility.test.mjs index 560779f9..ebfaebfd 100644 --- a/tests/video-modal-accessibility.test.mjs +++ b/tests/video-modal-accessibility.test.mjs @@ -174,7 +174,11 @@ export async function setupModal({ lazyLoad = false } = {}) { // Force override getContext to silence JSDOM "Not implemented" error try { - window.HTMLCanvasElement.prototype.getContext = () => null; + window.HTMLCanvasElement.prototype.getContext = () => ({ + fillStyle: "", + fillRect: () => {}, + drawImage: () => {}, + }); } catch (err) { // ignore }