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 3 // found in the LICENSE file. 4 5 #include "content/browser/accessibility/browser_accessibility_manager_gtk.h" 6 7 #include "content/browser/accessibility/browser_accessibility_gtk.h" 8 #include "content/common/accessibility_messages.h" 9 10 namespace content { 11 12 // static 13 BrowserAccessibilityManager* BrowserAccessibilityManager::Create( 14 const AccessibilityNodeData& src, 15 BrowserAccessibilityDelegate* delegate, 16 BrowserAccessibilityFactory* factory) { 17 return new BrowserAccessibilityManagerGtk( 18 NULL, 19 src, 20 delegate, 21 factory); 22 } 23 24 BrowserAccessibilityManagerGtk::BrowserAccessibilityManagerGtk( 25 GtkWidget* parent_widget, 26 const AccessibilityNodeData& src, 27 BrowserAccessibilityDelegate* delegate, 28 BrowserAccessibilityFactory* factory) 29 : BrowserAccessibilityManager(delegate, factory), 30 parent_widget_(parent_widget) { 31 Initialize(src); 32 } 33 34 BrowserAccessibilityManagerGtk::~BrowserAccessibilityManagerGtk() { 35 } 36 37 // static 38 AccessibilityNodeData BrowserAccessibilityManagerGtk::GetEmptyDocument() { 39 AccessibilityNodeData empty_document; 40 empty_document.id = 0; 41 empty_document.role = AccessibilityNodeData::ROLE_ROOT_WEB_AREA; 42 empty_document.state = 43 1 << AccessibilityNodeData::STATE_READONLY; 44 return empty_document; 45 } 46 47 void BrowserAccessibilityManagerGtk::NotifyAccessibilityEvent( 48 int type, 49 BrowserAccessibility* node) { 50 if (!node->IsNative()) 51 return; 52 AtkObject* atk_object = node->ToBrowserAccessibilityGtk()->GetAtkObject(); 53 54 switch (type) { 55 case AccessibilityNotificationChildrenChanged: 56 RecursivelySendChildrenChanged(GetRoot()->ToBrowserAccessibilityGtk()); 57 break; 58 case AccessibilityNotificationFocusChanged: 59 // Note: atk_focus_tracker_notify may be deprecated in the future; 60 // follow this bug for the replacement: 61 // https://bugzilla.gnome.org/show_bug.cgi?id=649575#c4 62 g_signal_emit_by_name(atk_object, "focus-event", true); 63 atk_focus_tracker_notify(atk_object); 64 break; 65 default: 66 break; 67 } 68 } 69 70 void BrowserAccessibilityManagerGtk::RecursivelySendChildrenChanged( 71 BrowserAccessibilityGtk* node) { 72 AtkObject* atkObject = node->ToBrowserAccessibilityGtk()->GetAtkObject(); 73 for (unsigned int i = 0; i < node->children().size(); ++i) { 74 BrowserAccessibilityGtk* child = 75 node->children()[i]->ToBrowserAccessibilityGtk(); 76 g_signal_emit_by_name(atkObject, 77 "children-changed::add", 78 i, 79 child->GetAtkObject()); 80 RecursivelySendChildrenChanged(child); 81 } 82 } 83 84 } // namespace content 85