summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/accessibility/accessibility_mode_helper.cc55
-rw-r--r--content/browser/accessibility/accessibility_mode_helper.h28
-rw-r--r--content/browser/accessibility/accessibility_mode_helper_unittest.cc35
-rw-r--r--content/browser/accessibility/accessibility_ui.cc14
-rw-r--r--content/browser/accessibility/browser_accessibility_state_impl.cc103
-rw-r--r--content/browser/accessibility/browser_accessibility_state_impl.h18
-rw-r--r--content/browser/accessibility/cross_platform_accessibility_browsertest.cc1
-rw-r--r--content/browser/android/content_view_core_impl.cc6
-rw-r--r--content/browser/renderer_host/render_view_host_impl.cc3
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.cc18
-rw-r--r--content/browser/renderer_host/render_widget_host_impl.h17
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura.h2
-rw-r--r--content/common/view_message_enums.h30
-rw-r--r--content/content_browser.gypi2
-rw-r--r--content/content_tests.gypi1
-rw-r--r--content/public/browser/browser_accessibility_state.h8
-rw-r--r--content/renderer/accessibility/renderer_accessibility_browsertest.cc2
-rw-r--r--content/renderer/accessibility/renderer_accessibility_complete.h3
-rw-r--r--content/renderer/render_view_impl.cc16
-rw-r--r--content/renderer/render_view_impl.h6
-rw-r--r--content/renderer/render_view_impl_params.cc2
-rw-r--r--content/renderer/render_view_impl_params.h4
-rw-r--r--content/test/accessibility_browser_test_utils.cc3
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() {