[mac] Dynamically enable accessibility based on VoiceOver status
This commit is contained in:
parent
159e013ce5
commit
ddfd2bc4be
2 changed files with 39 additions and 10 deletions
|
@ -8,6 +8,8 @@
|
|||
#include "base/strings/sys_string_conversions.h"
|
||||
#include "atom/browser/browser.h"
|
||||
|
||||
#include "content/public/browser/browser_accessibility_state.h"
|
||||
|
||||
@implementation AtomApplication
|
||||
|
||||
+ (AtomApplication*)sharedApplication {
|
||||
|
@ -46,4 +48,23 @@
|
|||
atom::Browser::Get()->OpenURL(base::SysNSStringToUTF8(url));
|
||||
}
|
||||
|
||||
- (void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute {
|
||||
// undocumented attribute that VoiceOver happens to set while running.
|
||||
// Chromium uses this too, even though it's not exactly right.
|
||||
if ([attribute isEqualToString:@"AXEnhancedUserInterface"]) {
|
||||
[self updateAccessibilityEnabled:[value boolValue]];
|
||||
}
|
||||
return [super accessibilitySetValue:value forAttribute:attribute];
|
||||
}
|
||||
|
||||
- (void)updateAccessibilityEnabled:(BOOL)enabled {
|
||||
content::BrowserAccessibilityState *ax_state = content::BrowserAccessibilityState::GetInstance();
|
||||
|
||||
if (enabled) {
|
||||
ax_state->OnScreenReaderDetected();
|
||||
} else {
|
||||
ax_state->DisableAccessibility();
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include "content/public/browser/web_contents.h"
|
||||
#include "content/public/browser/render_view_host.h"
|
||||
#include "content/public/browser/render_widget_host_view.h"
|
||||
#include "content/public/browser/browser_accessibility_state.h"
|
||||
#include "native_mate/dictionary.h"
|
||||
#include "vendor/brightray/browser/inspectable_web_contents.h"
|
||||
#include "vendor/brightray/browser/inspectable_web_contents_view.h"
|
||||
|
@ -193,17 +194,24 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
|
|||
shell_->OpenDevTools(true);
|
||||
}
|
||||
|
||||
// Returns an empty array for AXChildren attribute, this will force the
|
||||
// SpeechSynthesisServer to use its classical way of speaking the selected text:
|
||||
// by invoking the "Command+C" for current application and then speak out
|
||||
// what's in the clipboard. Otherwise the "Text to Speech" would always speak
|
||||
// out window's title.
|
||||
// This behavior is taken by both FireFox and Chrome, see also FireFox's bug on
|
||||
// more of how SpeechSynthesisServer chose which text to read:
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=674612
|
||||
- (id)accessibilityAttributeValue:(NSString*)attribute {
|
||||
if ([attribute isEqualToString:@"AXChildren"])
|
||||
return [NSArray array];
|
||||
if ([attribute isEqualToString:@"AXChildren"]) {
|
||||
NSArray *children = [super accessibilityAttributeValue:attribute];
|
||||
|
||||
// Filter out objects that aren't the title bar buttons.
|
||||
// This has the effect of removing the window title, which VoiceOver already sees.
|
||||
// * when VoiceOver is disabled, this causes Cmd+C to be used for TTS but still
|
||||
// leaves the buttons available in the accessibility tree.
|
||||
// * when VoiceOver is enabled, the full accessibility tree is used.
|
||||
// Without removing the title and with VO disabled, the TTS would always read the
|
||||
// window title instead of using Cmd+C to get the selected text.
|
||||
NSPredicate *predicate = [NSPredicate predicateWithFormat:
|
||||
@"(self isKindOfClass: %@) OR (self.className == %@)",
|
||||
[NSButtonCell class], @"RenderWidgetHostViewCocoa"];
|
||||
|
||||
return [children filteredArrayUsingPredicate:predicate];
|
||||
}
|
||||
|
||||
return [super accessibilityAttributeValue:attribute];
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue