diff options
23 files changed, 307 insertions, 70 deletions
diff --git a/content/browser/accessibility/accessibility_mode_helper.cc b/content/browser/accessibility/accessibility_mode_helper.cc new file mode 100644 index 0000000..21eccaf --- /dev/null +++ b/content/browser/accessibility/accessibility_mode_helper.cc @@ -0,0 +1,55 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/accessibility/accessibility_mode_helper.h" + +#if defined(OS_WIN) +#include "base/command_line.h" +#include "base/win/windows_version.h" +#include "content/public/common/content_switches.h" +#endif + +namespace content { + +namespace { + +AccessibilityMode CastToAccessibilityMode(unsigned int int_mode) { + AccessibilityMode mode = static_cast<AccessibilityMode>(int_mode); + switch (mode) { + case AccessibilityModeOff: + case AccessibilityModeComplete: + case AccessibilityModeEditableTextOnly: + return mode; + } + DCHECK(false) << "Could not convert to AccessibilityMode: " << int_mode; + return AccessibilityModeOff; +} + +} // namespace + +AccessibilityMode AddAccessibilityModeTo(AccessibilityMode to, + AccessibilityMode mode_to_add) { + return CastToAccessibilityMode(to | mode_to_add); +} + +AccessibilityMode RemoveAccessibilityModeFrom( + AccessibilityMode from, + AccessibilityMode mode_to_remove) { + unsigned int new_mode = from ^ (mode_to_remove & from); +#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)) { + if ((from & AccessibilityModeEditableTextOnly) == + AccessibilityModeEditableTextOnly) + new_mode |= AccessibilityModeEditableTextOnly; + } +#endif // defined(OS_WIN) + + return CastToAccessibilityMode(new_mode); +} + +} // namespace content diff --git a/content/browser/accessibility/accessibility_mode_helper.h b/content/browser/accessibility/accessibility_mode_helper.h new file mode 100644 index 0000000..c12c206 --- /dev/null +++ b/content/browser/accessibility/accessibility_mode_helper.h @@ -0,0 +1,28 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_MODE_HELPER_H_ +#define CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_MODE_HELPER_H_ + +#include "content/common/content_export.h" +#include "content/common/view_message_enums.h" + +namespace content { + +// Adds the given accessibility mode constant to the given accessibility mode +// bitmap. +CONTENT_EXPORT AccessibilityMode + AddAccessibilityModeTo(AccessibilityMode to, AccessibilityMode mode_to_add); + +// Removes the given accessibility mode constant from the given accessibility +// mode bitmap, managing the bits that are shared with other modes such that a +// bit will only be turned off when all modes that depend on it have been +// removed. +CONTENT_EXPORT AccessibilityMode + RemoveAccessibilityModeFrom(AccessibilityMode to, + AccessibilityMode mode_to_remove); + +} // namespace content + +#endif // CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_MODE_HELPER_H_ diff --git a/content/browser/accessibility/accessibility_mode_helper_unittest.cc b/content/browser/accessibility/accessibility_mode_helper_unittest.cc new file mode 100644 index 0000000..5e23643 --- /dev/null +++ b/content/browser/accessibility/accessibility_mode_helper_unittest.cc @@ -0,0 +1,35 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/accessibility/accessibility_mode_helper.h" +#include "content/common/view_message_enums.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace content { + +TEST(AccessibilityModeHelperTest, TestNoOpRemove) { + EXPECT_EQ(AccessibilityModeComplete, + RemoveAccessibilityModeFrom(AccessibilityModeComplete, + AccessibilityModeOff)); +} + +TEST(AccessibilityModeHelperTest, TestRemoveSelf) { + EXPECT_EQ(AccessibilityModeOff, + RemoveAccessibilityModeFrom(AccessibilityModeComplete, + AccessibilityModeComplete)); + + EXPECT_EQ( + AccessibilityModeOff, + RemoveAccessibilityModeFrom(AccessibilityModeEditableTextOnly, + AccessibilityModeEditableTextOnly)); +} + +TEST(AccessibilityModeHelperTest, TestAddMode) { + EXPECT_EQ( + AccessibilityModeComplete, + AddAccessibilityModeTo(AccessibilityModeEditableTextOnly, + AccessibilityModeComplete)); +} + +} // namespace content diff --git a/content/browser/accessibility/accessibility_ui.cc b/content/browser/accessibility/accessibility_ui.cc index 2937838..a5ec30b 100644 --- a/content/browser/accessibility/accessibility_ui.cc +++ b/content/browser/accessibility/accessibility_ui.cc @@ -109,7 +109,7 @@ void SendTargetsData( scoped_ptr<base::DictionaryValue> data(new base::DictionaryValue()); data->Set("list", rvh_list.release()); - scoped_ptr<base::FundamentalValue> a11y_mode(new base::FundamentalValue( + scoped_ptr<base::FundamentalValue> a11y_mode(base::Value::CreateIntegerValue( BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode())); data->Set("global_a11y_mode", a11y_mode.release()); @@ -186,19 +186,19 @@ void AccessibilityUI::ToggleAccessibility(const base::ListValue* args) { return; AccessibilityMode mode = rwhi->accessibility_mode(); if (mode == AccessibilityModeOff) - rwhi->SetAccessibilityMode(AccessibilityModeComplete); + rwhi->AddAccessibilityMode(AccessibilityModeComplete); else - rwhi->SetAccessibilityMode(AccessibilityModeOff); + rwhi->ResetAccessibilityMode(); } void AccessibilityUI::ToggleGlobalAccessibility(const base::ListValue* args) { BrowserAccessibilityStateImpl* state = BrowserAccessibilityStateImpl::GetInstance(); AccessibilityMode mode = state->accessibility_mode(); - AccessibilityMode new_mode = (mode == AccessibilityModeOff - ? AccessibilityModeComplete - : AccessibilityModeOff); - state->SetAccessibilityMode(new_mode); + if (mode == AccessibilityModeOff) + state->EnableAccessibility(); + else + state->DisableAccessibility(); } void AccessibilityUI::RequestAccessibilityTree(const base::ListValue* args) { diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc index 3dee7d6..8b280be 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; - } - + ResetAccessibilityModeValue(); #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,58 @@ 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::ResetAccessibilityModeValue() { + 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; + } +} + +void BrowserAccessibilityStateImpl::ResetAccessibilityMode() { + ResetAccessibilityModeValue(); + + // 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 +145,36 @@ void BrowserAccessibilityStateImpl::UpdatePlatformSpecificHistograms() { } #endif -void BrowserAccessibilityStateImpl::SetAccessibilityMode( +void BrowserAccessibilityStateImpl::AddAccessibilityMode( + AccessibilityMode mode) { + if (CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableRendererAccessibility)) { + return; + } + + accessibility_mode_ = + content::AddAccessibilityModeTo(accessibility_mode_, mode); + + AddOrRemoveFromRenderWidgets(mode, true); +} + +void BrowserAccessibilityStateImpl::RemoveAccessibilityMode( AccessibilityMode mode) { - if (accessibility_mode_ == mode) + if (CommandLine::ForCurrentProcess()->HasSwitch( + switches::kForceRendererAccessibility) && + mode == AccessibilityModeComplete) { return; - accessibility_mode_ = mode; + } + + accessibility_mode_ = + content::RemoveAccessibilityModeFrom(accessibility_mode_, mode); + + 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 +186,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); } } diff --git a/content/browser/accessibility/browser_accessibility_state_impl.h b/content/browser/accessibility/browser_accessibility_state_impl.h index 3098341..2a1b1c6 100644 --- a/content/browser/accessibility/browser_accessibility_state_impl.h +++ b/content/browser/accessibility/browser_accessibility_state_impl.h @@ -42,6 +42,7 @@ class CONTENT_EXPORT BrowserAccessibilityStateImpl virtual void EnableAccessibility() OVERRIDE; virtual void DisableAccessibility() OVERRIDE; + virtual void ResetAccessibilityMode() OVERRIDE; virtual void OnScreenReaderDetected() OVERRIDE; virtual bool IsAccessibleBrowser() OVERRIDE; virtual void AddHistogramCallback(base::Closure callback) OVERRIDE; @@ -49,12 +50,23 @@ class CONTENT_EXPORT BrowserAccessibilityStateImpl virtual void UpdateHistogramsForTesting() OVERRIDE; AccessibilityMode accessibility_mode() const { return accessibility_mode_; }; - void SetAccessibilityMode(AccessibilityMode mode); + + // Adds the given accessibility mode to the current accessibility mode bitmap. + void AddAccessibilityMode(AccessibilityMode mode); + + // Removes the given accessibility mode from the current accessibility mode + // bitmap, managing the bits that are shared with other modes such that a + // bit will only be turned off when all modes that depend on it have been + // removed. + void RemoveAccessibilityMode(AccessibilityMode mode); private: friend class base::RefCountedThreadSafe<BrowserAccessibilityStateImpl>; friend struct DefaultSingletonTraits<BrowserAccessibilityStateImpl>; + // Resets accessibility_mode_ to the default value. + void ResetAccessibilityModeValue(); + // Called a short while after startup to allow time for the accessibility // state to be determined. Updates histograms with the current state. void UpdateHistograms(); @@ -64,6 +76,10 @@ class CONTENT_EXPORT BrowserAccessibilityStateImpl void UpdatePlatformSpecificHistograms(); + // Updates the accessibility mode of all render widgets, including swapped out + // ones. |add| specifies whether the mode should be added or removed. + void AddOrRemoveFromRenderWidgets(AccessibilityMode mode, bool add); + AccessibilityMode accessibility_mode_; std::vector<base::Closure> histogram_callbacks_; diff --git a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc index 41851b7..1ce26de 100644 --- a/content/browser/accessibility/cross_platform_accessibility_browsertest.cc +++ b/content/browser/accessibility/cross_platform_accessibility_browsertest.cc @@ -15,6 +15,7 @@ #include "content/test/content_browser_test.h" #include "content/test/content_browser_test_utils.h" #include "ui/accessibility/ax_node.h" +#include "ui/accessibility/ax_tree.h" #if defined(OS_WIN) #include <atlbase.h> diff --git a/content/browser/android/content_view_core_impl.cc b/content/browser/android/content_view_core_impl.cc index c0e7d0a..e981865 100644 --- a/content/browser/android/content_view_core_impl.cc +++ b/content/browser/android/content_view_core_impl.cc @@ -1776,11 +1776,11 @@ void ContentViewCoreImpl::SetAccessibilityEnabled(JNIEnv* env, jobject obj, accessibility_state->OnScreenReaderDetected(); // If it was actually enabled globally, enable it for this RenderWidget now. if (accessibility_state->IsAccessibleBrowser() && host_impl) - host_impl->SetAccessibilityMode(AccessibilityModeComplete); + host_impl->AddAccessibilityMode(AccessibilityModeComplete); } else { - accessibility_state->DisableAccessibility(); + accessibility_state->ResetAccessibilityMode(); if (host_impl) - host_impl->SetAccessibilityMode(AccessibilityModeOff); + host_impl->ResetAccessibilityMode(); } } diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index cdf95d5..d0879ab 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc @@ -1985,7 +1985,8 @@ void RenderViewHostImpl::NotifyMoveOrResizeStarted() { void RenderViewHostImpl::OnAccessibilityEvents( const std::vector<AccessibilityHostMsg_EventParams>& params) { - if (view_ && IsRVHStateActive(rvh_state_)) { + if ((accessibility_mode() & AccessibilityModeFlagPlatform) && view_ && + IsRVHStateActive(rvh_state_)) { view_->CreateBrowserAccessibilityManagerIfNeeded(); BrowserAccessibilityManager* manager = view_->GetBrowserAccessibilityManager(); diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 8c2fec2..2d8dbd0 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc @@ -24,6 +24,7 @@ #include "cc/base/switches.h" #include "cc/output/compositor_frame.h" #include "cc/output/compositor_frame_ack.h" +#include "content/browser/accessibility/accessibility_mode_helper.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/gpu/compositor_util.h" #include "content/browser/gpu/gpu_process_host.h" @@ -937,7 +938,7 @@ void RenderWidgetHostImpl::StopHangMonitorTimeout() { } void RenderWidgetHostImpl::EnableFullAccessibilityMode() { - SetAccessibilityMode(AccessibilityModeComplete); + AddAccessibilityMode(AccessibilityModeComplete); } void RenderWidgetHostImpl::ForwardMouseEvent(const WebMouseEvent& mouse_event) { @@ -2148,6 +2149,21 @@ void RenderWidgetHostImpl::SetEditCommandsForNextKeyEvent( Send(new InputMsg_SetEditCommandsForNextKeyEvent(GetRoutingID(), commands)); } +void RenderWidgetHostImpl::AddAccessibilityMode(AccessibilityMode mode) { + SetAccessibilityMode( + content::AddAccessibilityModeTo(accessibility_mode_, mode)); +} + +void RenderWidgetHostImpl::RemoveAccessibilityMode(AccessibilityMode mode) { + SetAccessibilityMode( + content::RemoveAccessibilityModeFrom(accessibility_mode_, mode)); +} + +void RenderWidgetHostImpl::ResetAccessibilityMode() { + SetAccessibilityMode( + BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()); +} + void RenderWidgetHostImpl::SetAccessibilityMode(AccessibilityMode mode) { accessibility_mode_ = mode; Send(new ViewMsg_SetAccessibilityMode(GetRoutingID(), mode)); diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index d449cd8..546e229 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h @@ -395,8 +395,18 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost, return accessibility_mode_; } - // Send a message to the renderer process to change the accessibility mode. - void SetAccessibilityMode(AccessibilityMode mode); + // Adds the given accessibility mode to the current accessibility mode bitmap. + void AddAccessibilityMode(AccessibilityMode mode); + + // Removes the given accessibility mode from the current accessibility mode + // bitmap, managing the bits that are shared with other modes such that a + // bit will only be turned off when all modes that depend on it have been + // removed. + void RemoveAccessibilityMode(AccessibilityMode mode); + + // Resets the accessibility mode to the default setting in + // BrowserStateAccessibilityImpl. + void ResetAccessibilityMode(); // Relay a request from assistive technology to perform the default action // on a given node. @@ -751,6 +761,9 @@ class CONTENT_EXPORT RenderWidgetHostImpl : virtual public RenderWidgetHost, void WindowSnapshotReachedScreen(int snapshot_id); + // Send a message to the renderer process to change the accessibility mode. + void SetAccessibilityMode(AccessibilityMode AccessibilityMode); + // Our delegate, which wants to know mainly about keyboard events. // It will remain non-NULL until DetachDelegate() is called. RenderWidgetHostDelegate* delegate_; diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 7c6605c..f9de143 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h @@ -342,7 +342,7 @@ class CONTENT_EXPORT RenderWidgetHostViewAura // Method to indicate if this instance is shutting down or closing. // TODO(shrikant): Discuss around to see if it makes sense to add this method // as part of RenderWidgetHostView. - bool IsClosing() const { return in_shutdown_; }; + bool IsClosing() const { return in_shutdown_; } protected: friend class RenderWidgetHostView; diff --git a/content/common/view_message_enums.h b/content/common/view_message_enums.h index 59a6da11..eb75de5 100644 --- a/content/common/view_message_enums.h +++ b/content/common/view_message_enums.h @@ -53,19 +53,29 @@ struct ViewMsg_Navigate_Type { }; }; +enum AccessibilityModeFlag { + // Accessibility updates are processed to create platform trees and events are + // passed to platform APIs in the browser. + AccessibilityModeFlagPlatform = 1 << 0, + + // Accessibility is on, and the full tree is computed. If this flag is off, + // only limited information about editable text nodes is sent to the browser + // process. Useful for implementing limited UIA on tablets. + AccessibilityModeFlagPlatformFullTree = 1 << 1, +}; + enum AccessibilityMode { - // WebKit accessibility is off and no accessibility information is - // sent from the renderer to the browser process. - AccessibilityModeOff, + // All accessibility is off. + AccessibilityModeOff = 0, - // WebKit accessibility is on, but only limited information about - // editable text nodes is sent to the browser process. Useful for - // implementing limited UIA on tablets. - AccessibilityModeEditableTextOnly, + // Renderer accessibility is on, and platform APIs are called. Note that this + // is different to AccessibilityModeAll, which is defined to be all bits on. + AccessibilityModeComplete = + AccessibilityModeFlagPlatform | AccessibilityModeFlagPlatformFullTree, - // WebKit accessibility is on, and the full accessibility tree is synced - // to the browser process. Useful for screen readers and magnifiers. - AccessibilityModeComplete, + // Renderer accessibility is on, platform APIs are called, but only limited + // information is available (see AccessibilityModeFlagEditableTextOnly). + AccessibilityModeEditableTextOnly = AccessibilityModeFlagPlatform }; #endif // CONTENT_COMMON_VIEW_MESSAGES_ENUMS_H_ diff --git a/content/content_browser.gypi b/content/content_browser.gypi index e48fbb2..ebf1680 100644 --- a/content/content_browser.gypi +++ b/content/content_browser.gypi @@ -205,6 +205,8 @@ 'public/browser/worker_service.h', 'public/browser/worker_service_observer.h', 'public/browser/zygote_host_linux.h', + 'browser/accessibility/accessibility_mode_helper.cc', + 'browser/accessibility/accessibility_mode_helper.h', 'browser/accessibility/accessibility_tree_formatter.cc', 'browser/accessibility/accessibility_tree_formatter.h', 'browser/accessibility/accessibility_tree_formatter_android.cc', diff --git a/content/content_tests.gypi b/content/content_tests.gypi index 6b6e17b..028b12b 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi @@ -336,6 +336,7 @@ '<(SHARED_INTERMEDIATE_DIR)', # Needed by key_systems_unittest.cc. ], 'sources': [ + 'browser/accessibility/accessibility_mode_helper_unittest.cc', 'browser/accessibility/browser_accessibility_mac_unittest.mm', 'browser/accessibility/browser_accessibility_manager_unittest.cc', 'browser/accessibility/browser_accessibility_win_unittest.cc', diff --git a/content/public/browser/browser_accessibility_state.h b/content/public/browser/browser_accessibility_state.h index 6f8d6d2..6c91e1b 100644 --- a/content/public/browser/browser_accessibility_state.h +++ b/content/public/browser/browser_accessibility_state.h @@ -24,9 +24,15 @@ class CONTENT_EXPORT BrowserAccessibilityState { // Enables accessibility for all running tabs. virtual void EnableAccessibility() = 0; - // Disables accessibility for all running tabs. + // Disables accessibility for all running tabs. (Only if accessibility is not + // required by a command line flag or by a platform requirement.) virtual void DisableAccessibility() = 0; + // Resets accessibility to the platform default for all running tabs. + // This is probably off, but may be on, if --force_renderer_accessibility is + // passed, or EditableTextOnly if this is Win7. + virtual void ResetAccessibilityMode() = 0; + // Called when screen reader client is detected. virtual void OnScreenReaderDetected() = 0; diff --git a/content/renderer/accessibility/renderer_accessibility_browsertest.cc b/content/renderer/accessibility/renderer_accessibility_browsertest.cc index ca5d7a1..a096382 100644 --- a/content/renderer/accessibility/renderer_accessibility_browsertest.cc +++ b/content/renderer/accessibility/renderer_accessibility_browsertest.cc @@ -67,7 +67,7 @@ class RendererAccessibilityTest : public RenderViewTest { sink_ = &render_thread_->sink(); } - void SetMode(AccessibilityMode mode) { + void SetMode(unsigned int mode) { view()->OnSetAccessibilityMode(mode); } diff --git a/content/renderer/accessibility/renderer_accessibility_complete.h b/content/renderer/accessibility/renderer_accessibility_complete.h index 82dc2b6..6e18a2a 100644 --- a/content/renderer/accessibility/renderer_accessibility_complete.h +++ b/content/renderer/accessibility/renderer_accessibility_complete.h @@ -131,9 +131,6 @@ class CONTENT_EXPORT RendererAccessibilityComplete // is fixed. gfx::Size last_scroll_offset_; - // The current accessibility mode. - AccessibilityMode mode_; - // Set if we are waiting for an accessibility event ack. bool ack_pending_; diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 4b97c6a..ef64a94 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -1042,7 +1042,7 @@ RenderViewImpl* RenderViewImpl::Create( bool hidden, int32 next_page_id, const blink::WebScreenInfo& screen_info, - AccessibilityMode accessibility_mode, + unsigned int accessibility_mode, bool allow_partial_swap) { DCHECK(routing_id != MSG_ROUTING_NONE); RenderViewImplParams params( @@ -4846,7 +4846,7 @@ void RenderViewImpl::OnSetBackground(const SkBitmap& background) { SetBackground(background); } -void RenderViewImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) { +void RenderViewImpl::OnSetAccessibilityMode(unsigned int new_mode) { if (accessibility_mode_ == new_mode) return; accessibility_mode_ = new_mode; @@ -4854,10 +4854,13 @@ void RenderViewImpl::OnSetAccessibilityMode(AccessibilityMode new_mode) { delete renderer_accessibility_; renderer_accessibility_ = NULL; } - if (accessibility_mode_ == AccessibilityModeComplete) + if (accessibility_mode_ == AccessibilityModeOff) + return; + + if (accessibility_mode_ & AccessibilityModeFlagPlatformFullTree) renderer_accessibility_ = new RendererAccessibilityComplete(this); #if !defined(OS_ANDROID) - else if (accessibility_mode_ == AccessibilityModeEditableTextOnly) + else renderer_accessibility_ = new RendererAccessibilityFocusOnly(this); #endif } @@ -5624,7 +5627,10 @@ bool RenderViewImpl::didTapMultipleTargets( const WebVector<WebRect>& target_rects) { // Never show a disambiguation popup when accessibility is enabled, // as this interferes with "touch exploration". - if (accessibility_mode_ == AccessibilityModeComplete) + bool matchesAccessibilityModeComplete = + (accessibility_mode_ & AccessibilityModeComplete) == + AccessibilityModeComplete; + if (matchesAccessibilityModeComplete) return false; gfx::Rect finger_rect( diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index a3eb957..479c526 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -192,7 +192,7 @@ class CONTENT_EXPORT RenderViewImpl bool hidden, int32 next_page_id, const blink::WebScreenInfo& screen_info, - AccessibilityMode accessibility_mode, + unsigned int accessibility_mode, bool allow_partial_swap); // Used by content_layouttest_support to hook into the creation of @@ -936,7 +936,7 @@ class CONTENT_EXPORT RenderViewImpl const base::string16& jscript, int id, bool notify_result); - void OnSetAccessibilityMode(AccessibilityMode new_mode); + void OnSetAccessibilityMode(unsigned int new_mode); void OnSetActive(bool active); void OnSetBackground(const SkBitmap& background); void OnSetCompositionFromExistingText( @@ -1330,7 +1330,7 @@ class CONTENT_EXPORT RenderViewImpl DevToolsAgent* devtools_agent_; // The current accessibility mode. - AccessibilityMode accessibility_mode_; + unsigned int accessibility_mode_; // Only valid if |accessibility_mode_| is anything other than // AccessibilityModeOff. diff --git a/content/renderer/render_view_impl_params.cc b/content/renderer/render_view_impl_params.cc index 0e77ea4..d16feab 100644 --- a/content/renderer/render_view_impl_params.cc +++ b/content/renderer/render_view_impl_params.cc @@ -20,7 +20,7 @@ RenderViewImplParams::RenderViewImplParams( bool hidden, int32 next_page_id, const blink::WebScreenInfo& screen_info, - AccessibilityMode accessibility_mode, + unsigned int accessibility_mode, bool allow_partial_swap) : opener_id(opener_id), renderer_prefs(renderer_prefs), diff --git a/content/renderer/render_view_impl_params.h b/content/renderer/render_view_impl_params.h index 5993f30..db2ab1c 100644 --- a/content/renderer/render_view_impl_params.h +++ b/content/renderer/render_view_impl_params.h @@ -36,7 +36,7 @@ struct CONTENT_EXPORT RenderViewImplParams { bool hidden, int32 next_page_id, const blink::WebScreenInfo& screen_info, - AccessibilityMode accessibility_mode, + unsigned int accessibility_mode, bool allow_partial_swap); ~RenderViewImplParams(); @@ -53,7 +53,7 @@ struct CONTENT_EXPORT RenderViewImplParams { bool hidden; int32 next_page_id; const blink::WebScreenInfo& screen_info; - AccessibilityMode accessibility_mode; + unsigned int accessibility_mode; bool allow_partial_swap; }; diff --git a/content/test/accessibility_browser_test_utils.cc b/content/test/accessibility_browser_test_utils.cc index 67e5811..f6cfbc9 100644 --- a/content/test/accessibility_browser_test_utils.cc +++ b/content/test/accessibility_browser_test_utils.cc @@ -9,6 +9,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "content/browser/renderer_host/render_view_host_impl.h" +#include "content/common/view_message_enums.h" #include "content/port/browser/render_widget_host_view_port.h" #include "content/public/browser/web_contents.h" #include "content/public/common/url_constants.h" @@ -32,7 +33,7 @@ AccessibilityNotificationWaiter::AccessibilityNotificationWaiter( view_host_->SetAccessibilityCallbackForTesting( base::Bind(&AccessibilityNotificationWaiter::OnAccessibilityEvent, weak_factory_.GetWeakPtr())); - view_host_->SetAccessibilityMode(accessibility_mode); + view_host_->AddAccessibilityMode(accessibility_mode); } AccessibilityNotificationWaiter::~AccessibilityNotificationWaiter() { |