AX: Expose table size and cell indexes on iOS
[WebKit-https.git] / Tools / DumpRenderTree / ios / AccessibilityUIElementIOS.mm
1 /*
2  * Copyright (C) 2009 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "config.h"
27 #import "DumpRenderTree.h"
28 #import "AccessibilityUIElement.h"
29
30 #import "AccessibilityCommonMac.h"
31 #import "AccessibilityNotificationHandler.h"
32 #import <Foundation/Foundation.h>
33 #import <JavaScriptCore/JSRetainPtr.h>
34 #import <JavaScriptCore/JSStringRef.h>
35 #import <JavaScriptCore/JSStringRefCF.h>
36 #import <WebCore/TextGranularity.h>
37 #import <WebKit/WebFrame.h>
38 #import <WebKit/WebHTMLView.h>
39 #import <wtf/RetainPtr.h>
40 #import <wtf/Vector.h>
41
42 #import <UIKit/UIKit.h>
43
44 typedef void (*AXPostedNotificationCallback)(id element, NSString* notification, void* context);
45
46 AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element)
47     : m_element(element)
48     , m_notificationHandler(0)
49 {
50     [m_element retain];
51 }
52
53 AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement& other)
54     : m_element(other.m_element)
55     , m_notificationHandler(0)
56
57 {
58     [m_element retain];
59 }
60
61 AccessibilityUIElement::~AccessibilityUIElement()
62 {
63     [m_element release];
64 }
65
66 @interface NSObject (UIAccessibilityHidden)
67 - (id)accessibilityHitTest:(CGPoint)point;
68 - (id)accessibilityLinkedElement;
69 - (NSRange)accessibilityColumnRange;
70 - (NSRange)accessibilityRowRange;
71 - (id)accessibilityElementForRow:(NSInteger)row andColumn:(NSInteger)column;
72 - (NSURL *)accessibilityURL;
73 - (NSArray *)accessibilityHeaderElements;
74 - (NSString *)accessibilityPlaceholderValue;
75 - (NSString *)stringForRange:(NSRange)range;
76 - (NSArray *)elementsForRange:(NSRange)range;
77 - (NSString *)selectionRangeString;
78 - (CGPoint)accessibilityClickPoint;
79 - (void)accessibilityModifySelection:(WebCore::TextGranularity)granularity increase:(BOOL)increase;
80 - (void)accessibilitySetPostedNotificationCallback:(AXPostedNotificationCallback)function withContext:(void*)context;
81 - (CGFloat)_accessibilityMinValue;
82 - (CGFloat)_accessibilityMaxValue;
83 - (void)_accessibilitySetValue:(NSString *)value;
84 - (void)_accessibilityActivate;
85 - (UIAccessibilityTraits)_axSelectedTrait;
86 - (NSString *)accessibilityARIACurrentStatus;
87 - (NSUInteger)accessibilityRowCount;
88 - (NSUInteger)accessibilityColumnCount;
89 - (NSUInteger)accessibilityARIARowCount;
90 - (NSUInteger)accessibilityARIAColumnCount;
91 - (NSUInteger)accessibilityARIARowIndex;
92 - (NSUInteger)accessibilityARIAColumnIndex;
93 @end
94
95 @interface NSObject (WebAccessibilityObjectWrapperPrivate)
96 - (CGPathRef)_accessibilityPath;
97 @end
98
99 static JSStringRef concatenateAttributeAndValue(NSString* attribute, NSString* value)
100 {
101     Vector<UniChar> buffer([attribute length]);
102     [attribute getCharacters:buffer.data()];
103     buffer.append(':');
104     buffer.append(' ');
105     
106     Vector<UniChar> valueBuffer([value length]);
107     [value getCharacters:valueBuffer.data()];
108     buffer.appendVector(valueBuffer);
109     
110     return JSStringCreateWithCharacters(buffer.data(), buffer.size());
111 }
112
113 #pragma mark iPhone Attributes
114
115 JSStringRef AccessibilityUIElement::identifier()
116 {
117     return concatenateAttributeAndValue(@"AXIdentifier", [m_element accessibilityIdentifier]);
118 }
119
120 JSStringRef AccessibilityUIElement::traits()
121 {
122     return concatenateAttributeAndValue(@"AXTraits", [NSString stringWithFormat:@"%qu", [m_element accessibilityTraits]]);
123 }
124
125 int AccessibilityUIElement::elementTextPosition()
126 {
127     NSRange range = [[m_element valueForKey:@"elementTextRange"] rangeValue];
128     return range.location;
129 }
130
131 int AccessibilityUIElement::elementTextLength()
132 {
133     NSRange range = [[m_element valueForKey:@"elementTextRange"] rangeValue];
134     return range.length;    
135 }
136
137 JSStringRef AccessibilityUIElement::url()
138 {
139     NSURL *url = [m_element accessibilityURL];
140     return [[url absoluteString] createJSStringRef];    
141 }
142
143 double AccessibilityUIElement::x()
144 {
145     CGRect frame = [m_element accessibilityFrame];
146     return frame.origin.x;
147 }
148
149 double AccessibilityUIElement::y()
150 {
151     CGRect frame = [m_element accessibilityFrame];
152     return frame.origin.y;
153 }
154
155 double AccessibilityUIElement::width()
156 {
157     CGRect frame = [m_element accessibilityFrame];
158     return frame.size.width;
159 }
160
161 double AccessibilityUIElement::height()
162 {
163     CGRect frame = [m_element accessibilityFrame];
164     return frame.size.height;
165 }
166
167 double AccessibilityUIElement::clickPointX()
168 {
169     CGPoint centerPoint = [m_element accessibilityClickPoint];
170     return centerPoint.x;
171 }
172
173 double AccessibilityUIElement::clickPointY()
174 {
175     CGPoint centerPoint = [m_element accessibilityClickPoint];
176     return centerPoint.y;
177 }
178
179 void AccessibilityUIElement::getChildren(Vector<AccessibilityUIElement>& elementVector)
180 {
181     NSInteger childCount = [m_element accessibilityElementCount];
182     for (NSInteger k = 0; k < childCount; ++k)
183         elementVector.append(AccessibilityUIElement([m_element accessibilityElementAtIndex:k]));
184 }
185
186 void AccessibilityUIElement::getChildrenWithRange(Vector<AccessibilityUIElement>& elementVector, unsigned location, unsigned length)
187 {
188     // accessibilityElementAtIndex: takes an NSInteger.
189     // We want to preserve that in order to test against invalid indexes being input.
190     NSInteger maxValue = static_cast<NSInteger>(location + length);
191     for (NSInteger k = location; k < maxValue; ++k)
192         elementVector.append(AccessibilityUIElement([m_element accessibilityElementAtIndex:k]));    
193 }
194
195 int AccessibilityUIElement::childrenCount()
196 {
197     Vector<AccessibilityUIElement> children;
198     getChildren(children);
199     
200     return children.size();
201 }
202
203 AccessibilityUIElement AccessibilityUIElement::elementAtPoint(int x, int y)
204 {
205     id element = [m_element accessibilityHitTest:NSMakePoint(x, y)];
206     if (!element)
207         return nil;
208     
209     return AccessibilityUIElement(element); 
210 }
211
212 unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element)
213 {
214     return 0;
215 }
216
217 AccessibilityUIElement AccessibilityUIElement::getChildAtIndex(unsigned index)
218 {
219     Vector<AccessibilityUIElement> children;
220     getChildrenWithRange(children, index, 1);
221     
222     if (children.size() == 1)
223         return children[0];
224     return nil;
225 }
226
227 AccessibilityUIElement AccessibilityUIElement::headerElementAtIndex(unsigned index)
228 {
229     NSArray *headers = [m_element accessibilityHeaderElements];
230     if (index < [headers count])
231         return [headers objectAtIndex:index];
232     
233     return 0;
234 }
235
236 AccessibilityUIElement AccessibilityUIElement::linkedElement()
237 {
238     id linkedElement = [m_element accessibilityLinkedElement];
239     if (linkedElement)
240         return AccessibilityUIElement(linkedElement);
241     
242     return 0;
243 }
244
245 AccessibilityUIElement AccessibilityUIElement::linkedUIElementAtIndex(unsigned index)
246 {
247     // FIXME: implement
248     return 0;
249 }
250
251 AccessibilityUIElement AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index)
252 {
253     return 0;
254 }
255
256 AccessibilityUIElement AccessibilityUIElement::ariaFlowToElementAtIndex(unsigned index)
257 {
258     return 0;
259 }
260
261 AccessibilityUIElement AccessibilityUIElement::ariaControlsElementAtIndex(unsigned index)
262 {
263     return 0;
264 }
265
266 AccessibilityUIElement AccessibilityUIElement::disclosedRowAtIndex(unsigned index)
267 {
268     return 0;
269 }
270
271 AccessibilityUIElement AccessibilityUIElement::selectedRowAtIndex(unsigned index)
272 {
273     return 0;
274 }
275
276 AccessibilityUIElement AccessibilityUIElement::rowAtIndex(unsigned index)
277 {
278     return 0;
279 }
280
281 AccessibilityUIElement AccessibilityUIElement::titleUIElement()
282 {
283     return 0;
284 }
285
286 AccessibilityUIElement AccessibilityUIElement::parentElement()
287 {
288     id accessibilityObject = [m_element accessibilityContainer];
289     if (accessibilityObject)
290         return AccessibilityUIElement(accessibilityObject);
291     
292     return nil;
293 }
294
295 AccessibilityUIElement AccessibilityUIElement::disclosedByRow()
296 {
297     return 0;
298 }
299
300 void AccessibilityUIElement::increaseTextSelection()
301 {
302     [m_element accessibilityModifySelection:WebCore::CharacterGranularity increase:YES];
303 }
304
305 void AccessibilityUIElement::decreaseTextSelection()
306 {
307     [m_element accessibilityModifySelection:WebCore::CharacterGranularity increase:NO];    
308 }
309
310 JSStringRef AccessibilityUIElement::stringForSelection() 
311
312     NSString *stringForRange = [m_element selectionRangeString];
313     if (!stringForRange)
314         return 0;
315     
316     return [stringForRange createJSStringRef];
317 }
318
319 JSStringRef AccessibilityUIElement::stringForRange(unsigned location, unsigned length) 
320
321     NSString *stringForRange = [m_element stringForRange:NSMakeRange(location, length)];
322     if (!stringForRange)
323         return 0;
324     
325     return [stringForRange createJSStringRef];
326 }
327
328 JSStringRef AccessibilityUIElement::attributedStringForRange(unsigned, unsigned)
329 {
330     return JSStringCreateWithCharacters(0, 0);
331 }
332
333 bool AccessibilityUIElement::attributedStringRangeIsMisspelled(unsigned, unsigned)
334 {
335     return false;
336 }
337
338
339 void AccessibilityUIElement::elementsForRange(unsigned location, unsigned length, Vector<AccessibilityUIElement>& elements)
340
341     NSArray *elementsForRange = [m_element elementsForRange:NSMakeRange(location, length)];
342     for (id object in elementsForRange) {
343         AccessibilityUIElement element = AccessibilityUIElement(object);
344         elements.append(element);
345     }
346 }
347
348 static void _CGPathEnumerationIteration(void *info, const CGPathElement *element)
349 {
350     NSMutableString *result = (NSMutableString *)info;
351     switch (element->type) {
352     case kCGPathElementMoveToPoint:
353         [result appendString:@"\tMove to point\n"];
354         break;
355         
356     case kCGPathElementAddLineToPoint:
357         [result appendString:@"\tLine to\n"];
358         break;
359         
360     case kCGPathElementAddQuadCurveToPoint:
361         [result appendString:@"\tQuad curve to\n"];
362         break;
363         
364     case kCGPathElementAddCurveToPoint:
365         [result appendString:@"\tCurve to\n"];
366         break;
367         
368     case kCGPathElementCloseSubpath:
369         [result appendString:@"\tClose\n"];
370         break;
371     }
372 }
373
374 JSStringRef AccessibilityUIElement::pathDescription() const
375 {
376     NSMutableString *result = [NSMutableString stringWithString:@"\nStart Path\n"];
377     CGPathRef pathRef = [m_element _accessibilityPath];
378     
379     CGPathApply(pathRef, result, _CGPathEnumerationIteration);
380     
381     return [result createJSStringRef];
382 }
383
384 #pragma mark Unused
385
386 void AccessibilityUIElement::getLinkedUIElements(Vector<AccessibilityUIElement>& elementVector)
387 {
388 }
389
390 void AccessibilityUIElement::getDocumentLinks(Vector<AccessibilityUIElement>& elementVector)
391 {
392 }
393
394 JSStringRef AccessibilityUIElement::attributesOfLinkedUIElements()
395 {
396     return JSStringCreateWithCharacters(0, 0);
397 }
398
399 JSStringRef AccessibilityUIElement::attributesOfDocumentLinks()
400 {
401     return JSStringCreateWithCharacters(0, 0);
402 }
403
404 JSStringRef AccessibilityUIElement::attributesOfChildren()
405 {
406     return JSStringCreateWithCharacters(0, 0);
407 }
408
409 JSStringRef AccessibilityUIElement::allAttributes()
410 {
411     return JSStringCreateWithCharacters(0, 0);
412 }
413
414 JSStringRef AccessibilityUIElement::stringAttributeValue(JSStringRef attribute)
415 {
416     if (JSStringIsEqualToUTF8CString(attribute, "AXPlaceholderValue"))
417         return [[m_element accessibilityPlaceholderValue] createJSStringRef];
418     
419     if (JSStringIsEqualToUTF8CString(attribute, "AXARIACurrent"))
420         return [[m_element accessibilityARIACurrentStatus] createJSStringRef];
421     
422     return JSStringCreateWithCharacters(0, 0);
423 }
424
425 bool AccessibilityUIElement::isPressActionSupported()
426 {
427     return false;
428 }
429
430 bool AccessibilityUIElement::isIncrementActionSupported()
431 {
432     return false;
433 }
434
435 bool AccessibilityUIElement::isDecrementActionSupported()
436 {
437     return false;
438 }
439
440 bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute)
441 {
442     return false;
443 }
444
445 bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
446 {
447     return false;
448 }
449
450 bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute)
451 {
452     return false;
453 }
454
455 JSStringRef AccessibilityUIElement::parameterizedAttributeNames()
456 {
457     return JSStringCreateWithCharacters(0, 0);
458 }
459
460 JSStringRef AccessibilityUIElement::role()
461 {
462     return JSStringCreateWithCharacters(0, 0);
463 }
464
465 JSStringRef AccessibilityUIElement::subrole()
466 {
467     return JSStringCreateWithCharacters(0, 0);
468 }
469
470 bool AccessibilityUIElement::scrollPageUp()
471 {
472     return [m_element accessibilityScroll:UIAccessibilityScrollDirectionUp];
473 }
474
475 bool AccessibilityUIElement::scrollPageDown()
476 {
477     return [m_element accessibilityScroll:UIAccessibilityScrollDirectionDown];
478 }
479 bool AccessibilityUIElement::scrollPageLeft()
480 {
481     return [m_element accessibilityScroll:UIAccessibilityScrollDirectionLeft];
482 }
483
484 bool AccessibilityUIElement::scrollPageRight()
485 {
486     return [m_element accessibilityScroll:UIAccessibilityScrollDirectionRight];
487 }
488
489 JSStringRef AccessibilityUIElement::roleDescription()
490 {
491     return JSStringCreateWithCharacters(0, 0);
492 }
493
494 JSStringRef AccessibilityUIElement::computedRoleString()
495 {
496     // FIXME: implement
497     return JSStringCreateWithCharacters(0, 0);
498 }
499
500 JSStringRef AccessibilityUIElement::title()
501 {
502     return JSStringCreateWithCharacters(0, 0);
503 }
504
505 JSStringRef AccessibilityUIElement::description()
506 {
507     return concatenateAttributeAndValue(@"AXLabel", [m_element accessibilityLabel]);
508 }
509
510 JSStringRef AccessibilityUIElement::orientation() const
511 {
512     return JSStringCreateWithCharacters(0, 0);
513 }
514
515 JSStringRef AccessibilityUIElement::stringValue()
516 {
517     return concatenateAttributeAndValue(@"AXValue", [m_element accessibilityValue]);
518 }
519
520 JSStringRef AccessibilityUIElement::language()
521 {
522     return JSStringCreateWithCharacters(0, 0);
523 }
524
525 JSStringRef AccessibilityUIElement::helpText() const
526 {
527     return concatenateAttributeAndValue(@"AXHint", [m_element accessibilityHint]);
528 }
529
530 double AccessibilityUIElement::intValue() const
531 {
532     return 0.0f;
533 }
534
535 double AccessibilityUIElement::minValue()
536 {
537     return [m_element _accessibilityMinValue];
538 }
539
540 double AccessibilityUIElement::maxValue()
541 {
542     return [m_element _accessibilityMaxValue];
543 }
544
545 void AccessibilityUIElement::setValue(JSStringRef valueText)
546 {
547     [m_element _accessibilitySetValue:[NSString stringWithJSStringRef:valueText]];
548 }
549
550 JSStringRef AccessibilityUIElement::valueDescription()
551 {
552     return JSStringCreateWithCharacters(0, 0);
553 }
554
555 int AccessibilityUIElement::insertionPointLineNumber()
556 {
557     return -1;
558 }
559
560 bool AccessibilityUIElement::isEnabled()
561 {
562     return false;
563 }
564
565 bool AccessibilityUIElement::isRequired() const
566 {
567     return false;
568 }
569
570 bool AccessibilityUIElement::isFocused() const
571 {
572     // FIXME: implement
573     return false;
574 }
575
576 bool AccessibilityUIElement::isSelected() const
577 {
578     UIAccessibilityTraits traits = [m_element accessibilityTraits];
579     bool result = (traits & [m_element _axSelectedTrait]) == [m_element _axSelectedTrait];
580     return result;
581 }
582
583 bool AccessibilityUIElement::isExpanded() const
584 {
585     return false;
586 }
587
588 bool AccessibilityUIElement::isChecked() const
589 {
590     return false;
591 }
592
593 bool AccessibilityUIElement::isIndeterminate() const
594 {
595     // FIXME: implement
596     return false;
597 }
598
599 int AccessibilityUIElement::hierarchicalLevel() const
600 {
601     return 0;
602 }
603
604 bool AccessibilityUIElement::ariaIsGrabbed() const
605 {
606     return false;
607 }
608
609 JSStringRef AccessibilityUIElement::ariaDropEffects() const
610 {
611     return JSStringCreateWithCharacters(0, 0);
612 }
613
614 int AccessibilityUIElement::lineForIndex(int index)
615 {
616     return -1;
617 }
618
619 JSStringRef AccessibilityUIElement::boundsForRange(unsigned location, unsigned length)
620 {
621     return JSStringCreateWithCharacters(0, 0);
622 }
623
624 JSStringRef AccessibilityUIElement::attributesOfColumnHeaders()
625 {
626     return JSStringCreateWithCharacters(0, 0);
627 }
628
629 JSStringRef AccessibilityUIElement::attributesOfRowHeaders()
630 {
631     return JSStringCreateWithCharacters(0, 0);
632 }
633
634 JSStringRef AccessibilityUIElement::attributesOfColumns()
635 {
636     return JSStringCreateWithCharacters(0, 0);
637 }
638
639 JSStringRef AccessibilityUIElement::attributesOfRows()
640 {
641     return JSStringCreateWithCharacters(0, 0);
642 }
643
644 JSStringRef AccessibilityUIElement::attributesOfVisibleCells()
645 {
646     return JSStringCreateWithCharacters(0, 0);
647 }
648
649 JSStringRef AccessibilityUIElement::attributesOfHeader()
650 {
651     return JSStringCreateWithCharacters(0, 0);
652 }
653
654 int AccessibilityUIElement::rowCount()
655 {
656     return [m_element accessibilityRowCount];
657 }
658
659 int AccessibilityUIElement::columnCount()
660 {
661     return [m_element accessibilityColumnCount];
662 }
663
664 int AccessibilityUIElement::indexInTable()
665 {
666     return -1;
667 }
668
669 JSStringRef AccessibilityUIElement::rowIndexRange()
670 {
671     NSRange range = [m_element accessibilityRowRange];
672     NSMutableString* rangeDescription = [NSMutableString stringWithFormat:@"{%lu, %lu}", (unsigned long)range.location, (unsigned long)range.length];
673     return [rangeDescription createJSStringRef];
674 }
675
676 JSStringRef AccessibilityUIElement::columnIndexRange()
677 {
678     NSRange range = [m_element accessibilityColumnRange];
679     NSMutableString* rangeDescription = [NSMutableString stringWithFormat:@"{%lu, %lu}", (unsigned long)range.location, (unsigned long)range.length];
680     return [rangeDescription createJSStringRef];    
681 }
682
683 AccessibilityUIElement AccessibilityUIElement::cellForColumnAndRow(unsigned col, unsigned row)
684 {
685     return AccessibilityUIElement([m_element accessibilityElementForRow:row andColumn:col]);
686 }
687
688 void AccessibilityUIElement::scrollToMakeVisible()
689 {
690     // FIXME: implement
691 }
692
693 void AccessibilityUIElement::scrollToMakeVisibleWithSubFocus(int x, int y, int width, int height)
694 {
695     // FIXME: implement
696 }
697
698 void AccessibilityUIElement::scrollToGlobalPoint(int x, int y)
699 {
700     // FIXME: implement
701 }
702
703 JSStringRef AccessibilityUIElement::selectedTextRange()
704 {
705     return JSStringCreateWithCharacters(0, 0);
706 }
707
708 void AccessibilityUIElement::assistiveTechnologySimulatedFocus()
709 {
710     [m_element accessibilityElementDidBecomeFocused];
711 }
712
713 void AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length)
714 {
715 }
716
717 void AccessibilityUIElement::increment()
718 {
719     [m_element accessibilityIncrement];
720 }
721
722 void AccessibilityUIElement::decrement()
723 {
724     [m_element accessibilityDecrement];
725 }
726
727 void AccessibilityUIElement::showMenu()
728 {
729 }
730
731 void AccessibilityUIElement::press()
732 {
733     [m_element _accessibilityActivate];
734 }
735
736 JSStringRef AccessibilityUIElement::accessibilityValue() const
737 {
738     // FIXME: implement
739     return JSStringCreateWithCharacters(0, 0);
740 }
741
742 JSStringRef AccessibilityUIElement::documentEncoding()
743 {
744     return JSStringCreateWithCharacters(0, 0);
745 }
746
747 JSStringRef AccessibilityUIElement::documentURI()
748 {
749     return JSStringCreateWithCharacters(0, 0);
750 }
751
752 bool AccessibilityUIElement::addNotificationListener(JSObjectRef functionCallback)
753 {
754     if (!functionCallback)
755         return false;
756     
757     // iOS programmers should not be adding more than one notification listener per element.
758     // Other platforms may be different.
759     if (m_notificationHandler)
760         return false;
761     m_notificationHandler = [[AccessibilityNotificationHandler alloc] init];
762     [m_notificationHandler setPlatformElement:platformUIElement()];
763     [m_notificationHandler setCallback:functionCallback];
764     [m_notificationHandler startObserving];
765     
766     return true;
767 }
768
769 void AccessibilityUIElement::removeNotificationListener()
770 {
771     // iOS programmers should not be trying to remove a listener that's already removed.
772     ASSERT(m_notificationHandler);
773     
774     [m_notificationHandler stopObserving];
775     [m_notificationHandler release];
776     m_notificationHandler = nil;
777 }
778
779 bool AccessibilityUIElement::isFocusable() const
780 {
781     // FIXME: implement
782     return false;
783 }
784
785 bool AccessibilityUIElement::isSelectable() const
786 {
787     // FIXME: implement
788     return false;
789 }
790
791 bool AccessibilityUIElement::isMultiSelectable() const
792 {
793     // FIXME: implement
794     return false;
795 }
796
797 bool AccessibilityUIElement::isSelectedOptionActive() const
798 {
799     // FIXME: implement
800     return false;
801 }
802
803 bool AccessibilityUIElement::isVisible() const
804 {
805     // FIXME: implement
806     return false;
807 }
808
809 bool AccessibilityUIElement::isOffScreen() const
810 {
811     // FIXME: implement
812     return false;
813 }
814
815 bool AccessibilityUIElement::isCollapsed() const
816 {
817     // FIXME: implement
818     return false;
819 }
820
821 bool AccessibilityUIElement::isIgnored() const
822 {
823     return ![m_element isAccessibilityElement];
824 }
825
826 bool AccessibilityUIElement::hasPopup() const
827 {
828     // FIXME: implement
829     return false;
830 }
831
832 void AccessibilityUIElement::takeFocus()
833 {
834     // FIXME: implement
835 }
836
837 void AccessibilityUIElement::takeSelection()
838 {
839     // FIXME: implement
840 }
841
842 void AccessibilityUIElement::addSelection()
843 {
844     // FIXME: implement
845 }
846
847 void AccessibilityUIElement::removeSelection()
848 {
849     // FIXME: implement
850 }
851
852 unsigned AccessibilityUIElement::uiElementCountForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
853 {
854     // FIXME: implement
855     return 0;
856 }
857
858 AccessibilityUIElement AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText, bool visibleOnly, bool immediateDescendantsOnly)
859 {
860     // FIXME: implement
861     return 0;
862 }
863
864 JSStringRef AccessibilityUIElement::selectTextWithCriteria(JSContextRef context, JSStringRef ambiguityResolution, JSValueRef searchStrings, JSStringRef replacementString, JSStringRef activity)
865 {
866     // FIXME: Implement.
867     return nullptr;
868 }
869
870 double AccessibilityUIElement::numberAttributeValue(JSStringRef attribute)
871 {
872     // Support test for table related attributes.
873     if (JSStringIsEqualToUTF8CString(attribute, "AXARIAColumnCount"))
874         return [m_element accessibilityARIAColumnCount];
875     if (JSStringIsEqualToUTF8CString(attribute, "AXARIARowCount"))
876         return [m_element accessibilityARIARowCount];
877     if (JSStringIsEqualToUTF8CString(attribute, "AXARIAColumnIndex"))
878         return [m_element accessibilityARIAColumnIndex];
879     if (JSStringIsEqualToUTF8CString(attribute, "AXARIARowIndex"))
880         return [m_element accessibilityARIARowIndex];
881     
882     return 0;
883 }
884
885 JSStringRef AccessibilityUIElement::classList() const
886 {
887     // FIXME: implement
888     return nullptr;
889 }
890
891 void AccessibilityUIElement::uiElementArrayAttributeValue(JSStringRef, Vector<AccessibilityUIElement>&) const
892 {
893     // FIXME: implement
894 }
895
896 void AccessibilityUIElement::columnHeaders(Vector<AccessibilityUIElement>&) const
897 {
898     // FIXME: implement
899 }
900
901 void AccessibilityUIElement::rowHeaders(Vector<AccessibilityUIElement>&) const
902 {
903     // FIXME: implement
904 }
905
906 unsigned AccessibilityUIElement::selectedChildrenCount() const
907 {
908     return 0;
909 }
910
911 AccessibilityUIElement AccessibilityUIElement::selectedChildAtIndex(unsigned) const
912 {
913     return 0;
914 }