Rename WebKitTools to Tools
[WebKit-https.git] / Tools / DumpRenderTree / gtk / AccessibilityUIElementGtk.cpp
1 /*
2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3  * Copyright (C) 2009 Jan Michael Alonzo
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #include "config.h"
28 #include "AccessibilityUIElement.h"
29 #include "GOwnPtr.h"
30 #include "GRefPtr.h"
31
32 #include <JavaScriptCore/JSStringRef.h>
33 #include <wtf/Assertions.h>
34
35 #include <atk/atk.h>
36 #include <gtk/gtk.h>
37
38
39 AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element)
40     : m_element(element)
41 {
42 }
43
44 AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement& other)
45     : m_element(other.m_element)
46 {
47 }
48
49 AccessibilityUIElement::~AccessibilityUIElement()
50 {
51 }
52
53 void AccessibilityUIElement::getLinkedUIElements(Vector<AccessibilityUIElement>& elements)
54 {
55     // FIXME: implement
56 }
57
58 void AccessibilityUIElement::getDocumentLinks(Vector<AccessibilityUIElement>&)
59 {
60     // FIXME: implement
61 }
62
63 void AccessibilityUIElement::getChildren(Vector<AccessibilityUIElement>& children)
64 {
65     int count = childrenCount();
66     for (int i = 0; i < count; i++) {
67         AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i);
68         children.append(AccessibilityUIElement(child));
69     }
70 }
71
72 void AccessibilityUIElement::getChildrenWithRange(Vector<AccessibilityUIElement>& elementVector, unsigned start, unsigned end)
73 {
74     for (unsigned i = start; i < end; i++) {
75         AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i);
76         elementVector.append(AccessibilityUIElement(child));
77     }
78 }
79
80 int AccessibilityUIElement::rowCount()
81 {
82     if (!m_element)
83         return 0;
84
85     ASSERT(ATK_IS_TABLE(m_element));
86
87     return atk_table_get_n_rows(ATK_TABLE(m_element));
88 }
89
90 int AccessibilityUIElement::columnCount()
91 {
92     if (!m_element)
93         return 0;
94
95     ASSERT(ATK_IS_TABLE(m_element));
96
97     return atk_table_get_n_columns(ATK_TABLE(m_element));
98 }
99
100 int AccessibilityUIElement::childrenCount()
101 {
102     if (!m_element)
103         return 0;
104
105     ASSERT(ATK_IS_OBJECT(m_element));
106
107     return atk_object_get_n_accessible_children(ATK_OBJECT(m_element));
108 }
109
110 AccessibilityUIElement AccessibilityUIElement::elementAtPoint(int x, int y)
111 {
112     // FIXME: implement
113     return 0;
114 }
115
116 AccessibilityUIElement AccessibilityUIElement::linkedUIElementAtIndex(unsigned index)
117 {
118     // FIXME: implement
119     return 0;
120 }
121
122 AccessibilityUIElement AccessibilityUIElement::getChildAtIndex(unsigned index)
123 {
124     Vector<AccessibilityUIElement> children;
125     getChildrenWithRange(children, index, index + 1);
126
127     if (children.size() == 1)
128         return children.at(0);
129
130     return 0;
131 }
132
133 unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element)
134
135     // FIXME: implement
136     return 0;
137 }
138
139 gchar* attributeSetToString(AtkAttributeSet* attributeSet)
140 {
141     GString* str = g_string_new(0);
142     for (GSList* attributes = attributeSet; attributes; attributes = attributes->next) {
143         AtkAttribute* attribute = static_cast<AtkAttribute*>(attributes->data);
144         g_string_append(str, g_strconcat(attribute->name, ":", attribute->value, NULL));
145         if (attributes->next)
146             g_string_append(str, ", ");
147     }
148
149     return g_string_free(str, FALSE);
150 }
151
152 JSStringRef AccessibilityUIElement::allAttributes()
153 {
154     if (!m_element)
155         return JSStringCreateWithCharacters(0, 0);
156
157     ASSERT(ATK_IS_OBJECT(m_element));
158     return JSStringCreateWithUTF8CString(attributeSetToString(atk_object_get_attributes(ATK_OBJECT(m_element))));
159 }
160
161 JSStringRef AccessibilityUIElement::attributesOfLinkedUIElements()
162 {
163     // FIXME: implement
164     return JSStringCreateWithCharacters(0, 0);
165 }
166
167 JSStringRef AccessibilityUIElement::attributesOfDocumentLinks()
168 {
169     // FIXME: implement
170     return JSStringCreateWithCharacters(0, 0);
171 }
172
173 AccessibilityUIElement AccessibilityUIElement::titleUIElement()
174 {
175     // FIXME: implement
176     return 0;
177 }
178
179 AccessibilityUIElement AccessibilityUIElement::parentElement()
180 {
181     if (!m_element)
182         return 0;
183
184     ASSERT(ATK_IS_OBJECT(m_element));
185
186     AtkObject* parent =  atk_object_get_parent(ATK_OBJECT(m_element));
187     return parent ? AccessibilityUIElement(parent) : 0;
188 }
189
190 JSStringRef AccessibilityUIElement::attributesOfChildren()
191 {
192     // FIXME: implement
193     return JSStringCreateWithCharacters(0, 0);
194 }
195
196 JSStringRef AccessibilityUIElement::parameterizedAttributeNames()
197 {
198     // FIXME: implement
199     return JSStringCreateWithCharacters(0, 0);
200 }
201
202 JSStringRef AccessibilityUIElement::role()
203 {
204     AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
205
206     if (!role)
207         return JSStringCreateWithCharacters(0, 0);
208
209     const gchar* roleName = atk_role_get_name(role);
210     GOwnPtr<gchar> axRole(g_strdup_printf("AXRole: %s", roleName));
211
212     return JSStringCreateWithUTF8CString(axRole.get());
213 }
214
215 JSStringRef AccessibilityUIElement::subrole()
216 {
217     return 0;
218 }
219
220 JSStringRef AccessibilityUIElement::roleDescription()
221 {
222     return 0;
223 }
224
225 JSStringRef AccessibilityUIElement::title()
226 {
227     const gchar* name = atk_object_get_name(ATK_OBJECT(m_element));
228
229     if (!name)
230         return JSStringCreateWithCharacters(0, 0);
231
232     GOwnPtr<gchar> axTitle(g_strdup_printf("AXTitle: %s", name));
233
234     return JSStringCreateWithUTF8CString(axTitle.get());
235 }
236
237 JSStringRef AccessibilityUIElement::description()
238 {
239     const gchar* description = atk_object_get_description(ATK_OBJECT(m_element));
240
241     if (!description)
242         return JSStringCreateWithCharacters(0, 0);
243
244     GOwnPtr<gchar> axDesc(g_strdup_printf("AXDescription: %s", description));
245
246     return JSStringCreateWithUTF8CString(axDesc.get());
247 }
248
249 JSStringRef AccessibilityUIElement::stringValue()
250 {
251     // FIXME: implement
252     return JSStringCreateWithCharacters(0, 0);
253 }
254
255 JSStringRef AccessibilityUIElement::language()
256 {
257     // FIXME: implement
258     return JSStringCreateWithCharacters(0, 0);
259 }
260
261 JSStringRef AccessibilityUIElement::helpText() const
262 {
263     return 0;
264 }
265
266 double AccessibilityUIElement::x()
267 {
268     int x, y;
269
270     atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN);
271
272     return x;
273 }
274
275 double AccessibilityUIElement::y()
276 {
277     int x, y;
278
279     atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN);
280
281     return y;
282 }
283
284 double AccessibilityUIElement::width()
285 {
286     int width, height;
287
288     atk_component_get_size(ATK_COMPONENT(m_element), &width, &height);
289
290     return width;
291 }
292
293 double AccessibilityUIElement::height()
294 {
295     int width, height;
296
297     atk_component_get_size(ATK_COMPONENT(m_element), &width, &height);
298
299     return height;
300 }
301
302 double AccessibilityUIElement::clickPointX()
303 {
304     return 0.f;
305 }
306
307 double AccessibilityUIElement::clickPointY()
308 {
309     return 0.f;
310 }
311
312 JSStringRef AccessibilityUIElement::orientation() const
313 {
314     return 0;
315 }
316
317 double AccessibilityUIElement::intValue() const
318 {
319     GValue value = { 0, { { 0 } } };
320
321     if (!ATK_IS_VALUE(m_element))
322         return 0.0f;
323
324     atk_value_get_current_value(ATK_VALUE(m_element), &value);
325
326     if (G_VALUE_HOLDS_DOUBLE(&value))
327         return g_value_get_double(&value);
328     else if (G_VALUE_HOLDS_INT(&value))
329         return static_cast<double>(g_value_get_int(&value));
330     else
331         return 0.0f;
332 }
333
334 double AccessibilityUIElement::minValue()
335 {
336     GValue value = { 0, { { 0 } } };
337
338     if (!ATK_IS_VALUE(m_element))
339         return 0.0f;
340
341     atk_value_get_minimum_value(ATK_VALUE(m_element), &value);
342
343     if (G_VALUE_HOLDS_DOUBLE(&value))
344         return g_value_get_double(&value);
345     else if (G_VALUE_HOLDS_INT(&value))
346         return static_cast<double>(g_value_get_int(&value));
347     else
348         return 0.0f;
349 }
350
351 double AccessibilityUIElement::maxValue()
352 {
353     GValue value = { 0, { { 0 } } };
354
355     if (!ATK_IS_VALUE(m_element))
356         return 0.0f;
357
358     atk_value_get_maximum_value(ATK_VALUE(m_element), &value);
359
360     if (G_VALUE_HOLDS_DOUBLE(&value))
361         return g_value_get_double(&value);
362     else if (G_VALUE_HOLDS_INT(&value))
363         return static_cast<double>(g_value_get_int(&value));
364     else
365         return 0.0f;
366 }
367
368 JSStringRef AccessibilityUIElement::valueDescription()
369 {
370     // FIXME: implement
371     return JSStringCreateWithCharacters(0, 0);
372 }
373
374 static bool checkElementState(PlatformUIElement element, AtkStateType stateType)
375 {
376     if (!ATK_IS_OBJECT(element))
377          return false;
378
379     PlatformRefPtr<AtkStateSet> stateSet = adoptPlatformRef(atk_object_ref_state_set(ATK_OBJECT(element)));
380     return atk_state_set_contains_state(stateSet.get(), stateType);
381 }
382
383 bool AccessibilityUIElement::isEnabled()
384 {
385     return checkElementState(m_element, ATK_STATE_ENABLED);
386 }
387
388 int AccessibilityUIElement::insertionPointLineNumber()
389 {
390     // FIXME: implement
391     return 0;
392 }
393
394 bool AccessibilityUIElement::isActionSupported(JSStringRef action)
395 {
396     // FIXME: implement
397     return false;
398 }
399
400 bool AccessibilityUIElement::isRequired() const
401 {
402     // FIXME: implement
403     return false;
404 }
405
406 bool AccessibilityUIElement::isFocused() const
407 {
408     if (!ATK_IS_OBJECT(m_element))
409         return false;
410
411     PlatformRefPtr<AtkStateSet> stateSet = adoptPlatformRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
412     gboolean isFocused = atk_state_set_contains_state(stateSet.get(), ATK_STATE_FOCUSED);
413
414     return isFocused;
415 }
416
417 bool AccessibilityUIElement::isSelected() const
418 {
419     return checkElementState(m_element, ATK_STATE_SELECTED);
420 }
421
422 int AccessibilityUIElement::hierarchicalLevel() const
423 {
424     // FIXME: implement
425     return 0;
426 }
427
428 bool AccessibilityUIElement::ariaIsGrabbed() const
429 {
430     return false;
431 }
432  
433 JSStringRef AccessibilityUIElement::ariaDropEffects() const
434 {   
435     return 0; 
436 }
437
438 bool AccessibilityUIElement::isExpanded() const
439 {
440     // FIXME: implement
441     return false;
442 }
443
444 bool AccessibilityUIElement::isChecked() const
445 {
446     return intValue();
447 }
448
449 JSStringRef AccessibilityUIElement::attributesOfColumnHeaders()
450 {
451     // FIXME: implement
452     return JSStringCreateWithCharacters(0, 0);
453 }
454
455 JSStringRef AccessibilityUIElement::attributesOfRowHeaders()
456 {
457     // FIXME: implement
458     return JSStringCreateWithCharacters(0, 0);
459 }
460
461 JSStringRef AccessibilityUIElement::attributesOfColumns()
462 {
463     // FIXME: implement
464     return JSStringCreateWithCharacters(0, 0);
465 }
466
467 JSStringRef AccessibilityUIElement::attributesOfRows()
468 {
469     // FIXME: implement
470     return JSStringCreateWithCharacters(0, 0);
471 }
472
473 JSStringRef AccessibilityUIElement::attributesOfVisibleCells()
474 {
475     // FIXME: implement
476     return JSStringCreateWithCharacters(0, 0);
477 }
478
479 JSStringRef AccessibilityUIElement::attributesOfHeader()
480 {
481     // FIXME: implement
482     return JSStringCreateWithCharacters(0, 0);
483 }
484
485 int AccessibilityUIElement::indexInTable()
486 {
487     // FIXME: implement
488     return 0;
489 }
490
491 JSStringRef AccessibilityUIElement::rowIndexRange()
492 {
493     // FIXME: implement
494     return JSStringCreateWithCharacters(0, 0);
495 }
496
497 JSStringRef AccessibilityUIElement::columnIndexRange()
498 {
499     // FIXME: implement
500     return JSStringCreateWithCharacters(0, 0);
501 }
502
503 int AccessibilityUIElement::lineForIndex(int)
504 {
505     // FIXME: implement
506     return 0;
507 }
508
509 JSStringRef AccessibilityUIElement::boundsForRange(unsigned location, unsigned length)
510 {
511     // FIXME: implement
512     return JSStringCreateWithCharacters(0, 0);
513 }
514
515 JSStringRef AccessibilityUIElement::stringForRange(unsigned, unsigned) 
516 {
517     // FIXME: implement
518     return JSStringCreateWithCharacters(0, 0);
519
520
521 JSStringRef AccessibilityUIElement::attributedStringForRange(unsigned, unsigned)
522 {
523     // FIXME: implement
524     return JSStringCreateWithCharacters(0, 0);
525 }
526
527 bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned location, unsigned length)
528 {
529     // FIXME: implement
530     return false;
531 }
532
533 AccessibilityUIElement AccessibilityUIElement::cellForColumnAndRow(unsigned column, unsigned row)
534 {
535     // FIXME: implement
536     return 0;
537 }
538
539 JSStringRef AccessibilityUIElement::selectedTextRange()
540 {
541     // FIXME: implement
542     return JSStringCreateWithCharacters(0, 0);
543 }
544
545 void AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length)
546 {
547     // FIXME: implement
548 }
549
550 JSStringRef AccessibilityUIElement::stringAttributeValue(JSStringRef attribute)
551 {
552     // FIXME: implement
553     return JSStringCreateWithCharacters(0, 0);
554 }
555
556 bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute)
557 {
558     // FIXME: implement
559     return false;
560 }
561
562 bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
563 {
564     // FIXME: implement
565     return false;
566 }
567
568 bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute)
569 {
570     return false;
571 }
572
573 void AccessibilityUIElement::increment()
574 {
575     // FIXME: implement
576 }
577
578 void AccessibilityUIElement::decrement()
579 {
580     // FIXME: implement
581 }
582
583 void AccessibilityUIElement::press()
584 {
585     if (!m_element)
586         return;
587
588     ASSERT(ATK_IS_OBJECT(m_element));
589
590     if (!ATK_IS_ACTION(m_element))
591         return;
592
593     // Only one action per object is supported so far.
594     atk_action_do_action(ATK_ACTION(m_element), 0);
595 }
596
597 void AccessibilityUIElement::showMenu()
598 {
599     // FIXME: implement
600 }
601
602 AccessibilityUIElement AccessibilityUIElement::disclosedRowAtIndex(unsigned index)
603 {
604     return 0;
605 }
606
607 AccessibilityUIElement AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index)
608 {
609     return 0;
610 }
611
612 AccessibilityUIElement AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index)
613 {
614     return 0;
615 }
616
617 AccessibilityUIElement AccessibilityUIElement::selectedRowAtIndex(unsigned index)
618 {
619     return 0;
620 }
621
622 AccessibilityUIElement AccessibilityUIElement::disclosedByRow()
623 {
624     return 0;
625 }
626
627 JSStringRef AccessibilityUIElement::accessibilityValue() const
628 {
629     // FIXME: implement
630     return JSStringCreateWithCharacters(0, 0);
631 }
632
633 JSStringRef AccessibilityUIElement::documentEncoding()
634 {
635     AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
636     if (role != ATK_ROLE_DOCUMENT_FRAME)
637         return JSStringCreateWithCharacters(0, 0);
638
639     return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "Encoding"));
640 }
641
642 JSStringRef AccessibilityUIElement::documentURI()
643 {
644     AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
645     if (role != ATK_ROLE_DOCUMENT_FRAME)
646         return JSStringCreateWithCharacters(0, 0);
647
648     return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "URI"));
649 }
650
651 JSStringRef AccessibilityUIElement::url()
652 {
653     // FIXME: implement
654     return JSStringCreateWithCharacters(0, 0);
655 }
656
657 bool AccessibilityUIElement::addNotificationListener(JSObjectRef functionCallback)
658 {
659     // FIXME: implement
660     return false;
661 }
662
663 void AccessibilityUIElement::removeNotificationListener()
664 {
665     // FIXME: implement
666 }
667
668 bool AccessibilityUIElement::isFocusable() const
669 {
670     if (!ATK_IS_OBJECT(m_element))
671         return false;
672
673     PlatformRefPtr<AtkStateSet> stateSet = adoptPlatformRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
674     gboolean isFocusable = atk_state_set_contains_state(stateSet.get(), ATK_STATE_FOCUSABLE);
675
676     return isFocusable;
677 }
678
679 bool AccessibilityUIElement::isSelectable() const
680 {
681     // FIXME: implement
682     return false;
683 }
684
685 bool AccessibilityUIElement::isMultiSelectable() const
686 {
687     // FIXME: implement
688     return false;
689 }
690
691 bool AccessibilityUIElement::isVisible() const
692 {
693     // FIXME: implement
694     return false;
695 }
696
697 bool AccessibilityUIElement::isOffScreen() const
698 {
699     // FIXME: implement
700     return false;
701 }
702
703 bool AccessibilityUIElement::isCollapsed() const
704 {
705     // FIXME: implement
706     return false;
707 }
708
709 bool AccessibilityUIElement::isIgnored() const
710 {
711     // FIXME: implement
712     return false;
713 }
714
715 bool AccessibilityUIElement::hasPopup() const
716 {
717     // FIXME: implement
718     return false;
719 }
720
721 void AccessibilityUIElement::takeFocus()
722 {
723     // FIXME: implement
724 }
725
726 void AccessibilityUIElement::takeSelection()
727 {
728     // FIXME: implement
729 }
730
731 void AccessibilityUIElement::addSelection()
732 {
733     // FIXME: implement
734 }
735
736 void AccessibilityUIElement::removeSelection()
737 {
738     // FIXME: implement
739 }