From 82f6f9885248ba9ece56af554fe8a087b74bdf02 Mon Sep 17 00:00:00 2001 From: dmazzoni Date: Tue, 21 Oct 2014 17:39:12 -0700 Subject: [PATCH] Disable accessibility when VoiceOver is turned off. (Depends on: https://codereview.chromium.org/606703003/) BUG=251382 Review URL: https://codereview.chromium.org/602133002 Cr-Commit-Position: refs/heads/master@{#300583} --- chrome/browser/chrome_browser_application_mac.mm | 11 ++++++++--- content/renderer/accessibility/renderer_accessibility.h | 5 +++++ .../accessibility/renderer_accessibility_complete.cc | 16 ++++++++++++++++ .../accessibility/renderer_accessibility_complete.h | 1 + content/renderer/render_frame_impl.cc | 5 +++++ 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/chrome/browser/chrome_browser_application_mac.mm b/chrome/browser/chrome_browser_application_mac.mm index 71c0efa190c1..e3a8ff283507 100644 --- a/chrome/browser/chrome_browser_application_mac.mm +++ b/chrome/browser/chrome_browser_application_mac.mm @@ -538,9 +538,14 @@ void SwizzleInit() { } - (void)accessibilitySetValue:(id)value forAttribute:(NSString*)attribute { - if ([attribute isEqualToString:@"AXEnhancedUserInterface"] && - [value intValue] == 1) { - content::BrowserAccessibilityState::GetInstance()->OnScreenReaderDetected(); + // This is an undocument attribute that's set when VoiceOver is turned on/off. + if ([attribute isEqualToString:@"AXEnhancedUserInterface"]) { + content::BrowserAccessibilityState* accessibility_state = + content::BrowserAccessibilityState::GetInstance(); + if ([value intValue] == 1) + accessibility_state->OnScreenReaderDetected(); + else + accessibility_state->DisableAccessibility(); } return [super accessibilitySetValue:value forAttribute:attribute]; } diff --git a/content/renderer/accessibility/renderer_accessibility.h b/content/renderer/accessibility/renderer_accessibility.h index 426c1a7091e3..5a9534cd7cfd 100644 --- a/content/renderer/accessibility/renderer_accessibility.h +++ b/content/renderer/accessibility/renderer_accessibility.h @@ -60,6 +60,11 @@ class CONTENT_EXPORT RendererAccessibility : public RenderFrameObserver { // testing. virtual RendererAccessibilityType GetType() = 0; + // This can be called before deleting a RendererAccessibility instance due + // to the accessibility mode changing, as opposed to during frame destruction + // (when there'd be no point). + virtual void DisableAccessibility() {} + protected: // Returns the main top-level document for this page, or NULL if there's // no view or frame. diff --git a/content/renderer/accessibility/renderer_accessibility_complete.cc b/content/renderer/accessibility/renderer_accessibility_complete.cc index e444e708f12b..a6cfa4dd1b63 100644 --- a/content/renderer/accessibility/renderer_accessibility_complete.cc +++ b/content/renderer/accessibility/renderer_accessibility_complete.cc @@ -98,6 +98,22 @@ void RendererAccessibilityComplete::FocusedNodeChanged(const WebNode& node) { } } +void RendererAccessibilityComplete::DisableAccessibility() { + RenderView* render_view = render_frame_->GetRenderView(); + if (!render_view) + return; + + WebView* web_view = render_view->GetWebView(); + if (!web_view) + return; + + WebSettings* settings = web_view->settings(); + if (!settings) + return; + + settings->setAccessibilityEnabled(false); +} + void RendererAccessibilityComplete::HandleWebAccessibilityEvent( const blink::WebAXObject& obj, blink::WebAXEvent event) { HandleAXEvent(obj, AXEventFromBlink(event)); diff --git a/content/renderer/accessibility/renderer_accessibility_complete.h b/content/renderer/accessibility/renderer_accessibility_complete.h index 96d1c6f4e86b..81b9dcb101b1 100644 --- a/content/renderer/accessibility/renderer_accessibility_complete.h +++ b/content/renderer/accessibility/renderer_accessibility_complete.h @@ -47,6 +47,7 @@ class CONTENT_EXPORT RendererAccessibilityComplete blink::WebAXEvent event) override; RendererAccessibilityType GetType() override; void FocusedNodeChanged(const blink::WebNode& node) override; + virtual void DisableAccessibility() override; void HandleAXEvent(const blink::WebAXObject& obj, ui::AXEvent event); diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 32705ca85bd2..769db2eb2891 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -1360,6 +1360,11 @@ void RenderFrameImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) { return; accessibility_mode_ = new_mode; if (renderer_accessibility_) { + // Note: this isn't called automatically by the destructor because + // there'd be no point in calling it in frame teardown, only if there's + // an accessibility mode change but the frame is persisting. + renderer_accessibility_->DisableAccessibility(); + delete renderer_accessibility_; renderer_accessibility_ = NULL; } -- 2.11.4.GIT