Chromium Code Reviews| Index: content/browser/accessibility/browser_accessibility_state_impl.cc |
| diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc |
| index 3dee7d62b33d46a055500af0e3ee6dd9d87508b0..5e3eef7fa09ea9abe5105b9d394ce151bc4097d0 100644 |
| --- a/content/browser/accessibility/browser_accessibility_state_impl.cc |
| +++ b/content/browser/accessibility/browser_accessibility_state_impl.cc |
| @@ -7,6 +7,7 @@ |
| #include "base/command_line.h" |
| #include "base/metrics/histogram.h" |
| #include "base/timer/timer.h" |
| +#include "content/browser/accessibility/accessibility_mode_helper.h" |
| #include "content/browser/renderer_host/render_widget_host_impl.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/render_process_host.h" |
| @@ -37,21 +38,7 @@ BrowserAccessibilityStateImpl* BrowserAccessibilityStateImpl::GetInstance() { |
| BrowserAccessibilityStateImpl::BrowserAccessibilityStateImpl() |
| : BrowserAccessibilityState(), |
| accessibility_mode_(AccessibilityModeOff) { |
| -#if defined(OS_WIN) |
| - // On Windows 8, always enable accessibility for editable text controls |
| - // so we can show the virtual keyboard when one is enabled. |
| - if (base::win::GetVersion() >= base::win::VERSION_WIN8 && |
| - !CommandLine::ForCurrentProcess()->HasSwitch( |
| - switches::kDisableRendererAccessibility)) { |
| - accessibility_mode_ = AccessibilityModeEditableTextOnly; |
| - } |
| -#endif // defined(OS_WIN) |
| - |
| - if (CommandLine::ForCurrentProcess()->HasSwitch( |
| - switches::kForceRendererAccessibility)) { |
| - accessibility_mode_ = AccessibilityModeComplete; |
| - } |
| - |
| + ResetAccessibilityMode(); |
| #if defined(OS_WIN) |
| // On Windows, UpdateHistograms calls some system functions with unknown |
| // runtime, so call it on the file thread to ensure there's no jank. |
| @@ -76,24 +63,54 @@ BrowserAccessibilityStateImpl::~BrowserAccessibilityStateImpl() { |
| } |
| void BrowserAccessibilityStateImpl::OnScreenReaderDetected() { |
| - if (CommandLine::ForCurrentProcess()->HasSwitch( |
| - switches::kDisableRendererAccessibility)) { |
| - return; |
| - } |
| - SetAccessibilityMode(AccessibilityModeComplete); |
| + AddAccessibilityMode(AccessibilityModeComplete); |
| } |
| void BrowserAccessibilityStateImpl::EnableAccessibility() { |
| // We may want to do something different with this later. |
| - SetAccessibilityMode(AccessibilityModeComplete); |
| + AddAccessibilityMode(AccessibilityModeComplete); |
| } |
| void BrowserAccessibilityStateImpl::DisableAccessibility() { |
| - SetAccessibilityMode(AccessibilityModeOff); |
| + ResetAccessibilityMode(); |
| +} |
| + |
| +void BrowserAccessibilityStateImpl::ResetAccessibilityMode() { |
| + accessibility_mode_ = AccessibilityModeOff; |
| +#if defined(OS_WIN) |
| + // On Windows 8, always enable accessibility for editable text controls |
| + // so we can show the virtual keyboard when one is enabled. |
| + if (base::win::GetVersion() >= base::win::VERSION_WIN8 && |
| + !CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kDisableRendererAccessibility)) { |
| + accessibility_mode_ = AccessibilityModeEditableTextOnly; |
| + } |
| +#endif // defined(OS_WIN) |
| + |
| + if (CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kForceRendererAccessibility)) { |
|
David Tseng
2014/02/06 19:13:44
We should remove one of
switches::kDisableRenderer
aboxhall
2014/02/06 21:04:12
Possibly; do you want me to do it in this CL?
|
| + accessibility_mode_ = AccessibilityModeComplete; |
| + } |
| + |
| + // Iterate over all RenderWidgetHosts, even swapped out ones in case |
| + // they become active again. |
| + scoped_ptr<RenderWidgetHostIterator> widgets( |
| + RenderWidgetHostImpl::GetAllRenderWidgetHosts()); |
| + while (RenderWidgetHost* widget = widgets->GetNextHost()) { |
| + // Ignore processes that don't have a connection, such as crashed tabs. |
| + if (!widget->GetProcess()->HasConnection()) |
| + continue; |
| + if (!widget->IsRenderView()) |
| + continue; |
| + |
| + RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| + rwhi->ResetAccessibilityMode(); |
| + } |
| } |
| bool BrowserAccessibilityStateImpl::IsAccessibleBrowser() { |
| - return (accessibility_mode_ == AccessibilityModeComplete); |
| + return ((accessibility_mode_ & AccessibilityModeComplete) == |
| + AccessibilityModeComplete); |
| } |
| void BrowserAccessibilityStateImpl::AddHistogramCallback( |
| @@ -124,12 +141,36 @@ void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() { |
| } |
| #endif |
| -void BrowserAccessibilityStateImpl::SetAccessibilityMode( |
| +void BrowserAccessibilityStateImpl::AddAccessibilityMode( |
| AccessibilityMode mode) { |
| - if (accessibility_mode_ == mode) |
| + if ((accessibility_mode_ & mode) == mode) |
| + return; |
| + |
| + if (CommandLine::ForCurrentProcess()->HasSwitch( |
| + switches::kDisableRendererAccessibility)) { |
| return; |
| - accessibility_mode_ = mode; |
| + } |
| + |
| + accessibility_mode_ = |
| + content::AddAccessibilityModeTo(accessibility_mode_, mode); |
| + |
| + AddOrRemoveFromRenderWidgets(mode, true); |
| +} |
| + |
| +void BrowserAccessibilityStateImpl::RemoveAccessibilityMode( |
| + AccessibilityMode mode) { |
| + if ((accessibility_mode_ ^ mode) == mode) |
| + return; |
| + |
| + accessibility_mode_ = |
| + content::RemoveAccessibilityModeFrom(accessibility_mode_, mode); |
|
David Tseng
2014/02/06 19:13:44
Seems like the command line switches related to fo
aboxhall
2014/02/06 21:04:12
Done.
|
| + |
| + AddOrRemoveFromRenderWidgets(mode, false); |
| +} |
| +void BrowserAccessibilityStateImpl::AddOrRemoveFromRenderWidgets( |
| + AccessibilityMode mode, |
| + bool add) { |
| // Iterate over all RenderWidgetHosts, even swapped out ones in case |
| // they become active again. |
| scoped_ptr<RenderWidgetHostIterator> widgets( |
| @@ -141,7 +182,11 @@ void BrowserAccessibilityStateImpl::SetAccessibilityMode( |
| if (!widget->IsRenderView()) |
| continue; |
| - RenderWidgetHostImpl::From(widget)->SetAccessibilityMode(mode); |
| + RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); |
| + if (add) |
| + rwhi->AddAccessibilityMode(mode); |
| + else |
| + rwhi->RemoveAccessibilityMode(mode); |
| } |
| } |