AX: Changing state of radio buttons causes VoiceOver to go busy for a short time.
authorcfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Jun 2015 00:40:29 +0000 (00:40 +0000)
committercfleizach@apple.com <cfleizach@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Jun 2015 00:40:29 +0000 (00:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=145933

Reviewed by Dean Jackson.

When radio buttons animate the new focus selection state, the thread activity looks a lot like short burst of
activity to draw, then wait on CoreAnimation to apply those changes.

Since those periods of activity during animation are so short, VoiceOver is not able to query for all the
attributes it needs, and gets stuck in the queue behind rendering.

The fix here is to turn off button state animations while VoiceOver is running.

* platform/mac/ThemeMac.mm:
(WebCore::updateStates):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@185573 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/mac/ThemeMac.mm

index 1b68a75..647667d 100644 (file)
@@ -1,3 +1,21 @@
+2015-06-15  Chris Fleizach  <cfleizach@apple.com>
+
+        AX: Changing state of radio buttons causes VoiceOver to go busy for a short time.
+        https://bugs.webkit.org/show_bug.cgi?id=145933
+
+        Reviewed by Dean Jackson.
+
+        When radio buttons animate the new focus selection state, the thread activity looks a lot like short burst of
+        activity to draw, then wait on CoreAnimation to apply those changes.
+
+        Since those periods of activity during animation are so short, VoiceOver is not able to query for all the
+        attributes it needs, and gets stuck in the queue behind rendering.
+
+        The fix here is to turn off button state animations while VoiceOver is running.
+
+        * platform/mac/ThemeMac.mm:
+        (WebCore::updateStates):
+
 2015-06-15  Zalan Bujtas  <zalan@apple.com>
 
         RootInlineBox::m_lineBreakObj becomes invalid when a child renderer is removed and the line does not get marked dirty.
index af4f768..7cbc60e 100644 (file)
@@ -26,6 +26,7 @@
 #import "config.h"
 #import "ThemeMac.h"
 
+#import "AXObjectCache.h"
 #import "BlockExceptions.h"
 #import "GraphicsContext.h"
 #import "LocalCurrentGraphicsContext.h"
@@ -194,6 +195,12 @@ static void updateStates(NSCell* cell, const ControlStates* controlStates, bool
 #if __MAC_OS_X_VERSION_MIN_REQUIRED < 101000
     UNUSED_PARAM(useAnimation);
 #endif
+
+    // The animated state cause this thread to start and stop repeatedly on CoreAnimation synchronize calls.
+    // This short burts of activity in between are not long enough for VoiceOver to retrieve accessibility attributes and makes the process appear unresponsive.
+    if (AXObjectCache::accessibilityEnhancedUserInterfaceEnabled())
+        useAnimation = false;
+    
     ControlStates::States states = controlStates->states();
 
     // Hover state is not supported by Aqua.