Bug 1819769 - don't dispatch a11y related events when there are no listeners, r=masayuki

Differential Revision: https://phabricator.services.mozilla.com/D175016
This commit is contained in:
Olli Pettay 2023-04-11 09:24:21 +00:00
Родитель 25a47ac627
Коммит dfe44b58d5
4 изменённых файлов: 32 добавлений и 2 удалений

Просмотреть файл

@ -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");

Просмотреть файл

@ -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

Просмотреть файл

@ -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

Просмотреть файл

@ -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<nsIContent> content = do_QueryInterface(aVisitor.mItemData);