summaryrefslogtreecommitdiffstats
path: root/content/browser/renderer_host/render_widget_host_view_gtk.cc
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-02 23:00:58 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-05-02 23:00:58 +0000
commit85ef262960ec28dc6c8ae04f55cfa72a0bef8f61 (patch)
tree26e6c2a35cd9718b7a53fef85a6d34057ce2eb99 /content/browser/renderer_host/render_widget_host_view_gtk.cc
parent76dd2ae05197eb06e7136dfb4cc0256e14bec057 (diff)
downloadchromium_src-85ef262960ec28dc6c8ae04f55cfa72a0bef8f61.zip
chromium_src-85ef262960ec28dc6c8ae04f55cfa72a0bef8f61.tar.gz
chromium_src-85ef262960ec28dc6c8ae04f55cfa72a0bef8f61.tar.bz2
Add initial GTK web accessibility framework.
This enables Linux desktop assistive technology such as the Orca screen reader to access the web contents. Builds on the same accessibility stack used by Mac & Windows already. This change works with Orca now, but it's minimal: all that works is getting the correct feedback when you tab through focusable links and controls in a webpage. Future changes will add the rest of the support. BUG=24585 TEST=Run Chrome on desktop Linux with Orca turned on, tab through links. TBR=darin Review URL: http://codereview.chromium.org/9839069 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@135020 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host/render_widget_host_view_gtk.cc')
-rw-r--r--content/browser/renderer_host/render_widget_host_view_gtk.cc76
1 files changed, 76 insertions, 0 deletions
diff --git a/content/browser/renderer_host/render_widget_host_view_gtk.cc b/content/browser/renderer_host/render_widget_host_view_gtk.cc
index 15a0073..91c3ddf 100644
--- a/content/browser/renderer_host/render_widget_host_view_gtk.cc
+++ b/content/browser/renderer_host/render_widget_host_view_gtk.cc
@@ -27,6 +27,7 @@
#include "base/time.h"
#include "base/utf_offset_string_conversions.h"
#include "base/utf_string_conversions.h"
+#include "content/browser/accessibility/browser_accessibility_gtk.h"
#include "content/browser/renderer_host/backing_store_gtk.h"
#include "content/browser/renderer_host/gtk_im_context_wrapper.h"
#include "content/browser/renderer_host/gtk_key_bindings_handler.h"
@@ -111,6 +112,11 @@ using WebKit::WebMouseWheelEvent;
// static methods.
class RenderWidgetHostViewGtkWidget {
public:
+ static AtkObject* GetAccessible(void* userdata) {
+ return (static_cast<RenderWidgetHostViewGtk*>(userdata))->
+ GetAccessible();
+ }
+
static GtkWidget* CreateNewWidget(RenderWidgetHostViewGtk* host_view) {
GtkWidget* widget = gtk_preserve_window_new();
gtk_widget_set_name(widget, "chrome-render-widget-host-view");
@@ -169,6 +175,10 @@ class RenderWidgetHostViewGtkWidget {
g_signal_connect_after(widget, "scroll-event",
G_CALLBACK(OnMouseScrollEvent), host_view);
+ // Route calls to get_accessible to the view.
+ gtk_preserve_window_set_accessible_factory(
+ GTK_PRESERVE_WINDOW(widget), GetAccessible, host_view);
+
return widget;
}
@@ -1404,3 +1414,69 @@ void content::RenderWidgetHostViewPort::GetDefaultScreenInfo(
gdk_display_get_default_group(gdk_display_get_default());
content::GetScreenInfoFromNativeWindow(gdk_window, results);
}
+
+void RenderWidgetHostViewGtk::SetAccessibilityFocus(int acc_obj_id) {
+ if (!host_)
+ return;
+
+ host_->AccessibilitySetFocus(acc_obj_id);
+}
+
+void RenderWidgetHostViewGtk::AccessibilityDoDefaultAction(int acc_obj_id) {
+ if (!host_)
+ return;
+
+ host_->AccessibilityDoDefaultAction(acc_obj_id);
+}
+
+void RenderWidgetHostViewGtk::AccessibilityScrollToMakeVisible(
+ int acc_obj_id, gfx::Rect subfocus) {
+ if (!host_)
+ return;
+
+ host_->AccessibilityScrollToMakeVisible(acc_obj_id, subfocus);
+}
+
+void RenderWidgetHostViewGtk::AccessibilityScrollToPoint(
+ int acc_obj_id, gfx::Point point) {
+ if (!host_)
+ return;
+
+ host_->AccessibilityScrollToPoint(acc_obj_id, point);
+}
+
+void RenderWidgetHostViewGtk::AccessibilitySetTextSelection(
+ int acc_obj_id, int start_offset, int end_offset) {
+ if (!host_)
+ return;
+
+ host_->AccessibilitySetTextSelection(acc_obj_id, start_offset, end_offset);
+}
+
+void RenderWidgetHostViewGtk::OnAccessibilityNotifications(
+ const std::vector<AccessibilityHostMsg_NotificationParams>& params) {
+ if (!browser_accessibility_manager_.get()) {
+ GtkWidget* parent = gtk_widget_get_parent(view_.get());
+ browser_accessibility_manager_.reset(
+ BrowserAccessibilityManager::CreateEmptyDocument(
+ parent, static_cast<WebAccessibility::State>(0), this));
+ }
+ browser_accessibility_manager_->OnAccessibilityNotifications(params);
+}
+
+AtkObject* RenderWidgetHostViewGtk::GetAccessible() {
+ RenderWidgetHostImpl::From(GetRenderWidgetHost())->
+ SetAccessibilityMode(AccessibilityModeComplete);
+
+ if (!browser_accessibility_manager_.get()) {
+ GtkWidget* parent = gtk_widget_get_parent(view_.get());
+ browser_accessibility_manager_.reset(
+ BrowserAccessibilityManager::CreateEmptyDocument(
+ parent, static_cast<WebAccessibility::State>(0), this));
+ }
+ BrowserAccessibilityGtk* root =
+ browser_accessibility_manager_->GetRoot()->ToBrowserAccessibilityGtk();
+
+ atk_object_set_role(root->GetAtkObject(), ATK_ROLE_HTML_CONTAINER);
+ return root->GetAtkObject();
+}