Skip to content

[Bug]: Navigating between views in People Tab freezes Outlook. Infinite overflow re-measure loop in contact-list row "+N more" menus #36601

Description

Component

Overflow

Package version

9.74.4

React version

18.3.1

Environment

System:
  OS: macOS 26.6.1
  CPU: (12) arm64 Apple M3 Pro
Browsers:
  Edge: 151.0.4129.93
  Safari: 26.6
npmPackages:
  @fluentui/react-components: 9.74.4
  @fluentui/priority-overflow: 9.4.1 (transitive)
  @fluentui/react-overflow: 9.9.1 (transitive)
  react: 18.3.1
  react-dom: 18.3.1
  @types/react: 18.x
  @types/react-dom: 18.x
Repro host: StackBlitz (WebContainer, in-browser)

Current Behavior

We use Fluent v9 <Overflow> for the actions/metadata in contact-list rows: a "+N more" menu built with useOverflowMenu that mounts only when items overflow. In the app this intermittently pegs the CPU and freezes the whole tab. The visible trigger is navigating between views, but the underlying cause is an unbounded re-measure loop in the overflow manager.

Minimal reproduction: a short list of <OverflowItem>s in a fixed-width container with a conditionally-mounted "+N more" menu. At a container width near the boundary where the last item flips between fitting and not fitting, the overflow manager never converges. In the StackBlitz the on-screen "Renders so far" counter climbs continuously with no user interaction and never stops, showing the loop never settles even at rest.

What appears to happen:

Performance trace of one ~7.5s freeze (attached):

  • ~17,700 overflow measurements, ~12,600 forced layouts, ~13,300 removeChild
  • DOM nodes 8.5k -> 37.5k, event listeners 51k -> 78k, JS heap 160 -> 470 MB
  • 0 frames painted during the freeze (GC was only ~63 ms, so this is not GC pressure)
  • Hottest leaf is getElementAxisSize (synchronous offsetWidth/offsetHeight reads) at ~26% self-time, called from processOverflowItems in priority-overflow's overflowManager.

Regression range: this path appears to originate in @fluentui/react-overflow@9.9.0 / @fluentui/priority-overflow@9.4.0 (PRs #36263 and #36264). #36401 (react-overflow 9.9.1 / priority-overflow 9.4.1) fixed the unmount/teardown notification path only, so this mounted-oscillation path still reproduces. This is likely related to the still-open #36584 (Teams web), but that report is the unmount-during-navigation path and has no repro; this issue is the mounted boundary-width oscillation and includes a minimal repro.

Expected Behavior

Overflow measurement should converge after a bounded number of passes. At a boundary width the visible/overflow split should settle to a stable state (showing "+N more" or not), not oscillate forever. Mounting/unmounting the overflow menu should not be able to drive an unbounded measure -> render loop, and the component should never be able to freeze the host app. A per-frame cap (or hysteresis) on re-measure passes would bound it.

Reproduction

https://k5fbgvri.stackblitz.io

Steps to reproduce

  1. Open the StackBlitz reproduction.
  2. Watch the "Renders so far" counter. At the default container width it climbs continuously on its own with no user interaction and never stops. The overflow manager re-measures and re-renders in an unbroken loop instead of settling.
  3. Optional: slowly resize the container width. The counter keeps climbing across widths; there is no width at which it converges to a stable render count.

Are you reporting an Accessibility issue?

None

Suggested severity

Urgent - No workaround and Products/sites are affected

Products/sites affected

Outlook - People tab (contact list rows)

Are you willing to submit a PR to fix?

no

Validations

  • Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
  • The provided reproduction is a minimal reproducible example of the bug.

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions