Skip to content

useResizeObserver not preventing Resize Observer errors in some situations #1924

@dgsousa

Description

@dgsousa

🐛 Bug Report

In some situations, spectrum components that use useResizeObserver throw errors such as
ResizeObserver loop limit exceeded
to be thrown in Chrome and
ResizeObserver loop completed with undelivered notifications.
in Firefox.

Generally these errors are benign and can be swallowed. However, Safari's CORS policy throws anonymous script errors and swallowing all script errors in Safari is a less than ideal solution.

🤔 Expected Behavior

useResizeObserver should not be causing Resize Observers to throw errors.

😯 Current Behavior

💁 Possible Solution

Resize Observers generally throw these errors to prevent infinite loops as detailed here:
https://stackoverflow.com/questions/49384120/resizeobserver-loop-limit-exceeded

But these errors are preventable using the approach detailed in this article:
https://blog.elantha.com/resizeobserver-loop-limit-exceeded/

🔦 Context

💻 Code Sample

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";

window.addEventListener('error', (err) => {
    console.log(err);
})

ReactDOM.render(<App />, document.getElementById("root"));
import React, {
  useEffect,
  useState,
} from 'react';
import {
  defaultTheme,
  Flex,
  View,
  Provider,
  Content,
  Text,
} from '@adobe/react-spectrum';
import {
  Tabs,
  Item,
} from '@react-spectrum/tabs';


export default function App() {
  const [
    widthUnder1100,
    setWidthUnder1100,
  ] = useState(window.innerWidth < 1100);


  useEffect(() => {
    const handleResize = () => {
      setWidthUnder1100(window.innerWidth < 1100);
    };
    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  const shrink = widthUnder1100;
  return (
    <Provider theme={ defaultTheme } colorScheme='light'>
      <Flex>
        <div
          data-id='collapse'
          style={ { width: shrink ? '200px' : 'auto' } }>
          <Tabs aria-label='Chat log collapse example'>
            <Item title='John Doe' key='item1'>
              <Content marginTop='size-250' marginStart='size-125'>
                <Text>1</Text>
              </Content>
            </Item>
            <Item title='Jane Doe' key='item2'>
              <Content marginTop='size-250' marginStart='size-125'>
                <Text>2</Text>
              </Content>
            </Item>
            <Item title='Joe Bloggs' key='item3'>
              <Content marginTop='size-250' marginStart='size-125'>
                <Text>3</Text>
              </Content>
            </Item>
          </Tabs>
        </div>
      </Flex>
    </Provider>
  );
}

🌍 Your Environment

Software Version(s)
react-spectrum 16
Browser Chrome / Firefox / Safari
Operating System MacOS

🧢 Your Company/Team

Adobe / Marketo

Marketo

🕷 Tracking Issue (optional)

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type
No fields configured for issues without a type.

Projects

Status

✅ Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions