diff --git a/CHANGELOG.md b/CHANGELOG.md
index 29ab57c4c1..1a95f5bf67 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,11 @@ This change log adheres to standards from [Keep a CHANGELOG](https://keepachange
## Unreleased
+### Fixed
+* [`no-unknown-property`]: add `dialog` attributes ([#3436][] @ljharb)
+
+[#3436]: https://github.com/jsx-eslint/eslint-plugin-react/issues/3436
+
## [7.31.8] - 2022.09.08
### Fixed
diff --git a/lib/rules/no-unknown-property.js b/lib/rules/no-unknown-property.js
index af64a33469..925c306876 100644
--- a/lib/rules/no-unknown-property.js
+++ b/lib/rules/no-unknown-property.js
@@ -70,8 +70,10 @@ const ATTRIBUTE_TAGS_MAP = {
noModule: ['script'],
// Media events allowed only on audio and video tags, see https://github.com/facebook/react/blob/256aefbea1449869620fb26f6ec695536ab453f5/CHANGELOG.md#notable-enhancements
onAbort: ['audio', 'video'],
+ onCancel: ['dialog'],
onCanPlay: ['audio', 'video'],
onCanPlayThrough: ['audio', 'video'],
+ onClose: ['dialog'],
onDurationChange: ['audio', 'video'],
onEmptied: ['audio', 'video'],
onEncrypted: ['audio', 'video'],
@@ -104,6 +106,7 @@ const ATTRIBUTE_TAGS_MAP = {
poster: ['video'],
preload: ['audio', 'video'],
scrolling: ['iframe'],
+ returnValue: ['dialog'],
};
const SVGDOM_ATTRIBUTE_NAMES = {
diff --git a/tests/lib/rules/no-unknown-property.js b/tests/lib/rules/no-unknown-property.js
index 5fafd46a41..c8f62cc52a 100644
--- a/tests/lib/rules/no-unknown-property.js
+++ b/tests/lib/rules/no-unknown-property.js
@@ -128,6 +128,7 @@ ruleTester.run('no-unknown-property', rule, {
{ code: '