OSDN Git Service

am fdbac3da: (-s ours) am 5013a3fb: DO NOT MERGE Implement the document.createTouch...
[android-x86/external-webkit.git] / WebCore / accessibility / gtk / AXObjectCacheAtk.cpp
1 /*
2  * Copyright (C) 2008 Nuanti Ltd.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "AXObjectCache.h"
22
23 #include "AccessibilityObject.h"
24 #include "AccessibilityObjectWrapperAtk.h"
25 #include "AccessibilityRenderObject.h"
26 #include "GOwnPtr.h"
27 #include "Range.h"
28 #include "TextIterator.h"
29
30 namespace WebCore {
31
32 void AXObjectCache::detachWrapper(AccessibilityObject* obj)
33 {
34     webkit_accessible_detach(WEBKIT_ACCESSIBLE(obj->wrapper()));
35 }
36
37 void AXObjectCache::attachWrapper(AccessibilityObject* obj)
38 {
39     AtkObject* atkObj = ATK_OBJECT(webkit_accessible_new(obj));
40     obj->setWrapper(atkObj);
41     g_object_unref(atkObj);
42 }
43
44 void AXObjectCache::postPlatformNotification(AccessibilityObject* coreObject, AXNotification notification)
45 {
46     if (notification == AXCheckedStateChanged) {
47         if (!coreObject->isCheckboxOrRadio())
48             return;
49         g_signal_emit_by_name(coreObject->wrapper(), "state-change", "checked", coreObject->isChecked());
50     } else if (notification == AXSelectedChildrenChanged) {
51         if (!coreObject->isListBox())
52             return;
53         g_signal_emit_by_name(coreObject->wrapper(), "selection-changed");
54     }
55 }
56
57 static void emitTextChanged(AccessibilityRenderObject* object, AXObjectCache::AXTextChange textChange, unsigned offset, unsigned count)
58 {
59     // Get the axObject for the parent object
60     AtkObject* wrapper = object->parentObjectUnignored()->wrapper();
61     if (!wrapper || !ATK_IS_TEXT(wrapper))
62         return;
63
64     // Select the right signal to be emitted
65     CString detail;
66     switch (textChange) {
67     case AXObjectCache::AXTextInserted:
68         detail = "text-changed::insert";
69         break;
70     case AXObjectCache::AXTextDeleted:
71         detail = "text-changed::delete";
72         break;
73     }
74
75     if (!detail.isNull())
76         g_signal_emit_by_name(wrapper, detail.data(), offset, count);
77 }
78
79 void AXObjectCache::nodeTextChangePlatformNotification(AccessibilityObject* object, AXTextChange textChange, unsigned offset, unsigned count)
80 {
81     // Sanity check
82     if (count < 1 || !object || !object->isAccessibilityRenderObject())
83         return;
84
85     Node* node = object->node();
86     RefPtr<Range> range = Range::create(node->document(),  Position(node->parentNode(), 0), Position(node, 0));
87     emitTextChanged(toAccessibilityRenderObject(object), textChange, offset + TextIterator::rangeLength(range.get()), count);
88 }
89
90 void AXObjectCache::handleFocusedUIElementChanged(RenderObject* oldFocusedRender, RenderObject* newFocusedRender)
91 {
92     RefPtr<AccessibilityObject> oldObject = getOrCreate(oldFocusedRender);
93     if (oldObject) {
94         g_signal_emit_by_name(oldObject->wrapper(), "focus-event", false);
95         g_signal_emit_by_name(oldObject->wrapper(), "state-change", "focused", false);
96     }
97     RefPtr<AccessibilityObject> newObject = getOrCreate(newFocusedRender);
98     if (newObject) {
99         g_signal_emit_by_name(newObject->wrapper(), "focus-event", true);
100         g_signal_emit_by_name(newObject->wrapper(), "state-change", "focused", true);
101     }
102 }
103
104 void AXObjectCache::handleScrolledToAnchor(const Node*)
105 {
106 }
107
108 } // namespace WebCore