Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_gtk.cc

Issue 9839069: Add initial GTK web accessibility framework. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/render_widget_host_view_gtk.h" 5 #include "content/browser/renderer_host/render_widget_host_view_gtk.h"
6 6
7 // If this gets included after the gtk headers, then a bunch of compiler 7 // If this gets included after the gtk headers, then a bunch of compiler
8 // errors happen because of a "#define Status int" in Xlib.h, which interacts 8 // errors happen because of a "#define Status int" in Xlib.h, which interacts
9 // badly with net::URLRequestStatus::Status. 9 // badly with net::URLRequestStatus::Status.
10 #include "content/common/view_messages.h" 10 #include "content/common/view_messages.h"
11 11
12 #include <cairo/cairo.h> 12 #include <cairo/cairo.h>
13 #include <gdk/gdk.h> 13 #include <gdk/gdk.h>
14 #include <gdk/gdkkeysyms.h> 14 #include <gdk/gdkkeysyms.h>
15 #include <gdk/gdkx.h> 15 #include <gdk/gdkx.h>
16 #include <gtk/gtk.h> 16 #include <gtk/gtk.h>
17 17
18 #include <algorithm> 18 #include <algorithm>
19 #include <string> 19 #include <string>
20 20
21 #include "base/command_line.h" 21 #include "base/command_line.h"
22 #include "base/debug/trace_event.h" 22 #include "base/debug/trace_event.h"
23 #include "base/logging.h" 23 #include "base/logging.h"
24 #include "base/message_loop.h" 24 #include "base/message_loop.h"
25 #include "base/metrics/histogram.h" 25 #include "base/metrics/histogram.h"
26 #include "base/string_number_conversions.h" 26 #include "base/string_number_conversions.h"
27 #include "base/time.h" 27 #include "base/time.h"
28 #include "base/utf_offset_string_conversions.h" 28 #include "base/utf_offset_string_conversions.h"
29 #include "base/utf_string_conversions.h" 29 #include "base/utf_string_conversions.h"
30 #include "content/browser/accessibility/browser_accessibility_gtk.h"
30 #include "content/browser/renderer_host/backing_store_gtk.h" 31 #include "content/browser/renderer_host/backing_store_gtk.h"
31 #include "content/browser/renderer_host/gtk_im_context_wrapper.h" 32 #include "content/browser/renderer_host/gtk_im_context_wrapper.h"
32 #include "content/browser/renderer_host/gtk_key_bindings_handler.h" 33 #include "content/browser/renderer_host/gtk_key_bindings_handler.h"
33 #include "content/browser/renderer_host/gtk_window_utils.h" 34 #include "content/browser/renderer_host/gtk_window_utils.h"
34 #include "content/browser/renderer_host/render_view_host_impl.h" 35 #include "content/browser/renderer_host/render_view_host_impl.h"
35 #include "content/common/gpu/gpu_messages.h" 36 #include "content/common/gpu/gpu_messages.h"
36 #include "content/public/browser/native_web_keyboard_event.h" 37 #include "content/public/browser/native_web_keyboard_event.h"
37 #include "content/public/browser/render_view_host_delegate.h" 38 #include "content/public/browser/render_view_host_delegate.h"
38 #include "content/public/common/content_switches.h" 39 #include "content/public/common/content_switches.h"
39 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" 40 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 using content::RenderWidgetHostImpl; 105 using content::RenderWidgetHostImpl;
105 using content::RenderWidgetHostView; 106 using content::RenderWidgetHostView;
106 using content::RenderWidgetHostViewPort; 107 using content::RenderWidgetHostViewPort;
107 using WebKit::WebInputEventFactory; 108 using WebKit::WebInputEventFactory;
108 using WebKit::WebMouseWheelEvent; 109 using WebKit::WebMouseWheelEvent;
109 110
110 // This class is a simple convenience wrapper for Gtk functions. It has only 111 // This class is a simple convenience wrapper for Gtk functions. It has only
111 // static methods. 112 // static methods.
112 class RenderWidgetHostViewGtkWidget { 113 class RenderWidgetHostViewGtkWidget {
113 public: 114 public:
115 static AtkObject* GetAccessible(void* userdata) {
116 return ((RenderWidgetHostViewGtk*)userdata)->GetAccessible();
Evan Stade 2012/05/02 00:03:30 C++ casts (static_cast)
dmazzoni 2012/05/02 06:27:33 Done.
117 }
118
114 static GtkWidget* CreateNewWidget(RenderWidgetHostViewGtk* host_view) { 119 static GtkWidget* CreateNewWidget(RenderWidgetHostViewGtk* host_view) {
115 GtkWidget* widget = gtk_preserve_window_new(); 120 GtkWidget* widget = gtk_preserve_window_new();
116 gtk_widget_set_name(widget, "chrome-render-widget-host-view"); 121 gtk_widget_set_name(widget, "chrome-render-widget-host-view");
117 // We manually double-buffer in Paint() because Paint() may or may not be 122 // We manually double-buffer in Paint() because Paint() may or may not be
118 // called in repsonse to an "expose-event" signal. 123 // called in repsonse to an "expose-event" signal.
119 gtk_widget_set_double_buffered(widget, FALSE); 124 gtk_widget_set_double_buffered(widget, FALSE);
120 gtk_widget_set_redraw_on_allocate(widget, FALSE); 125 gtk_widget_set_redraw_on_allocate(widget, FALSE);
121 gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &kBGColor); 126 gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &kBGColor);
122 // Allow the browser window to be resized freely. 127 // Allow the browser window to be resized freely.
123 gtk_widget_set_size_request(widget, 0, 0); 128 gtk_widget_set_size_request(widget, 0, 0);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 G_CALLBACK(OnCrossingEvent), host_view); 167 G_CALLBACK(OnCrossingEvent), host_view);
163 g_signal_connect(widget, "client-event", 168 g_signal_connect(widget, "client-event",
164 G_CALLBACK(OnClientEvent), host_view); 169 G_CALLBACK(OnClientEvent), host_view);
165 170
166 171
167 // Connect after so that we are called after the handler installed by the 172 // Connect after so that we are called after the handler installed by the
168 // WebContentsView which handles zoom events. 173 // WebContentsView which handles zoom events.
169 g_signal_connect_after(widget, "scroll-event", 174 g_signal_connect_after(widget, "scroll-event",
170 G_CALLBACK(OnMouseScrollEvent), host_view); 175 G_CALLBACK(OnMouseScrollEvent), host_view);
171 176
177 // Route calls to get_accessible to the view.
178 gtk_preserve_window_set_accessible_factory(
179 GTK_PRESERVE_WINDOW(widget), GetAccessible, (void *)host_view);
Evan Stade 2012/05/02 00:03:30 C++ casts or GTK casts. I'm surprised that this ca
dmazzoni 2012/05/02 06:27:33 You're right, it wasn't necessary.
180
172 return widget; 181 return widget;
173 } 182 }
174 183
175 private: 184 private:
176 static gboolean OnExposeEvent(GtkWidget* widget, 185 static gboolean OnExposeEvent(GtkWidget* widget,
177 GdkEventExpose* expose, 186 GdkEventExpose* expose,
178 RenderWidgetHostViewGtk* host_view) { 187 RenderWidgetHostViewGtk* host_view) {
179 if (host_view->is_hidden_) 188 if (host_view->is_hidden_)
180 return FALSE; 189 return FALSE;
181 const gfx::Rect damage_rect(expose->area); 190 const gfx::Rect damage_rect(expose->area);
(...skipping 1215 matching lines...) Expand 10 before | Expand all | Expand 10 after
1397 return new RenderWidgetHostViewGtk(widget); 1406 return new RenderWidgetHostViewGtk(widget);
1398 } 1407 }
1399 1408
1400 // static 1409 // static
1401 void content::RenderWidgetHostViewPort::GetDefaultScreenInfo( 1410 void content::RenderWidgetHostViewPort::GetDefaultScreenInfo(
1402 WebKit::WebScreenInfo* results) { 1411 WebKit::WebScreenInfo* results) {
1403 GdkWindow* gdk_window = 1412 GdkWindow* gdk_window =
1404 gdk_display_get_default_group(gdk_display_get_default()); 1413 gdk_display_get_default_group(gdk_display_get_default());
1405 content::GetScreenInfoFromNativeWindow(gdk_window, results); 1414 content::GetScreenInfoFromNativeWindow(gdk_window, results);
1406 } 1415 }
1416
1417 void RenderWidgetHostViewGtk::SetAccessibilityFocus(int acc_obj_id) {
1418 if (!host_)
1419 return;
1420
1421 host_->AccessibilitySetFocus(acc_obj_id);
1422 }
1423
1424 void RenderWidgetHostViewGtk::AccessibilityDoDefaultAction(int acc_obj_id) {
1425 if (!host_)
1426 return;
1427
1428 host_->AccessibilityDoDefaultAction(acc_obj_id);
1429 }
1430
1431 void RenderWidgetHostViewGtk::AccessibilityScrollToMakeVisible(
1432 int acc_obj_id, gfx::Rect subfocus) {
1433 if (!host_)
1434 return;
1435
1436 host_->AccessibilityScrollToMakeVisible(acc_obj_id, subfocus);
1437 }
1438
1439 void RenderWidgetHostViewGtk::AccessibilityScrollToPoint(
1440 int acc_obj_id, gfx::Point point) {
1441 if (!host_)
1442 return;
1443
1444 host_->AccessibilityScrollToPoint(acc_obj_id, point);
1445 }
1446
1447 void RenderWidgetHostViewGtk::AccessibilitySetTextSelection(
1448 int acc_obj_id, int start_offset, int end_offset) {
1449 if (!host_)
1450 return;
1451
1452 host_->AccessibilitySetTextSelection(acc_obj_id, start_offset, end_offset);
1453 }
1454
1455 void RenderWidgetHostViewGtk::OnAccessibilityNotifications(
1456 const std::vector<AccessibilityHostMsg_NotificationParams>& params) {
1457 if (!browser_accessibility_manager_.get()) {
1458 GtkWidget* parent = gtk_widget_get_parent(view_.get());
1459 browser_accessibility_manager_.reset(
1460 BrowserAccessibilityManager::CreateEmptyDocument(
1461 parent, static_cast<WebAccessibility::State>(0), this));
1462 }
1463 browser_accessibility_manager_->OnAccessibilityNotifications(params);
1464 }
1465
1466 AtkObject* RenderWidgetHostViewGtk::GetAccessible() {
1467 RenderWidgetHostImpl::From(GetRenderWidgetHost())
1468 ->SetAccessibilityMode(AccessibilityModeComplete);
Evan Stade 2012/05/02 00:03:30 -> on previous line
dmazzoni 2012/05/02 06:27:33 Done.
1469
1470 if (!browser_accessibility_manager_.get()) {
1471 GtkWidget* parent = gtk_widget_get_parent(view_.get());
1472 browser_accessibility_manager_.reset(
1473 BrowserAccessibilityManager::CreateEmptyDocument(
1474 parent, static_cast<WebAccessibility::State>(0), this));
1475 }
1476 BrowserAccessibilityGtk* root =
1477 browser_accessibility_manager_->GetRoot()->toBrowserAccessibilityGtk();
1478
1479 atk_object_set_role(root->GetAtkObject(), ATK_ROLE_HTML_CONTAINER);
1480 return root->GetAtkObject();
1481 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698