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
30 #include "GOwnPtr.h"
31 #include "GRefPtr.h"
32 #include "WebCoreSupport/DumpRenderTreeSupportGtk.h"
33 #include <JavaScriptCore/JSStringRef.h>
34 #include <atk/atk.h>
35 #include <gtk/gtk.h>
36 #include <wtf/Assertions.h>
37
AccessibilityUIElement(PlatformUIElement element)38 AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element)
39 : m_element(element)
40 {
41 }
42
AccessibilityUIElement(const AccessibilityUIElement & other)43 AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement& other)
44 : m_element(other.m_element)
45 {
46 }
47
~AccessibilityUIElement()48 AccessibilityUIElement::~AccessibilityUIElement()
49 {
50 }
51
getLinkedUIElements(Vector<AccessibilityUIElement> & elements)52 void AccessibilityUIElement::getLinkedUIElements(Vector<AccessibilityUIElement>& elements)
53 {
54 // FIXME: implement
55 }
56
getDocumentLinks(Vector<AccessibilityUIElement> &)57 void AccessibilityUIElement::getDocumentLinks(Vector<AccessibilityUIElement>&)
58 {
59 // FIXME: implement
60 }
61
getChildren(Vector<AccessibilityUIElement> & children)62 void AccessibilityUIElement::getChildren(Vector<AccessibilityUIElement>& children)
63 {
64 int count = childrenCount();
65 for (int i = 0; i < count; i++) {
66 AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i);
67 children.append(AccessibilityUIElement(child));
68 }
69 }
70
getChildrenWithRange(Vector<AccessibilityUIElement> & elementVector,unsigned start,unsigned end)71 void AccessibilityUIElement::getChildrenWithRange(Vector<AccessibilityUIElement>& elementVector, unsigned start, unsigned end)
72 {
73 for (unsigned i = start; i < end; i++) {
74 AtkObject* child = atk_object_ref_accessible_child(ATK_OBJECT(m_element), i);
75 elementVector.append(AccessibilityUIElement(child));
76 }
77 }
78
rowCount()79 int AccessibilityUIElement::rowCount()
80 {
81 if (!m_element)
82 return 0;
83
84 ASSERT(ATK_IS_TABLE(m_element));
85
86 return atk_table_get_n_rows(ATK_TABLE(m_element));
87 }
88
columnCount()89 int AccessibilityUIElement::columnCount()
90 {
91 if (!m_element)
92 return 0;
93
94 ASSERT(ATK_IS_TABLE(m_element));
95
96 return atk_table_get_n_columns(ATK_TABLE(m_element));
97 }
98
childrenCount()99 int AccessibilityUIElement::childrenCount()
100 {
101 if (!m_element)
102 return 0;
103
104 ASSERT(ATK_IS_OBJECT(m_element));
105
106 return atk_object_get_n_accessible_children(ATK_OBJECT(m_element));
107 }
108
elementAtPoint(int x,int y)109 AccessibilityUIElement AccessibilityUIElement::elementAtPoint(int x, int y)
110 {
111 // FIXME: implement
112 return 0;
113 }
114
linkedUIElementAtIndex(unsigned index)115 AccessibilityUIElement AccessibilityUIElement::linkedUIElementAtIndex(unsigned index)
116 {
117 // FIXME: implement
118 return 0;
119 }
120
getChildAtIndex(unsigned index)121 AccessibilityUIElement AccessibilityUIElement::getChildAtIndex(unsigned index)
122 {
123 Vector<AccessibilityUIElement> children;
124 getChildrenWithRange(children, index, index + 1);
125
126 if (children.size() == 1)
127 return children.at(0);
128
129 return 0;
130 }
131
indexOfChild(AccessibilityUIElement * element)132 unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element)
133 {
134 // FIXME: implement
135 return 0;
136 }
137
attributeSetToString(AtkAttributeSet * attributeSet)138 gchar* attributeSetToString(AtkAttributeSet* attributeSet)
139 {
140 GString* str = g_string_new(0);
141 for (GSList* attributes = attributeSet; attributes; attributes = attributes->next) {
142 AtkAttribute* attribute = static_cast<AtkAttribute*>(attributes->data);
143 g_string_append(str, g_strconcat(attribute->name, ":", attribute->value, NULL));
144 if (attributes->next)
145 g_string_append(str, ", ");
146 }
147
148 return g_string_free(str, FALSE);
149 }
150
allAttributes()151 JSStringRef AccessibilityUIElement::allAttributes()
152 {
153 if (!m_element)
154 return JSStringCreateWithCharacters(0, 0);
155
156 ASSERT(ATK_IS_OBJECT(m_element));
157 return JSStringCreateWithUTF8CString(attributeSetToString(atk_object_get_attributes(ATK_OBJECT(m_element))));
158 }
159
attributesOfLinkedUIElements()160 JSStringRef AccessibilityUIElement::attributesOfLinkedUIElements()
161 {
162 // FIXME: implement
163 return JSStringCreateWithCharacters(0, 0);
164 }
165
attributesOfDocumentLinks()166 JSStringRef AccessibilityUIElement::attributesOfDocumentLinks()
167 {
168 // FIXME: implement
169 return JSStringCreateWithCharacters(0, 0);
170 }
171
titleUIElement()172 AccessibilityUIElement AccessibilityUIElement::titleUIElement()
173 {
174 // FIXME: implement
175 return 0;
176 }
177
parentElement()178 AccessibilityUIElement AccessibilityUIElement::parentElement()
179 {
180 if (!m_element)
181 return 0;
182
183 ASSERT(ATK_IS_OBJECT(m_element));
184
185 AtkObject* parent = atk_object_get_parent(ATK_OBJECT(m_element));
186 return parent ? AccessibilityUIElement(parent) : 0;
187 }
188
attributesOfChildren()189 JSStringRef AccessibilityUIElement::attributesOfChildren()
190 {
191 // FIXME: implement
192 return JSStringCreateWithCharacters(0, 0);
193 }
194
parameterizedAttributeNames()195 JSStringRef AccessibilityUIElement::parameterizedAttributeNames()
196 {
197 // FIXME: implement
198 return JSStringCreateWithCharacters(0, 0);
199 }
200
role()201 JSStringRef AccessibilityUIElement::role()
202 {
203 AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
204
205 if (!role)
206 return JSStringCreateWithCharacters(0, 0);
207
208 const gchar* roleName = atk_role_get_name(role);
209 GOwnPtr<gchar> axRole(g_strdup_printf("AXRole: %s", roleName));
210
211 return JSStringCreateWithUTF8CString(axRole.get());
212 }
213
subrole()214 JSStringRef AccessibilityUIElement::subrole()
215 {
216 return 0;
217 }
218
roleDescription()219 JSStringRef AccessibilityUIElement::roleDescription()
220 {
221 return 0;
222 }
223
title()224 JSStringRef AccessibilityUIElement::title()
225 {
226 const gchar* name = atk_object_get_name(ATK_OBJECT(m_element));
227
228 if (!name)
229 return JSStringCreateWithCharacters(0, 0);
230
231 GOwnPtr<gchar> axTitle(g_strdup_printf("AXTitle: %s", name));
232
233 return JSStringCreateWithUTF8CString(axTitle.get());
234 }
235
description()236 JSStringRef AccessibilityUIElement::description()
237 {
238 const gchar* description = atk_object_get_description(ATK_OBJECT(m_element));
239
240 if (!description)
241 return JSStringCreateWithCharacters(0, 0);
242
243 GOwnPtr<gchar> axDesc(g_strdup_printf("AXDescription: %s", description));
244
245 return JSStringCreateWithUTF8CString(axDesc.get());
246 }
247
stringValue()248 JSStringRef AccessibilityUIElement::stringValue()
249 {
250 // FIXME: implement
251 return JSStringCreateWithCharacters(0, 0);
252 }
253
language()254 JSStringRef AccessibilityUIElement::language()
255 {
256 // FIXME: implement
257 return JSStringCreateWithCharacters(0, 0);
258 }
259
helpText() const260 JSStringRef AccessibilityUIElement::helpText() const
261 {
262 return 0;
263 }
264
x()265 double AccessibilityUIElement::x()
266 {
267 int x, y;
268
269 atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN);
270
271 return x;
272 }
273
y()274 double AccessibilityUIElement::y()
275 {
276 int x, y;
277
278 atk_component_get_position(ATK_COMPONENT(m_element), &x, &y, ATK_XY_SCREEN);
279
280 return y;
281 }
282
width()283 double AccessibilityUIElement::width()
284 {
285 int width, height;
286
287 atk_component_get_size(ATK_COMPONENT(m_element), &width, &height);
288
289 return width;
290 }
291
height()292 double AccessibilityUIElement::height()
293 {
294 int width, height;
295
296 atk_component_get_size(ATK_COMPONENT(m_element), &width, &height);
297
298 return height;
299 }
300
clickPointX()301 double AccessibilityUIElement::clickPointX()
302 {
303 return 0.f;
304 }
305
clickPointY()306 double AccessibilityUIElement::clickPointY()
307 {
308 return 0.f;
309 }
310
orientation() const311 JSStringRef AccessibilityUIElement::orientation() const
312 {
313 return 0;
314 }
315
intValue() const316 double AccessibilityUIElement::intValue() const
317 {
318 GValue value = { 0, { { 0 } } };
319
320 if (!ATK_IS_VALUE(m_element))
321 return 0.0f;
322
323 atk_value_get_current_value(ATK_VALUE(m_element), &value);
324
325 if (G_VALUE_HOLDS_DOUBLE(&value))
326 return g_value_get_double(&value);
327 else if (G_VALUE_HOLDS_INT(&value))
328 return static_cast<double>(g_value_get_int(&value));
329 else
330 return 0.0f;
331 }
332
minValue()333 double AccessibilityUIElement::minValue()
334 {
335 GValue value = { 0, { { 0 } } };
336
337 if (!ATK_IS_VALUE(m_element))
338 return 0.0f;
339
340 atk_value_get_minimum_value(ATK_VALUE(m_element), &value);
341
342 if (G_VALUE_HOLDS_DOUBLE(&value))
343 return g_value_get_double(&value);
344 else if (G_VALUE_HOLDS_INT(&value))
345 return static_cast<double>(g_value_get_int(&value));
346 else
347 return 0.0f;
348 }
349
maxValue()350 double AccessibilityUIElement::maxValue()
351 {
352 GValue value = { 0, { { 0 } } };
353
354 if (!ATK_IS_VALUE(m_element))
355 return 0.0f;
356
357 atk_value_get_maximum_value(ATK_VALUE(m_element), &value);
358
359 if (G_VALUE_HOLDS_DOUBLE(&value))
360 return g_value_get_double(&value);
361 else if (G_VALUE_HOLDS_INT(&value))
362 return static_cast<double>(g_value_get_int(&value));
363 else
364 return 0.0f;
365 }
366
valueDescription()367 JSStringRef AccessibilityUIElement::valueDescription()
368 {
369 // FIXME: implement
370 return JSStringCreateWithCharacters(0, 0);
371 }
372
checkElementState(PlatformUIElement element,AtkStateType stateType)373 static bool checkElementState(PlatformUIElement element, AtkStateType stateType)
374 {
375 if (!ATK_IS_OBJECT(element))
376 return false;
377
378 GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(element)));
379 return atk_state_set_contains_state(stateSet.get(), stateType);
380 }
381
isEnabled()382 bool AccessibilityUIElement::isEnabled()
383 {
384 return checkElementState(m_element, ATK_STATE_ENABLED);
385 }
386
insertionPointLineNumber()387 int AccessibilityUIElement::insertionPointLineNumber()
388 {
389 // FIXME: implement
390 return 0;
391 }
392
isActionSupported(JSStringRef action)393 bool AccessibilityUIElement::isActionSupported(JSStringRef action)
394 {
395 // FIXME: implement
396 return false;
397 }
398
isRequired() const399 bool AccessibilityUIElement::isRequired() const
400 {
401 // FIXME: implement
402 return false;
403 }
404
isFocused() const405 bool AccessibilityUIElement::isFocused() const
406 {
407 if (!ATK_IS_OBJECT(m_element))
408 return false;
409
410 GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
411 gboolean isFocused = atk_state_set_contains_state(stateSet.get(), ATK_STATE_FOCUSED);
412
413 return isFocused;
414 }
415
isSelected() const416 bool AccessibilityUIElement::isSelected() const
417 {
418 return checkElementState(m_element, ATK_STATE_SELECTED);
419 }
420
hierarchicalLevel() const421 int AccessibilityUIElement::hierarchicalLevel() const
422 {
423 // FIXME: implement
424 return 0;
425 }
426
ariaIsGrabbed() const427 bool AccessibilityUIElement::ariaIsGrabbed() const
428 {
429 return false;
430 }
431
ariaDropEffects() const432 JSStringRef AccessibilityUIElement::ariaDropEffects() const
433 {
434 return 0;
435 }
436
isExpanded() const437 bool AccessibilityUIElement::isExpanded() const
438 {
439 // FIXME: implement
440 return false;
441 }
442
isChecked() const443 bool AccessibilityUIElement::isChecked() const
444 {
445 return intValue();
446 }
447
attributesOfColumnHeaders()448 JSStringRef AccessibilityUIElement::attributesOfColumnHeaders()
449 {
450 // FIXME: implement
451 return JSStringCreateWithCharacters(0, 0);
452 }
453
attributesOfRowHeaders()454 JSStringRef AccessibilityUIElement::attributesOfRowHeaders()
455 {
456 // FIXME: implement
457 return JSStringCreateWithCharacters(0, 0);
458 }
459
attributesOfColumns()460 JSStringRef AccessibilityUIElement::attributesOfColumns()
461 {
462 // FIXME: implement
463 return JSStringCreateWithCharacters(0, 0);
464 }
465
attributesOfRows()466 JSStringRef AccessibilityUIElement::attributesOfRows()
467 {
468 // FIXME: implement
469 return JSStringCreateWithCharacters(0, 0);
470 }
471
attributesOfVisibleCells()472 JSStringRef AccessibilityUIElement::attributesOfVisibleCells()
473 {
474 // FIXME: implement
475 return JSStringCreateWithCharacters(0, 0);
476 }
477
attributesOfHeader()478 JSStringRef AccessibilityUIElement::attributesOfHeader()
479 {
480 // FIXME: implement
481 return JSStringCreateWithCharacters(0, 0);
482 }
483
indexInTable()484 int AccessibilityUIElement::indexInTable()
485 {
486 // FIXME: implement
487 return 0;
488 }
489
indexRangeInTable(PlatformUIElement element,bool isRowRange)490 static JSStringRef indexRangeInTable(PlatformUIElement element, bool isRowRange)
491 {
492 GOwnPtr<gchar> rangeString(g_strdup("{0, 0}"));
493
494 if (!element)
495 return JSStringCreateWithUTF8CString(rangeString.get());
496
497 ASSERT(ATK_IS_OBJECT(element));
498
499 AtkObject* axTable = atk_object_get_parent(ATK_OBJECT(element));
500 if (!axTable || !ATK_IS_TABLE(axTable))
501 return JSStringCreateWithUTF8CString(rangeString.get());
502
503 // Look for the cell in the table.
504 gint indexInParent = atk_object_get_index_in_parent(ATK_OBJECT(element));
505 if (indexInParent == -1)
506 return JSStringCreateWithUTF8CString(rangeString.get());
507
508 int row = -1;
509 int column = -1;
510 row = atk_table_get_row_at_index(ATK_TABLE(axTable), indexInParent);
511 column = atk_table_get_column_at_index(ATK_TABLE(axTable), indexInParent);
512
513 // Get the actual values, if row and columns are valid values.
514 if (row != -1 && column != -1) {
515 int base = 0;
516 int length = 0;
517 if (isRowRange) {
518 base = row;
519 length = atk_table_get_row_extent_at(ATK_TABLE(axTable), row, column);
520 } else {
521 base = column;
522 length = atk_table_get_column_extent_at(ATK_TABLE(axTable), row, column);
523 }
524 rangeString.set(g_strdup_printf("{%d, %d}", base, length));
525 }
526
527 return JSStringCreateWithUTF8CString(rangeString.get());
528 }
529
rowIndexRange()530 JSStringRef AccessibilityUIElement::rowIndexRange()
531 {
532 // Range in table for rows.
533 return indexRangeInTable(m_element, true);
534 }
535
columnIndexRange()536 JSStringRef AccessibilityUIElement::columnIndexRange()
537 {
538 // Range in table for columns.
539 return indexRangeInTable(m_element, false);
540 }
541
lineForIndex(int)542 int AccessibilityUIElement::lineForIndex(int)
543 {
544 // FIXME: implement
545 return 0;
546 }
547
boundsForRange(unsigned location,unsigned length)548 JSStringRef AccessibilityUIElement::boundsForRange(unsigned location, unsigned length)
549 {
550 // FIXME: implement
551 return JSStringCreateWithCharacters(0, 0);
552 }
553
stringForRange(unsigned,unsigned)554 JSStringRef AccessibilityUIElement::stringForRange(unsigned, unsigned)
555 {
556 // FIXME: implement
557 return JSStringCreateWithCharacters(0, 0);
558 }
559
attributedStringForRange(unsigned,unsigned)560 JSStringRef AccessibilityUIElement::attributedStringForRange(unsigned, unsigned)
561 {
562 // FIXME: implement
563 return JSStringCreateWithCharacters(0, 0);
564 }
565
attributedStringRangeIsMisspelled(unsigned location,unsigned length)566 bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned location, unsigned length)
567 {
568 // FIXME: implement
569 return false;
570 }
571
cellForColumnAndRow(unsigned column,unsigned row)572 AccessibilityUIElement AccessibilityUIElement::cellForColumnAndRow(unsigned column, unsigned row)
573 {
574 if (!m_element)
575 return 0;
576
577 ASSERT(ATK_IS_TABLE(m_element));
578
579 AtkObject* foundCell = atk_table_ref_at(ATK_TABLE(m_element), row, column);
580 return foundCell ? AccessibilityUIElement(foundCell) : 0;
581 }
582
selectedTextRange()583 JSStringRef AccessibilityUIElement::selectedTextRange()
584 {
585 // FIXME: implement
586 return JSStringCreateWithCharacters(0, 0);
587 }
588
setSelectedTextRange(unsigned location,unsigned length)589 void AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length)
590 {
591 // FIXME: implement
592 }
593
stringAttributeValue(JSStringRef attribute)594 JSStringRef AccessibilityUIElement::stringAttributeValue(JSStringRef attribute)
595 {
596 // FIXME: implement
597 return JSStringCreateWithCharacters(0, 0);
598 }
599
boolAttributeValue(JSStringRef attribute)600 bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute)
601 {
602 // FIXME: implement
603 return false;
604 }
605
isAttributeSettable(JSStringRef attribute)606 bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
607 {
608 // FIXME: implement
609 return false;
610 }
611
isAttributeSupported(JSStringRef attribute)612 bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute)
613 {
614 return false;
615 }
616
increment()617 void AccessibilityUIElement::increment()
618 {
619 if (!m_element)
620 return;
621
622 ASSERT(ATK_IS_OBJECT(m_element));
623 DumpRenderTreeSupportGtk::incrementAccessibilityValue(ATK_OBJECT(m_element));
624 }
625
decrement()626 void AccessibilityUIElement::decrement()
627 {
628 if (!m_element)
629 return;
630
631 ASSERT(ATK_IS_OBJECT(m_element));
632 DumpRenderTreeSupportGtk::decrementAccessibilityValue(ATK_OBJECT(m_element));
633 }
634
press()635 void AccessibilityUIElement::press()
636 {
637 if (!m_element)
638 return;
639
640 ASSERT(ATK_IS_OBJECT(m_element));
641
642 if (!ATK_IS_ACTION(m_element))
643 return;
644
645 // Only one action per object is supported so far.
646 atk_action_do_action(ATK_ACTION(m_element), 0);
647 }
648
showMenu()649 void AccessibilityUIElement::showMenu()
650 {
651 // FIXME: implement
652 }
653
disclosedRowAtIndex(unsigned index)654 AccessibilityUIElement AccessibilityUIElement::disclosedRowAtIndex(unsigned index)
655 {
656 return 0;
657 }
658
ariaOwnsElementAtIndex(unsigned index)659 AccessibilityUIElement AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index)
660 {
661 return 0;
662 }
663
ariaFlowToElementAtIndex(unsigned index)664 AccessibilityUIElement AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index)
665 {
666 return 0;
667 }
668
selectedRowAtIndex(unsigned index)669 AccessibilityUIElement AccessibilityUIElement::selectedRowAtIndex(unsigned index)
670 {
671 return 0;
672 }
673
disclosedByRow()674 AccessibilityUIElement AccessibilityUIElement::disclosedByRow()
675 {
676 return 0;
677 }
678
accessibilityValue() const679 JSStringRef AccessibilityUIElement::accessibilityValue() const
680 {
681 // FIXME: implement
682 return JSStringCreateWithCharacters(0, 0);
683 }
684
documentEncoding()685 JSStringRef AccessibilityUIElement::documentEncoding()
686 {
687 AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
688 if (role != ATK_ROLE_DOCUMENT_FRAME)
689 return JSStringCreateWithCharacters(0, 0);
690
691 return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "Encoding"));
692 }
693
documentURI()694 JSStringRef AccessibilityUIElement::documentURI()
695 {
696 AtkRole role = atk_object_get_role(ATK_OBJECT(m_element));
697 if (role != ATK_ROLE_DOCUMENT_FRAME)
698 return JSStringCreateWithCharacters(0, 0);
699
700 return JSStringCreateWithUTF8CString(atk_document_get_attribute_value(ATK_DOCUMENT(m_element), "URI"));
701 }
702
url()703 JSStringRef AccessibilityUIElement::url()
704 {
705 // FIXME: implement
706 return JSStringCreateWithCharacters(0, 0);
707 }
708
addNotificationListener(JSObjectRef functionCallback)709 bool AccessibilityUIElement::addNotificationListener(JSObjectRef functionCallback)
710 {
711 // FIXME: implement
712 return false;
713 }
714
removeNotificationListener()715 void AccessibilityUIElement::removeNotificationListener()
716 {
717 // FIXME: implement
718 }
719
isFocusable() const720 bool AccessibilityUIElement::isFocusable() const
721 {
722 if (!ATK_IS_OBJECT(m_element))
723 return false;
724
725 GRefPtr<AtkStateSet> stateSet = adoptGRef(atk_object_ref_state_set(ATK_OBJECT(m_element)));
726 gboolean isFocusable = atk_state_set_contains_state(stateSet.get(), ATK_STATE_FOCUSABLE);
727
728 return isFocusable;
729 }
730
isSelectable() const731 bool AccessibilityUIElement::isSelectable() const
732 {
733 // FIXME: implement
734 return false;
735 }
736
isMultiSelectable() const737 bool AccessibilityUIElement::isMultiSelectable() const
738 {
739 // FIXME: implement
740 return false;
741 }
742
isVisible() const743 bool AccessibilityUIElement::isVisible() const
744 {
745 // FIXME: implement
746 return false;
747 }
748
isOffScreen() const749 bool AccessibilityUIElement::isOffScreen() const
750 {
751 // FIXME: implement
752 return false;
753 }
754
isCollapsed() const755 bool AccessibilityUIElement::isCollapsed() const
756 {
757 // FIXME: implement
758 return false;
759 }
760
isIgnored() const761 bool AccessibilityUIElement::isIgnored() const
762 {
763 // FIXME: implement
764 return false;
765 }
766
hasPopup() const767 bool AccessibilityUIElement::hasPopup() const
768 {
769 // FIXME: implement
770 return false;
771 }
772
takeFocus()773 void AccessibilityUIElement::takeFocus()
774 {
775 // FIXME: implement
776 }
777
takeSelection()778 void AccessibilityUIElement::takeSelection()
779 {
780 // FIXME: implement
781 }
782
addSelection()783 void AccessibilityUIElement::addSelection()
784 {
785 // FIXME: implement
786 }
787
removeSelection()788 void AccessibilityUIElement::removeSelection()
789 {
790 // FIXME: implement
791 }
792