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

Side by Side Diff: content/browser/accessibility/browser_accessibility_auralinux.cc

Issue 1258013002: Implement ATK Action & Document interface for WebContent Accessibility. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 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/accessibility/browser_accessibility_auralinux.h" 5 #include "content/browser/accessibility/browser_accessibility_auralinux.h"
6 6
7 #include "base/strings/utf_string_conversions.h" 7 #include "base/strings/utf_string_conversions.h"
8 #include "content/browser/accessibility/browser_accessibility_manager_auralinux. h" 8 #include "content/browser/accessibility/browser_accessibility_manager_auralinux. h"
9 #include "content/common/accessibility_messages.h" 9 #include "content/common/accessibility_messages.h"
10 10
11 namespace content { 11 namespace content {
12 12
13 static gpointer browser_accessibility_parent_class = NULL; 13 static gpointer browser_accessibility_parent_class = NULL;
14 14
15 static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux( 15 static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux(
16 BrowserAccessibilityAtk* atk_object) { 16 BrowserAccessibilityAtk* atk_object) {
17 if (!atk_object) 17 if (!atk_object)
18 return NULL; 18 return NULL;
19 19
20 return atk_object->m_object; 20 return atk_object->m_object;
21 } 21 }
22 22
23 // 23 //
24 // AtkAction interface.
25 //
26
27 static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux(
28 AtkAction* atk_action) {
29 if (!IS_BROWSER_ACCESSIBILITY(atk_action))
30 return NULL;
31
32 return ToBrowserAccessibilityAuraLinux(BROWSER_ACCESSIBILITY(atk_action));
33 }
34
35 static gboolean browser_accessibility_do_action(AtkAction* atk_action,
36 gint index) {
37 g_return_val_if_fail(ATK_IS_ACTION(atk_action), FALSE);
38 g_return_val_if_fail(!index, FALSE);
39
40 BrowserAccessibilityAuraLinux* obj =
41 ToBrowserAccessibilityAuraLinux(atk_action);
42 if (!obj)
43 return FALSE;
44
45 obj->manager()->DoDefaultAction(*obj);
46
47 return TRUE;
48 }
49
50 static gint browser_accessibility_get_n_actions(AtkAction* atk_action) {
51 g_return_val_if_fail(ATK_IS_ACTION(atk_action), 0);
52
53 BrowserAccessibilityAuraLinux* obj =
54 ToBrowserAccessibilityAuraLinux(atk_action);
55 if (!obj)
56 return 0;
57
58 return 1;
59 }
60
61 static const gchar* browser_accessibility_get_description(AtkAction* atk_action,
dmazzoni 2015/07/27 18:09:04 This function is to return a description of the *a
62 gint) {
63 g_return_val_if_fail(ATK_IS_ACTION(atk_action), 0);
64 BrowserAccessibilityAuraLinux* obj =
65 ToBrowserAccessibilityAuraLinux(atk_action);
66 if (!obj)
67 return 0;
68
69 return obj->GetStringAttribute(ui::AX_ATTR_DESCRIPTION).c_str();
70 }
71
72 static const gchar* browser_accessibility_get_name(AtkAction* atk_action,
73 gint index) {
74 g_return_val_if_fail(ATK_IS_ACTION(atk_action), 0);
75 g_return_val_if_fail(!index, 0);
76 BrowserAccessibilityAuraLinux* obj =
77 ToBrowserAccessibilityAuraLinux(atk_action);
78 if (!obj)
79 return 0;
80
81 return obj->GetStringAttribute(ui::AX_ATTR_ACTION).c_str();
82 }
83
84 static const gchar* browser_accessibility_get_keybinding(AtkAction* atk_action,
85 gint index) {
86 g_return_val_if_fail(ATK_IS_ACTION(atk_action), 0);
87 g_return_val_if_fail(!index, 0);
88 BrowserAccessibilityAuraLinux* obj =
89 ToBrowserAccessibilityAuraLinux(atk_action);
90 if (!obj)
91 return 0;
92
93 return obj->GetStringAttribute(ui::AX_ATTR_ACCESS_KEY).c_str();
94 }
95
96 static void ActionInterfaceInit(AtkActionIface* iface) {
97 iface->do_action = browser_accessibility_do_action;
98 iface->get_n_actions = browser_accessibility_get_n_actions;
99 iface->get_description = browser_accessibility_get_description;
100 iface->get_name = browser_accessibility_get_name;
101 iface->get_keybinding = browser_accessibility_get_keybinding;
102 }
103
104 static const GInterfaceInfo ActionInfo = {
105 reinterpret_cast<GInterfaceInitFunc>(ActionInterfaceInit), 0, 0};
106
107 //
24 // AtkComponent interface. 108 // AtkComponent interface.
25 // 109 //
26 110
27 static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux( 111 static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux(
28 AtkComponent* atk_component) { 112 AtkComponent* atk_component) {
29 if (!IS_BROWSER_ACCESSIBILITY(atk_component)) 113 if (!IS_BROWSER_ACCESSIBILITY(atk_component))
30 return NULL; 114 return NULL;
31 115
32 return ToBrowserAccessibilityAuraLinux(BROWSER_ACCESSIBILITY(atk_component)); 116 return ToBrowserAccessibilityAuraLinux(BROWSER_ACCESSIBILITY(atk_component));
33 } 117 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 iface->get_extents = browser_accessibility_get_extents; 183 iface->get_extents = browser_accessibility_get_extents;
100 iface->grab_focus = browser_accessibility_grab_focus; 184 iface->grab_focus = browser_accessibility_grab_focus;
101 } 185 }
102 186
103 static const GInterfaceInfo ComponentInfo = { 187 static const GInterfaceInfo ComponentInfo = {
104 reinterpret_cast<GInterfaceInitFunc>(ComponentInterfaceInit), 188 reinterpret_cast<GInterfaceInitFunc>(ComponentInterfaceInit),
105 0, 189 0,
106 0}; 190 0};
107 191
108 // 192 //
193 // AtkDocument interface.
194 //
195
196 static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux(
197 AtkDocument* atk_doc) {
198 if (!IS_BROWSER_ACCESSIBILITY(atk_doc))
199 return NULL;
200
201 return ToBrowserAccessibilityAuraLinux(BROWSER_ACCESSIBILITY(atk_doc));
202 }
203
204 static const gchar* GetDocumentAttributeValue(
205 BrowserAccessibilityAuraLinux* obj,
206 const gchar* attribute) {
207 if (!g_ascii_strcasecmp(attribute, "DocType"))
208 return obj->GetStringAttribute(ui::AX_ATTR_DOC_DOCTYPE).c_str();
209 else if (!g_ascii_strcasecmp(attribute, "MimeType"))
210 return obj->GetStringAttribute(ui::AX_ATTR_DOC_MIMETYPE).c_str();
211 else if (!g_ascii_strcasecmp(attribute, "Title"))
212 return obj->GetStringAttribute(ui::AX_ATTR_DOC_TITLE).c_str();
213 else if (!g_ascii_strcasecmp(attribute, "URI"))
214 return obj->GetStringAttribute(ui::AX_ATTR_DOC_URL).c_str();
215
216 return 0;
217 }
218
219 AtkAttributeSet* SetAtkAttributeSet(AtkAttributeSet* attributeSet,
dmazzoni 2015/07/27 18:09:04 nit: attributeSet -> attribute_set
220 const char* name,
221 const char* value) {
222 AtkAttribute* attribute =
223 static_cast<AtkAttribute*>(g_malloc(sizeof(AtkAttribute)));
224 attribute->name = g_strdup(name);
225 attribute->value = g_strdup(value);
226 attributeSet = g_slist_prepend(attributeSet, attribute);
227 return attributeSet;
228 }
229
230 static const gchar* browser_accessibility_get_attribute_value(
231 AtkDocument* atk_doc,
232 const gchar* attribute) {
233 g_return_val_if_fail(ATK_IS_DOCUMENT(atk_doc), 0);
234 BrowserAccessibilityAuraLinux* obj = ToBrowserAccessibilityAuraLinux(atk_doc);
235 if (!obj)
236 return 0;
237
238 return GetDocumentAttributeValue(obj, attribute);
239 }
240
241 static AtkAttributeSet* browser_accessibility_get_attributes(
242 AtkDocument* atk_doc) {
243 g_return_val_if_fail(ATK_IS_DOCUMENT(atk_doc), 0);
244 BrowserAccessibilityAuraLinux* obj = ToBrowserAccessibilityAuraLinux(atk_doc);
245 if (!obj)
246 return 0;
247
248 AtkAttributeSet* attributeSet = 0;
249 const gchar* doc_attributes[] = {"DocType", "MimeType", "Title", "URI"};
250 const gchar* value = 0;
251
252 for (unsigned i = 0; i < G_N_ELEMENTS(doc_attributes); i++) {
253 value = GetDocumentAttributeValue(obj, doc_attributes[i]);
254 if (value)
255 attributeSet = SetAtkAttributeSet(attributeSet, doc_attributes[i], value);
256 }
257
258 return attributeSet;
259 }
260
261 static void DocumentInterfaceInit(AtkDocumentIface* iface) {
262 iface->get_document_attribute_value =
263 browser_accessibility_get_attribute_value;
264 iface->get_document_attributes = browser_accessibility_get_attributes;
265 }
266
267 static const GInterfaceInfo DocumentInfo = {
268 reinterpret_cast<GInterfaceInitFunc>(DocumentInterfaceInit), 0, 0};
269
270 //
109 // AtkValue interface. 271 // AtkValue interface.
110 // 272 //
111 273
112 static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux( 274 static BrowserAccessibilityAuraLinux* ToBrowserAccessibilityAuraLinux(
113 AtkValue* atk_object) { 275 AtkValue* atk_object) {
114 if (!IS_BROWSER_ACCESSIBILITY(atk_object)) 276 if (!IS_BROWSER_ACCESSIBILITY(atk_object))
115 return NULL; 277 return NULL;
116 278
117 return ToBrowserAccessibilityAuraLinux(BROWSER_ACCESSIBILITY(atk_object)); 279 return ToBrowserAccessibilityAuraLinux(BROWSER_ACCESSIBILITY(atk_object));
118 } 280 }
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 ATK_TEXT_INTERFACE, 566 ATK_TEXT_INTERFACE,
405 ATK_VALUE_INTERFACE, 567 ATK_VALUE_INTERFACE,
406 }; 568 };
407 569
408 static int GetInterfaceMaskFromObject(BrowserAccessibilityAuraLinux* obj) { 570 static int GetInterfaceMaskFromObject(BrowserAccessibilityAuraLinux* obj) {
409 int interface_mask = 0; 571 int interface_mask = 0;
410 572
411 // Component interface is always supported. 573 // Component interface is always supported.
412 interface_mask |= 1 << ATK_COMPONENT_INTERFACE; 574 interface_mask |= 1 << ATK_COMPONENT_INTERFACE;
413 575
576 // Action interface is basic one. It just relays on executing default action
577 // for each object.
578 interface_mask |= 1 << ATK_ACTION_INTERFACE;
579
580 // Value Interface
414 int role = obj->GetRole(); 581 int role = obj->GetRole();
415 if (role == ui::AX_ROLE_PROGRESS_INDICATOR || 582 if (role == ui::AX_ROLE_PROGRESS_INDICATOR ||
416 role == ui::AX_ROLE_SCROLL_BAR || role == ui::AX_ROLE_SLIDER) { 583 role == ui::AX_ROLE_SCROLL_BAR || role == ui::AX_ROLE_SLIDER) {
417 interface_mask |= 1 << ATK_VALUE_INTERFACE; 584 interface_mask |= 1 << ATK_VALUE_INTERFACE;
418 } 585 }
419 586
587 // Document Interface
588 if (role == ui::AX_ROLE_DOCUMENT || role == ui::AX_ROLE_ROOT_WEB_AREA ||
589 role == ui::AX_ROLE_WEB_AREA)
590 interface_mask |= 1 << ATK_DOCUMENT_INTERFACE;
591
420 return interface_mask; 592 return interface_mask;
421 } 593 }
422 594
423 static GType GetAccessibilityTypeFromObject( 595 static GType GetAccessibilityTypeFromObject(
424 BrowserAccessibilityAuraLinux* obj) { 596 BrowserAccessibilityAuraLinux* obj) {
425 static const GTypeInfo type_info = { 597 static const GTypeInfo type_info = {
426 sizeof(BrowserAccessibilityAtkClass), 598 sizeof(BrowserAccessibilityAtkClass),
427 (GBaseInitFunc)0, 599 (GBaseInitFunc)0,
428 (GBaseFinalizeFunc)0, 600 (GBaseFinalizeFunc)0,
429 (GClassInitFunc)0, 601 (GClassInitFunc)0,
430 (GClassFinalizeFunc)0, 602 (GClassFinalizeFunc)0,
431 0, /* class data */ 603 0, /* class data */
432 sizeof(BrowserAccessibilityAtk), /* instance size */ 604 sizeof(BrowserAccessibilityAtk), /* instance size */
433 0, /* nb preallocs */ 605 0, /* nb preallocs */
434 (GInstanceInitFunc)0, 606 (GInstanceInitFunc)0,
435 0 /* value table */ 607 0 /* value table */
436 }; 608 };
437 609
438 int interface_mask = GetInterfaceMaskFromObject(obj); 610 int interface_mask = GetInterfaceMaskFromObject(obj);
439 const char* atk_type_name = GetUniqueAccessibilityTypeName(interface_mask); 611 const char* atk_type_name = GetUniqueAccessibilityTypeName(interface_mask);
440 GType type = g_type_from_name(atk_type_name); 612 GType type = g_type_from_name(atk_type_name);
441 if (type) 613 if (type)
442 return type; 614 return type;
443 615
444 type = g_type_register_static(BROWSER_ACCESSIBILITY_TYPE, atk_type_name, 616 type = g_type_register_static(BROWSER_ACCESSIBILITY_TYPE, atk_type_name,
445 &type_info, GTypeFlags(0)); 617 &type_info, GTypeFlags(0));
618 if (interface_mask & (1 << ATK_ACTION_INTERFACE))
619 g_type_add_interface_static(type, ATK_TYPE_ACTION, &ActionInfo);
446 if (interface_mask & (1 << ATK_COMPONENT_INTERFACE)) 620 if (interface_mask & (1 << ATK_COMPONENT_INTERFACE))
447 g_type_add_interface_static(type, ATK_TYPE_COMPONENT, &ComponentInfo); 621 g_type_add_interface_static(type, ATK_TYPE_COMPONENT, &ComponentInfo);
622 if (interface_mask & (1 << ATK_DOCUMENT_INTERFACE))
623 g_type_add_interface_static(type, ATK_TYPE_DOCUMENT, &DocumentInfo);
448 if (interface_mask & (1 << ATK_VALUE_INTERFACE)) 624 if (interface_mask & (1 << ATK_VALUE_INTERFACE))
449 g_type_add_interface_static(type, ATK_TYPE_VALUE, &ValueInfo); 625 g_type_add_interface_static(type, ATK_TYPE_VALUE, &ValueInfo);
450 626
451 return type; 627 return type;
452 } 628 }
453 629
454 BrowserAccessibilityAtk* browser_accessibility_new( 630 BrowserAccessibilityAtk* browser_accessibility_new(
455 BrowserAccessibilityAuraLinux* obj) { 631 BrowserAccessibilityAuraLinux* obj) {
456 GType type = GetAccessibilityTypeFromObject(obj); 632 GType type = GetAccessibilityTypeFromObject(obj);
457 AtkObject* atk_object = static_cast<AtkObject*>(g_object_new(type, 0)); 633 AtkObject* atk_object = static_cast<AtkObject*>(g_object_new(type, 0));
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 case ui::AX_ROLE_TREE_ITEM: 839 case ui::AX_ROLE_TREE_ITEM:
664 atk_role_ = ATK_ROLE_TREE_ITEM; 840 atk_role_ = ATK_ROLE_TREE_ITEM;
665 break; 841 break;
666 default: 842 default:
667 atk_role_ = ATK_ROLE_UNKNOWN; 843 atk_role_ = ATK_ROLE_UNKNOWN;
668 break; 844 break;
669 } 845 }
670 } 846 }
671 847
672 } // namespace content 848 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698