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.