diff --git a/packages/react-dom/src/__tests__/ReactDOMEventListener-test.js b/packages/react-dom/src/__tests__/ReactDOMEventListener-test.js
index 26ee3498f1f9..a1cd76874beb 100644
--- a/packages/react-dom/src/__tests__/ReactDOMEventListener-test.js
+++ b/packages/react-dom/src/__tests__/ReactDOMEventListener-test.js
@@ -446,4 +446,31 @@ describe('ReactDOMEventListener', () => {
document.body.removeChild(container);
}
});
+
+ it('should dispatch load for embed elements', () => {
+ const container = document.createElement('div');
+ document.body.appendChild(container);
+
+ try {
+ const ref = React.createRef();
+ const handleLoad = jest.fn();
+
+ ReactDOM.render(
+
+
+
,
+ container,
+ );
+
+ ref.current.dispatchEvent(
+ new ProgressEvent('load', {
+ bubbles: false,
+ }),
+ );
+
+ expect(handleLoad).toHaveBeenCalledTimes(1);
+ } finally {
+ document.body.removeChild(container);
+ }
+ });
});
diff --git a/packages/react-dom/src/client/ReactDOMComponent.js b/packages/react-dom/src/client/ReactDOMComponent.js
index f53db133c79e..33886140fd5c 100644
--- a/packages/react-dom/src/client/ReactDOMComponent.js
+++ b/packages/react-dom/src/client/ReactDOMComponent.js
@@ -522,6 +522,7 @@ export function setInitialProperties(
switch (tag) {
case 'iframe':
case 'object':
+ case 'embed':
trapBubbledEvent(TOP_LOAD, domElement);
props = rawProps;
break;
@@ -916,6 +917,7 @@ export function diffHydratedProperties(
switch (tag) {
case 'iframe':
case 'object':
+ case 'embed':
trapBubbledEvent(TOP_LOAD, domElement);
break;
case 'video':