Add an experiment for ablating SendPendingAccessibilityEvents
This patch adds a flag and supporting code for ablating
SendPendingAccessibilityEvents by 2x. If the flag is enabled and
SendPendingAccessibilityEvents would take 10ms, with this patch it will
take 20ms.
Design doc (google internal):
https://docs.google.com/document/d/1XhvOSI1Kbay7w8NSE6SJbLJLhb4GmmJW2N5YvSYlZzw/edit?usp=sharing&resourcekey=0-uM0KNw7_Q-EXcn2_bkFIuQ
Bug: 1338600
Change-Id: If1dde2603279a40a21705dd24e2f80ae01051fa5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3795849
Auto-Submit: Philip Rogers <pdr@chromium.org>
Reviewed-by: Chris Harrelson <chrishtr@chromium.org>
Reviewed-by: David Tseng <dtseng@chromium.org>
Commit-Queue: Philip Rogers <pdr@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1038357}
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index 72576bb..7b448f3 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -1302,6 +1302,13 @@
// If any interactive events come in, the batch will be processed immediately.
event_schedule_mode_ = EventScheduleMode::kDeferEvents;
+ if (features::IsAblateSendPendingAccessibilityEventsEnabled()) {
+ // Make the total time equal to 2x the original time.
+ auto new_end_time = base::Time::Now() + timer.Elapsed();
+ while (base::Time::Now() < new_end_time) {
+ // spin loop.
+ }
+ }
// Measure the amount of time spent in this function. Keep track of the
// maximum within a time interval so we can upload UKM.
diff --git a/ui/accessibility/accessibility_features.cc b/ui/accessibility/accessibility_features.cc
index f7d7a51..08048282 100644
--- a/ui/accessibility/accessibility_features.cc
+++ b/ui/accessibility/accessibility_features.cc
@@ -190,6 +190,14 @@
return base::FeatureList::IsEnabled(::features::kEnableAriaElementReflection);
}
+const base::Feature kAblateSendPendingAccessibilityEvents{
+ "AblateSendPendingAccessibilityEvents", base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsAblateSendPendingAccessibilityEventsEnabled() {
+ return base::FeatureList::IsEnabled(
+ ::features::kAblateSendPendingAccessibilityEvents);
+}
+
#if BUILDFLAG(IS_ANDROID)
const base::Feature kComputeAXMode{"ComputeAXMode",
base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ui/accessibility/accessibility_features.h b/ui/accessibility/accessibility_features.h
index 65bce922..7b4275a4 100644
--- a/ui/accessibility/accessibility_features.h
+++ b/ui/accessibility/accessibility_features.h
@@ -166,6 +166,12 @@
// Returns true if ARIA element reflection is enabled.
AX_BASE_EXPORT bool IsAriaElementReflectionEnabled();
+// Experiment to increase the cost of SendPendingAccessibilityEvents.
+AX_BASE_EXPORT extern const base::Feature kAblateSendPendingAccessibilityEvents;
+
+// Returns true if |kAblateSendPendingAccessibilityEvents| is enabled.
+AX_BASE_EXPORT bool IsAblateSendPendingAccessibilityEventsEnabled();
+
#if BUILDFLAG(IS_ANDROID)
// Compute the AXMode based on AccessibilityServiceInfo. If disabled,
// the AXMode is either entirely on or entirely off.