diff options
author | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-02 23:00:58 +0000 |
---|---|---|
committer | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-02 23:00:58 +0000 |
commit | 85ef262960ec28dc6c8ae04f55cfa72a0bef8f61 (patch) | |
tree | 26e6c2a35cd9718b7a53fef85a6d34057ce2eb99 /content/browser/renderer_host/render_widget_host_view_gtk.cc | |
parent | 76dd2ae05197eb06e7136dfb4cc0256e14bec057 (diff) | |
download | chromium_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.cc | 76 |
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(); +} |