diff options
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(); +} |