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