From 654dc2094f690210ead1657843152cd3cae7e773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Mon, 21 Sep 2026 06:37:25 -0700 Subject: [PATCH] Test ResizeObserver structured clone errors (#58592) Summary: Pull Request resolved: https://github.com/react/react-native/pull/58592 Add structured-clone coverage for `ResizeObserver`, `ResizeObserverEntry`, and `ResizeObserverSize` using real observer entries. Changelog: [Internal] Reviewed By: andrewdacenko Differential Revision: D120691617 --- .../__tests__/structuredClone-itest.js | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/packages/react-native/src/private/webapis/structuredClone/__tests__/structuredClone-itest.js b/packages/react-native/src/private/webapis/structuredClone/__tests__/structuredClone-itest.js index 23e8473fd4d..0bede29eb06 100644 --- a/packages/react-native/src/private/webapis/structuredClone/__tests__/structuredClone-itest.js +++ b/packages/react-native/src/private/webapis/structuredClone/__tests__/structuredClone-itest.js @@ -6,6 +6,7 @@ * * @fantom_flags enableIntersectionObserverByDefault:true * @fantom_flags enableMutationObserverByDefault:true + * @fantom_flags enableResizeObserverByDefault:true * @flow strict-local * @format */ @@ -39,6 +40,26 @@ function expectDataCloneError(fn: () => unknown) { throw new Error('Expected function to throw DataCloneError, but it did not'); } +function createResizeObserverEntryForTest(): ResizeObserverEntry { + const ref = createRef(); + const root = Fantom.createRoot(); + Fantom.runTask(() => { + root.render(); + }); + + const target = ensureInstance(ref.current, HTMLElement); + const entries: Array = []; + Fantom.runTask(() => { + const observer = new ResizeObserver((newEntries, self) => { + entries.push(...newEntries); + self.disconnect(); + }); + observer.observe(target); + }); + + return ensureInstance(entries[0], ResizeObserverEntry); +} + describe('structuredClone', () => { it('clones primitive types', () => { expect(structuredClone(undefined)).toBe(undefined); @@ -435,6 +456,28 @@ describe('structuredClone', () => { expectDataCloneError(() => structuredClone(records[0])); }); + + it('does NOT clone ResizeObserver', () => { + expectDataCloneError(() => + structuredClone(new ResizeObserver(() => {})), + ); + }); + + it('does NOT clone ResizeObserverEntry', () => { + expectDataCloneError(() => + structuredClone(createResizeObserverEntryForTest()), + ); + }); + + it('does NOT clone ResizeObserverSize', () => { + const entry = createResizeObserverEntryForTest(); + const size = ensureInstance( + entry.contentBoxSize[0], + ResizeObserverSize, + ); + + expectDataCloneError(() => structuredClone(size)); + }); }); }); });