From dfe44b58d5f5c3dda92e283eff05887e07eb2ba3 Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Tue, 11 Apr 2023 09:24:21 +0000 Subject: [PATCH] Bug 1819769 - don't dispatch a11y related events when there are no listeners, r=masayuki Differential Revision: https://phabricator.services.mozilla.com/D175016 --- dom/base/nsContentUtils.cpp | 3 +++ dom/base/nsContentUtils.h | 19 +++++++++++++++++++ dom/events/EventListenerManager.cpp | 6 ++++++ dom/html/HTMLInputElement.cpp | 6 ++++-- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp index e0458cc3e453..2d62488d0220 100644 --- a/dom/base/nsContentUtils.cpp +++ b/dom/base/nsContentUtils.cpp @@ -466,6 +466,9 @@ nsParser* nsContentUtils::sXMLFragmentParser = nullptr; nsIFragmentContentSink* nsContentUtils::sXMLFragmentSink = nullptr; bool nsContentUtils::sFragmentParsingActive = false; +bool nsContentUtils::sMayHaveFormCheckboxStateChangeListeners = false; +bool nsContentUtils::sMayHaveFormRadioStateChangeListeners = false; + mozilla::LazyLogModule nsContentUtils::gResistFingerprintingLog( "nsResistFingerprinting"); mozilla::LazyLogModule nsContentUtils::sDOMDumpLog("Dump"); diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h index fc0eb7adef33..6b517e2fb1a1 100644 --- a/dom/base/nsContentUtils.h +++ b/dom/base/nsContentUtils.h @@ -3373,6 +3373,22 @@ class nsContentUtils { */ static void RequestGeckoTaskBurst(); + static void SetMayHaveFormCheckboxStateChangeListeners() { + sMayHaveFormCheckboxStateChangeListeners = true; + } + + static bool MayHaveFormCheckboxStateChangeListeners() { + return sMayHaveFormCheckboxStateChangeListeners; + } + + static void SetMayHaveFormRadioStateChangeListeners() { + sMayHaveFormRadioStateChangeListeners = true; + } + + static bool MayHaveFormRadioStateChangeListeners() { + return sMayHaveFormRadioStateChangeListeners; + } + private: static bool InitializeEventTable(); @@ -3493,6 +3509,9 @@ class nsContentUtils { static int32_t sInnerOrOuterWindowCount; static uint32_t sInnerOrOuterWindowSerialCounter; + + static bool sMayHaveFormCheckboxStateChangeListeners; + static bool sMayHaveFormRadioStateChangeListeners; }; /* static */ inline ExtContentPolicyType diff --git a/dom/events/EventListenerManager.cpp b/dom/events/EventListenerManager.cpp index 92a779ed8e5c..6ad9577de765 100644 --- a/dom/events/EventListenerManager.cpp +++ b/dom/events/EventListenerManager.cpp @@ -472,6 +472,12 @@ void EventListenerManager::AddEventListenerInternal( window->SetHasTransitionEventListeners(); } break; + case eFormCheckboxStateChange: + nsContentUtils::SetMayHaveFormCheckboxStateChangeListeners(); + break; + case eFormRadioStateChange: + nsContentUtils::SetMayHaveFormRadioStateChangeListeners(); + break; default: // XXX Use NS_ASSERTION here to print resolvedEventMessage since // MOZ_ASSERT can take only string literal, not pointer to diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp index 3f7e20e43a9b..7d7d7a93b6d8 100644 --- a/dom/html/HTMLInputElement.cpp +++ b/dom/html/HTMLInputElement.cpp @@ -3728,8 +3728,10 @@ nsresult HTMLInputElement::PostHandleEvent(EventChainPostVisitor& aVisitor) { #ifdef ACCESSIBILITY // Fire an event to notify accessibility if (mType == FormControlType::InputCheckbox) { - FireEventForAccessibility(this, eFormCheckboxStateChange); - } else { + if (nsContentUtils::MayHaveFormCheckboxStateChangeListeners()) { + FireEventForAccessibility(this, eFormCheckboxStateChange); + } + } else if (nsContentUtils::MayHaveFormRadioStateChangeListeners()) { FireEventForAccessibility(this, eFormRadioStateChange); // Fire event for the previous selected radio. nsCOMPtr content = do_QueryInterface(aVisitor.mItemData);