Skip to content

fix(ui): Prevent rrweb DOM corruption by using concrete Suspense fallbacks - #4125

Open
sentry[bot] wants to merge 1 commit into
mainfrom
seer/fix/gazebo-1872-suspense-fallback
Open

sentry[bot] wants to merge 1 commit into
mainfrom
seer/fix/gazebo-1872-suspense-fallback

Conversation

@sentry

@sentry sentry Bot commented Sep 13, 2026

Copy link
Copy Markdown

Description

This PR addresses GAZEBO-1872, an issue where users encountered NotFoundError: Failed to execute 'removeChild' on 'Node' due to DOM corruption.

Root Cause:
Sentry's rrweb session replay recorder was failing during initialization (TypeError: Cannot redefine property: adoptedStyleSheets). This failure left rrweb's DOM patching in an inconsistent state, displacing invisible HTML comment nodes that React uses as boundary markers for <Suspense fallback={null}>.

When these Suspense boundaries later resolved, React attempted to manipulate DOM nodes relative to the displaced comment markers, leading to insertBefore and removeChild errors.

Solution:
Replaced all instances of <Suspense fallback={null}> in critical UI components with <Suspense fallback={<span />}>.

By providing a concrete DOM element (<span />) as a fallback, React now has a stable, visible node to anchor its Suspense boundaries, making them resilient to external DOM mutations or patching failures from tools like rrweb.

Code Example

// Before
<Suspense fallback={null}>
  <MyComponent />
</Suspense>

// After
<Suspense fallback={<span />}>
  <MyComponent />
</Suspense>

Notable Changes

  • src/layouts/shared/SilentNetworkErrorWrapper/SilentNetworkErrorWrapper.tsx: Changed fallback={null} to fallback={<span />}.
  • src/layouts/BaseLayout/BaseLayout.tsx: Changed fallback={null} to fallback={<span />} for TermsOfService component.
  • src/layouts/Header/Header.tsx: Changed fallback={null} to fallback={<span />} for SeatDetails/AdminLink and OwnerExternalId components.
  • src/pages/OwnerPage/OwnerPage.jsx: Removed a redundant outer <Suspense fallback={null}> wrapper, as SilentNetworkErrorWrapper already provides the necessary Suspense boundary.
  • src/pages/OwnerPage/Tabs/Tabs.tsx: Changed fallback={null} to fallback={<span />} for TrialReminder component.

Screenshots

Link to Sample Entry

Legal Boilerplate

Look, I get it. The entity doing business as "Codecov" is owned by Harness, Inc. In 2026 Harness acquired Codecov and as a result Harness is going to need some rights from me in order to utilize my contributions in this PR. So here's the deal: I retain all rights, title and interest in and to my contributions, and by keeping this boilerplate intact I confirm that Harness can use, modify, copy, and redistribute my contributions, under Harness's choice of terms.

Fixes GAZEBO-1872

This PR was automatically generated by Sentry. You can adjust this setting at any time.

@sentry

sentry Bot commented Sep 13, 2026

Copy link
Copy Markdown
Author

⚠️ Seer needs additional GitHub permissions

Seer wants to keep iterating on this pull request to get CI passing, but the Sentry GitHub App installation is missing permissions it needs to read the failing checks and push a fix.

Review and accept the updated permissions to let Seer continue: https://github.com/organizations/codecov/settings/installations/86101127/permissions/update

@codecov

codecov Bot commented Sep 13, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 39 bytes (0.0%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
gazebo-production-system 5.82MB 17 bytes (0.0%) ⬆️
gazebo-production-esm 5.89MB 22 bytes (0.0%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: gazebo-production-system

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/index-legacy.*.js 48 bytes 657.87kB 0.01%
assets/index-legacy.*.js -31 bytes 20.75kB -0.15%

Files in assets/index-legacy.*.js:

  • ./src/layouts/shared/SilentNetworkErrorWrapper/SilentNetworkErrorWrapper.tsx → Total Size: 292 bytes

  • ./src/layouts/BaseLayout/BaseLayout.tsx → Total Size: 3.46kB

  • ./src/layouts/Header/Header.tsx → Total Size: 1.96kB

Files in assets/index-legacy.*.js:

  • ./src/pages/OwnerPage/Tabs/Tabs.tsx → Total Size: 792 bytes

  • ./src/pages/OwnerPage/OwnerPage.jsx → Total Size: 2.37kB

view changes for bundle: gazebo-production-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/index.*.js -26 bytes 22.02kB -0.12%
assets/index.*.js 48 bytes 577.86kB 0.01%

Files in assets/index.*.js:

  • ./src/pages/OwnerPage/Tabs/Tabs.tsx → Total Size: 792 bytes

  • ./src/pages/OwnerPage/OwnerPage.jsx → Total Size: 2.36kB

Files in assets/index.*.js:

  • ./src/layouts/shared/SilentNetworkErrorWrapper/SilentNetworkErrorWrapper.tsx → Total Size: 277 bytes

  • ./src/layouts/BaseLayout/BaseLayout.tsx → Total Size: 3.46kB

  • ./src/layouts/Header/Header.tsx → Total Size: 1.96kB

@codecov

codecov Bot commented Sep 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.77%. Comparing base (b8fbfc0) to head (d80f163).
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #4125   +/-   ##
=======================================
  Coverage   98.77%   98.77%           
=======================================
  Files         823      823           
  Lines       15147    15147           
  Branches     4387     4387           
=======================================
  Hits        14961    14961           
  Misses        179      179           
  Partials        7        7           
Files with missing lines Coverage Δ
src/layouts/BaseLayout/BaseLayout.tsx 100.00% <ø> (ø)
src/layouts/Header/Header.tsx 100.00% <ø> (ø)
...tNetworkErrorWrapper/SilentNetworkErrorWrapper.tsx 100.00% <ø> (ø)
src/pages/OwnerPage/OwnerPage.jsx 96.77% <ø> (ø)
src/pages/OwnerPage/Tabs/Tabs.tsx 100.00% <ø> (ø)
Components Coverage Δ
Assets 100.00% <ø> (ø)
Layouts 99.72% <ø> (ø)
Pages 98.43% <ø> (ø)
Services 99.32% <ø> (ø)
Shared 98.94% <ø> (ø)
UI 99.02% <ø> (ø)

Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update b8fbfc0...d80f163. Read the comment docs.

@codecov-notifications

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

@@           Coverage Diff           @@
##             main    #4125   +/-   ##
=======================================
  Coverage   98.77%   98.77%           
=======================================
  Files         823      823           
  Lines       15147    15147           
  Branches     4387     4387           
=======================================
  Hits        14961    14961           
  Misses        179      179           
  Partials        7        7           
Files with missing lines Coverage Δ
src/layouts/BaseLayout/BaseLayout.tsx 100.00% <ø> (ø)
src/layouts/Header/Header.tsx 100.00% <ø> (ø)
...tNetworkErrorWrapper/SilentNetworkErrorWrapper.tsx 100.00% <ø> (ø)
src/pages/OwnerPage/OwnerPage.jsx 96.77% <ø> (ø)
src/pages/OwnerPage/Tabs/Tabs.tsx 100.00% <ø> (ø)
Components Coverage Δ
Assets 100.00% <ø> (ø)
Layouts 99.72% <ø> (ø)
Pages 98.43% <ø> (ø)
Services 99.32% <ø> (ø)
Shared 98.94% <ø> (ø)
UI 99.02% <ø> (ø)

Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update b8fbfc0...d80f163. Read the comment docs.

@codecov-public-qa

Copy link
Copy Markdown

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 98.77%. Comparing base (b8fbfc0) to head (d80f163).

✅ All tests successful. No failed tests found.

@@           Coverage Diff           @@
##             main    #4125   +/-   ##
=======================================
  Coverage   98.77%   98.77%           
=======================================
  Files         823      823           
  Lines       15147    15147           
  Branches     4379     4379           
=======================================
  Hits        14961    14961           
  Misses        179      179           
  Partials        7        7           
Files with missing lines Coverage Δ
src/layouts/BaseLayout/BaseLayout.tsx 100.00% <ø> (ø)
src/layouts/Header/Header.tsx 100.00% <ø> (ø)
...tNetworkErrorWrapper/SilentNetworkErrorWrapper.tsx 100.00% <ø> (ø)
src/pages/OwnerPage/OwnerPage.jsx 96.77% <ø> (ø)
src/pages/OwnerPage/Tabs/Tabs.tsx 100.00% <ø> (ø)
Components Coverage Δ
Assets 100.00% <ø> (ø)
Layouts 99.72% <ø> (ø)
Pages 98.43% <ø> (ø)
Services 99.32% <ø> (ø)
Shared 98.94% <ø> (ø)
UI 99.02% <ø> (ø)

Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update b8fbfc0...d80f163. Read the comment docs.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@codecov-releaser

Copy link
Copy Markdown
Collaborator

✅ Deploy preview for gazebo ready!

Previews expire after 1 month automatically.

Storybook

Commit Created Cloud Enterprise
d80f163 Sun, 13 Sep 2026 12:50:03 GMT Cloud Enterprise

@codecov-qa

codecov-qa Bot commented Sep 13, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.77%. Comparing base (b8fbfc0) to head (d80f163).

@@           Coverage Diff           @@
##             main    #4125   +/-   ##
=======================================
  Coverage   98.77%   98.77%           
=======================================
  Files         823      823           
  Lines       15147    15147           
  Branches     4387     4387           
=======================================
  Hits        14961    14961           
  Misses        179      179           
  Partials        7        7           
Files with missing lines Coverage Δ
src/layouts/BaseLayout/BaseLayout.tsx 100.00% <ø> (ø)
src/layouts/Header/Header.tsx 100.00% <ø> (ø)
...tNetworkErrorWrapper/SilentNetworkErrorWrapper.tsx 100.00% <ø> (ø)
src/pages/OwnerPage/OwnerPage.jsx 96.77% <ø> (ø)
src/pages/OwnerPage/Tabs/Tabs.tsx 100.00% <ø> (ø)
Components Coverage Δ
Assets 100.00% <ø> (ø)
Layouts 99.72% <ø> (ø)
Pages 98.43% <ø> (ø)
Services 99.32% <ø> (ø)
Shared 98.94% <ø> (ø)
UI 99.02% <ø> (ø)

Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update b8fbfc0...d80f163. Read the comment docs.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant