From 5f3d22b3aae39b3d0d4d78fc82039fc083691075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vi=CC=81ctor=20Falco=CC=81n?= Date: Sun, 5 Jul 2026 18:57:28 +0200 Subject: [PATCH] harden(media-query): no-op the fallback when neither API exists Guard the deprecated addListener/removeListener fallback with a typeof check so a hypothetical MediaQueryList exposing neither the modern nor the legacy API silently no-ops instead of re-introducing the crash this helper exists to prevent. Add a test for the neither-API case. (Follow-up from review.) --- resources/js/lib/media-query.test.ts | 12 ++++++++++++ resources/js/lib/media-query.ts | 11 +++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/resources/js/lib/media-query.test.ts b/resources/js/lib/media-query.test.ts index 9d3f5762..770b14b0 100644 --- a/resources/js/lib/media-query.test.ts +++ b/resources/js/lib/media-query.test.ts @@ -28,6 +28,18 @@ describe('addMediaQueryListener', () => { expect(addListener).toHaveBeenCalledWith(handler); }); + + it('does not throw when neither API is present', () => { + expect(() => + addMediaQueryListener( + fakeMql({ + addEventListener: undefined, + addListener: undefined, + }), + () => {}, + ), + ).not.toThrow(); + }); }); describe('removeMediaQueryListener', () => { diff --git a/resources/js/lib/media-query.ts b/resources/js/lib/media-query.ts index 9a383532..93557b16 100644 --- a/resources/js/lib/media-query.ts +++ b/resources/js/lib/media-query.ts @@ -18,7 +18,12 @@ export function addMediaQueryListener( return; } - mql.addListener(handler); + // Deprecated fallback for Safari <14 / legacy browsers. Guarded so a + // hypothetical MediaQueryList exposing neither API no-ops instead of + // re-introducing the crash this helper exists to prevent. + if (typeof mql.addListener === 'function') { + mql.addListener(handler); + } } export function removeMediaQueryListener( @@ -31,5 +36,7 @@ export function removeMediaQueryListener( return; } - mql.removeListener(handler); + if (typeof mql.removeListener === 'function') { + mql.removeListener(handler); + } }