Home | History | Annotate | Download | only in accessibility
      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