Index: content/browser/accessibility/browser_accessibility_manager_mac.mm |
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm |
index fba13beadabc3c5180c7ef2cce061a26f3f024d0..53d776bc287536c0c13f608cb3846c9b6f07ae56 100644 |
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm |
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm |
@@ -6,6 +6,7 @@ |
#import "base/logging.h" |
#import "content/browser/accessibility/browser_accessibility_cocoa.h" |
+#import "content/browser/accessibility/browser_accessibility_mac.h" |
#include "content/common/accessibility_messages.h" |
namespace content { |
@@ -25,7 +26,8 @@ BrowserAccessibilityManagerMac::BrowserAccessibilityManagerMac( |
BrowserAccessibilityDelegate* delegate, |
BrowserAccessibilityFactory* factory) |
: BrowserAccessibilityManager(initial_tree, delegate, factory), |
- parent_view_(parent_view) { |
+ parent_view_(parent_view), |
+ created_live_region_(false) { |
} |
// static |
@@ -154,4 +156,27 @@ void BrowserAccessibilityManagerMac::NotifyAccessibilityEvent( |
NSAccessibilityPostNotification(native_node, event_id); |
} |
+void BrowserAccessibilityManagerMac::OnNodeCreationFinished(ui::AXNode* node) { |
+ BrowserAccessibility* obj = GetFromAXNode(node); |
+ if (obj && obj->HasStringAttribute(ui::AX_ATTR_LIVE_STATUS)) |
+ created_live_region_ = true; |
+} |
+ |
+void BrowserAccessibilityManagerMac::OnTreeUpdateFinished() { |
+ if (!created_live_region_) |
+ return; |
+ |
+ // This code is to work around a bug in VoiceOver, where a new live |
+ // region that gets added is ignored. VoiceOver seems to only scan the |
+ // page for live regions once. By recreating the NSAccessibility |
+ // object for the root of the tree, we force VoiceOver to clear out its |
+ // internal state and find newly-added live regions this time. |
+ BrowserAccessibilityMac* root = |
+ static_cast<BrowserAccessibilityMac*>(GetRoot()); |
+ root->RecreateNativeObject(); |
+ NotifyAccessibilityEvent(ui::AX_EVENT_CHILDREN_CHANGED, root); |
+ |
+ created_live_region_ = false; |
+} |
+ |
} // namespace content |