BUILD FIX: Make AccessibilityUIElementIOS.mm build 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 <Foundation/Foundation.h>
32 #import <JavaScriptCore/JSRetainPtr.h>
33 #import <JavaScriptCore/JSStringRef.h>
34 #import <JavaScriptCore/JSStringRefCF.h>
35 #import <WebCore/TextGranularity.h>
36 #import <WebKit/WebFrame.h>
37 #import <WebKit/WebHTMLView.h>
38 #import <WebKit/WebTypesInternal.h>
39 #import <wtf/RetainPtr.h>
40 #import <wtf/Vector.h>
41
42 #if PLATFORM(IOS)
43
44 #import <UIKit/UIKit.h>
45
46 typedef void (*AXPostedNotificationCallback)(id element, NSString* notification, void* context);
47
48 AccessibilityUIElement::AccessibilityUIElement(PlatformUIElement element)
49     : m_element(element)
50 {
51     [m_element retain];
52 }
53
54 AccessibilityUIElement::AccessibilityUIElement(const AccessibilityUIElement& other)
55     : m_element(other.m_element)
56 {
57     [m_element retain];
58 }
59
60 AccessibilityUIElement::~AccessibilityUIElement()
61 {
62     [m_element release];
63 }
64
65 @interface NSObject (UIAccessibilityHidden)
66 - (id)accessibilityHitTest:(CGPoint)point;
67 - (id)accessibilityLinkedElement;
68 - (NSRange)accessibilityColumnRange;
69 - (NSRange)accessibilityRowRange;
70 - (id)accessibilityElementForRow:(NSInteger)row andColumn:(NSInteger)column;
71 - (NSURL *)accessibilityURL;
72 - (NSArray *)accessibilityHeaderElements;
73 - (NSString *)accessibilityPlaceholderValue;
74 - (NSString *)stringForRange:(NSRange)range;
75 - (NSArray *)elementsForRange:(NSRange)range;
76 - (NSString *)selectionRangeString;
77 - (CGPoint)accessibilityClickPoint;
78 - (void)accessibilityModifySelection:(WebCore::TextGranularity)granularity increase:(BOOL)increase;
79 - (void)accessibilitySetPostedNotificationCallback:(AXPostedNotificationCallback)function withContext:(void*)context;
80 @end
81
82 @interface NSObject (WebAccessibilityObjectWrapperPrivate)
83 - (CGPathRef)_accessibilityPath;
84 @end
85
86 static JSStringRef concatenateAttributeAndValue(NSString* attribute, NSString* value)
87 {
88     Vector<UniChar> buffer([attribute length]);
89     [attribute getCharacters:buffer.data()];
90     buffer.append(':');
91     buffer.append(' ');
92     
93     Vector<UniChar> valueBuffer([value length]);
94     [value getCharacters:valueBuffer.data()];
95     buffer.append(valueBuffer);
96     
97     return JSStringCreateWithCharacters(buffer.data(), buffer.size());
98 }
99
100 #pragma mark iPhone Attributes
101
102 JSStringRef AccessibilityUIElement::iphoneLabel()
103 {
104     return concatenateAttributeAndValue(@"AXLabel", [m_element accessibilityLabel]);
105 }
106
107 JSStringRef AccessibilityUIElement::iphoneHint()
108 {
109     return concatenateAttributeAndValue(@"AXHint", [m_element accessibilityHint]);
110 }
111
112 JSStringRef AccessibilityUIElement::iphoneValue()
113 {
114     return concatenateAttributeAndValue(@"AXValue", [m_element accessibilityValue]);
115 }
116
117 JSStringRef AccessibilityUIElement::iphoneIdentifier()
118 {
119     return concatenateAttributeAndValue(@"AXIdentifier", [m_element accessibilityIdentifier]);
120 }
121
122 JSStringRef AccessibilityUIElement::iphoneTraits()
123 {
124     return concatenateAttributeAndValue(@"AXTraits", [NSString stringWithFormat:@"%qu", [m_element accessibilityTraits]]);
125 }
126
127 bool AccessibilityUIElement::iphoneIsElement()
128 {
129     return [m_element isAccessibilityElement];
130 }
131
132 int AccessibilityUIElement::iphoneElementTextPosition()
133 {
134     NSRange range = [[m_element valueForKey:@"elementTextRange"] rangeValue];
135     return range.location;
136 }
137
138 int AccessibilityUIElement::iphoneElementTextLength()
139 {
140     NSRange range = [[m_element valueForKey:@"elementTextRange"] rangeValue];
141     return range.length;    
142 }
143
144 JSStringRef AccessibilityUIElement::url()
145 {
146     NSURL *url = [m_element accessibilityURL];
147     return [[url absoluteString] createJSStringRef];    
148 }
149
150 double AccessibilityUIElement::x()
151 {
152     CGRect frame = [m_element accessibilityFrame];
153     return frame.origin.x;
154 }
155
156 double AccessibilityUIElement::y()
157 {
158     CGRect frame = [m_element accessibilityFrame];
159     return frame.origin.y;
160 }
161
162 double AccessibilityUIElement::width()
163 {
164     CGRect frame = [m_element accessibilityFrame];
165     return frame.size.width;
166 }
167
168 double AccessibilityUIElement::height()
169 {
170     CGRect frame = [m_element accessibilityFrame];
171     return frame.size.height;
172 }
173
174 double AccessibilityUIElement::clickPointX()
175 {
176     CGPoint centerPoint = [m_element accessibilityClickPoint];
177     return centerPoint.x;
178 }
179
180 double AccessibilityUIElement::clickPointY()
181 {
182     CGPoint centerPoint = [m_element accessibilityClickPoint];
183     return centerPoint.y;
184 }
185
186 void AccessibilityUIElement::getChildren(Vector<AccessibilityUIElement>& elementVector)
187 {
188     NSInteger childCount = [m_element accessibilityElementCount];
189     for (NSInteger k = 0; k < childCount; ++k)
190         elementVector.append(AccessibilityUIElement([m_element accessibilityElementAtIndex:k]));
191 }
192
193 void AccessibilityUIElement::getChildrenWithRange(Vector<AccessibilityUIElement>& elementVector, unsigned location, unsigned length)
194 {
195     NSUInteger childCount = [m_element accessibilityElementCount];
196     for (NSUInteger k = location; k < childCount && k < (location+length); ++k)
197         elementVector.append(AccessibilityUIElement([m_element accessibilityElementAtIndex:k]));    
198 }
199
200 int AccessibilityUIElement::childrenCount()
201 {
202     Vector<AccessibilityUIElement> children;
203     getChildren(children);
204     
205     return children.size();
206 }
207
208 AccessibilityUIElement AccessibilityUIElement::elementAtPoint(int x, int y)
209 {
210     id element = [m_element accessibilityHitTest:NSMakePoint(x, y)];
211     if (!element)
212         return nil;
213     
214     return AccessibilityUIElement(element); 
215 }
216
217 unsigned AccessibilityUIElement::indexOfChild(AccessibilityUIElement* element)
218 {
219     return 0;
220 }
221
222 AccessibilityUIElement AccessibilityUIElement::getChildAtIndex(unsigned index)
223 {
224     Vector<AccessibilityUIElement> children;
225     getChildrenWithRange(children, index, 1);
226     
227     if (children.size() == 1)
228         return children[0];
229     return nil;
230 }
231
232 AccessibilityUIElement AccessibilityUIElement::headerElementAtIndex(unsigned index)
233 {
234     NSArray *headers = [m_element accessibilityHeaderElements];
235     if (index < [headers count])
236         return [headers objectAtIndex:index];
237     
238     return 0;
239 }
240
241 AccessibilityUIElement AccessibilityUIElement::linkedElement()
242 {
243     id linkedElement = [m_element accessibilityLinkedElement];
244     if (linkedElement)
245         return AccessibilityUIElement(linkedElement);
246     
247     return 0;
248 }
249
250 AccessibilityUIElement AccessibilityUIElement::linkedUIElementAtIndex(unsigned index)
251 {
252     // FIXME: implement
253     return 0;
254 }
255
256 AccessibilityUIElement AccessibilityUIElement::ariaOwnsElementAtIndex(unsigned index)
257 {
258     return 0;
259 }
260
261 AccessibilityUIElement AccessibilityUIElement::ariaFlowToElementAtIndex(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     return JSStringCreateWithCharacters(0, 0);
420 }
421
422 bool AccessibilityUIElement::isPressActionSupported()
423 {
424     return false;
425 }
426
427 bool AccessibilityUIElement::isIncrementActionSupported()
428 {
429     return false;
430 }
431
432 bool AccessibilityUIElement::isDecrementActionSupported()
433 {
434     return false;
435 }
436
437 bool AccessibilityUIElement::boolAttributeValue(JSStringRef attribute)
438 {
439     return false;
440 }
441
442 bool AccessibilityUIElement::isAttributeSettable(JSStringRef attribute)
443 {
444     return false;
445 }
446
447 bool AccessibilityUIElement::isAttributeSupported(JSStringRef attribute)
448 {
449     return false;
450 }
451
452 JSStringRef AccessibilityUIElement::parameterizedAttributeNames()
453 {
454     return JSStringCreateWithCharacters(0, 0);
455 }
456
457 JSStringRef AccessibilityUIElement::role()
458 {
459     return JSStringCreateWithCharacters(0, 0);
460 }
461
462 JSStringRef AccessibilityUIElement::subrole()
463 {
464     return JSStringCreateWithCharacters(0, 0);
465 }
466
467 JSStringRef AccessibilityUIElement::roleDescription()
468 {
469     return JSStringCreateWithCharacters(0, 0);
470 }
471
472 JSStringRef AccessibilityUIElement::title()
473 {
474     return JSStringCreateWithCharacters(0, 0);
475 }
476
477 JSStringRef AccessibilityUIElement::description()
478 {
479     return JSStringCreateWithCharacters(0, 0);
480 }    
481
482 JSStringRef AccessibilityUIElement::orientation() const
483 {
484     return JSStringCreateWithCharacters(0, 0);
485 }
486
487 JSStringRef AccessibilityUIElement::stringValue()
488 {
489     return JSStringCreateWithCharacters(0, 0);
490 }
491
492 JSStringRef AccessibilityUIElement::language()
493 {
494     return JSStringCreateWithCharacters(0, 0);
495 }
496
497 JSStringRef AccessibilityUIElement::helpText() const
498 {
499     return JSStringCreateWithCharacters(0, 0);
500 }
501
502 double AccessibilityUIElement::intValue() const
503 {
504     return 0.0f;
505 }
506
507 double AccessibilityUIElement::minValue()
508 {
509     return 0.0f;
510 }
511
512 double AccessibilityUIElement::maxValue()
513 {
514     return 0.0;
515 }
516
517 JSStringRef AccessibilityUIElement::valueDescription()
518 {
519     return JSStringCreateWithCharacters(0, 0);
520 }
521
522 int AccessibilityUIElement::insertionPointLineNumber()
523 {
524     return -1;
525 }
526
527 bool AccessibilityUIElement::isEnabled()
528 {
529     return false;
530 }
531
532 bool AccessibilityUIElement::isRequired() const
533 {
534     return false;
535 }
536
537 bool AccessibilityUIElement::isFocused() const
538 {
539     // FIXME: implement
540     return false;
541 }
542
543 bool AccessibilityUIElement::isSelected() const
544 {
545     UIAccessibilityTraits traits = [m_element accessibilityTraits];
546     return (traits & UIAccessibilityTraitSelected);
547 }
548
549 bool AccessibilityUIElement::isExpanded() const
550 {
551     return false;
552 }
553
554 bool AccessibilityUIElement::isChecked() const
555 {
556     return false;
557 }
558
559 int AccessibilityUIElement::hierarchicalLevel() const
560 {
561     return 0;
562 }
563
564 bool AccessibilityUIElement::ariaIsGrabbed() const
565 {
566     return false;
567 }
568
569 JSStringRef AccessibilityUIElement::ariaDropEffects() const
570 {
571     return JSStringCreateWithCharacters(0, 0);
572 }
573
574 int AccessibilityUIElement::lineForIndex(int index)
575 {
576     return -1;
577 }
578
579 JSStringRef AccessibilityUIElement::boundsForRange(unsigned location, unsigned length)
580 {
581     return JSStringCreateWithCharacters(0, 0);
582 }
583
584 JSStringRef AccessibilityUIElement::attributesOfColumnHeaders()
585 {
586     return JSStringCreateWithCharacters(0, 0);
587 }
588
589 JSStringRef AccessibilityUIElement::attributesOfRowHeaders()
590 {
591     return JSStringCreateWithCharacters(0, 0);
592 }
593
594 JSStringRef AccessibilityUIElement::attributesOfColumns()
595 {
596     return JSStringCreateWithCharacters(0, 0);
597 }
598
599 JSStringRef AccessibilityUIElement::attributesOfRows()
600 {
601     return JSStringCreateWithCharacters(0, 0);
602 }
603
604 JSStringRef AccessibilityUIElement::attributesOfVisibleCells()
605 {
606     return JSStringCreateWithCharacters(0, 0);
607 }
608
609 JSStringRef AccessibilityUIElement::attributesOfHeader()
610 {
611     return JSStringCreateWithCharacters(0, 0);
612 }
613
614 int AccessibilityUIElement::rowCount()
615 {
616     return -1;
617 }
618
619 int AccessibilityUIElement::columnCount()
620 {
621     return -1;
622 }
623
624 int AccessibilityUIElement::indexInTable()
625 {
626     return -1;
627 }
628
629 JSStringRef AccessibilityUIElement::rowIndexRange()
630 {
631     NSRange range = [m_element accessibilityRowRange];
632     NSMutableString* rangeDescription = [NSMutableString stringWithFormat:@"{%lu, %lu}", (unsigned long)range.location, (unsigned long)range.length];
633     return [rangeDescription createJSStringRef];
634 }
635
636 JSStringRef AccessibilityUIElement::columnIndexRange()
637 {
638     NSRange range = [m_element accessibilityColumnRange];
639     NSMutableString* rangeDescription = [NSMutableString stringWithFormat:@"{%lu, %lu}", (unsigned long)range.location, (unsigned long)range.length];
640     return [rangeDescription createJSStringRef];    
641 }
642
643 AccessibilityUIElement AccessibilityUIElement::cellForColumnAndRow(unsigned col, unsigned row)
644 {
645     return AccessibilityUIElement([m_element accessibilityElementForRow:row andColumn:col]);
646 }
647
648 JSStringRef AccessibilityUIElement::selectedTextRange()
649 {
650     return JSStringCreateWithCharacters(0, 0);
651 }
652
653 void AccessibilityUIElement::assistiveTechnologySimulatedFocus()
654 {
655     [m_element accessibilityElementDidBecomeFocused];
656 }
657
658 void AccessibilityUIElement::setSelectedTextRange(unsigned location, unsigned length)
659 {
660 }
661
662 void AccessibilityUIElement::increment()
663 {
664     [m_element accessibilityIncrement];
665 }
666
667 void AccessibilityUIElement::decrement()
668 {
669     [m_element accessibilityDecrement];
670 }
671
672 void AccessibilityUIElement::showMenu()
673 {
674 }
675
676 void AccessibilityUIElement::press()
677 {
678 }
679
680 JSStringRef AccessibilityUIElement::accessibilityValue() const
681 {
682     // FIXME: implement
683     return JSStringCreateWithCharacters(0, 0);
684 }
685
686 JSStringRef AccessibilityUIElement::documentEncoding()
687 {
688     return JSStringCreateWithCharacters(0, 0);
689 }
690
691 JSStringRef AccessibilityUIElement::documentURI()
692 {
693     return JSStringCreateWithCharacters(0, 0);
694 }
695
696 static void _accessibilityNotificationCallback(id element, NSString* notification, void* context)
697 {
698     if (!context)
699         return;
700     
701     JSObjectRef functionCallback = static_cast<JSObjectRef>(context);
702     
703     JSRetainPtr<JSStringRef> jsNotification(Adopt, [notification createJSStringRef]);
704     JSValueRef argument = JSValueMakeString([mainFrame globalContext], jsNotification.get());
705     JSObjectCallAsFunction([mainFrame globalContext], functionCallback, NULL, 1, &argument, NULL);
706 }
707
708 bool AccessibilityUIElement::addNotificationListener(JSObjectRef functionCallback)
709 {
710     if (!functionCallback)
711         return false;
712     
713     m_notificationFunctionCallback = functionCallback;
714     [platformUIElement() accessibilitySetPostedNotificationCallback:_accessibilityNotificationCallback withContext:reinterpret_cast<void*>(m_notificationFunctionCallback)];
715     return true;    
716 }
717
718 void AccessibilityUIElement::removeNotificationListener()
719 {
720     m_notificationFunctionCallback = 0;
721     [platformUIElement() accessibilitySetPostedNotificationCallback:nil withContext:nil];
722 }
723
724 bool AccessibilityUIElement::isFocusable() const
725 {
726     // FIXME: implement
727     return false;
728 }
729
730 bool AccessibilityUIElement::isSelectable() const
731 {
732     // FIXME: implement
733     return false;
734 }
735
736 bool AccessibilityUIElement::isMultiSelectable() const
737 {
738     // FIXME: implement
739     return false;
740 }
741
742 bool AccessibilityUIElement::isSelectedOptionActive() const
743 {
744     // FIXME: implement
745     return false;
746 }
747
748 bool AccessibilityUIElement::isVisible() const
749 {
750     // FIXME: implement
751     return false;
752 }
753
754 bool AccessibilityUIElement::isOffScreen() const
755 {
756     // FIXME: implement
757     return false;
758 }
759
760 bool AccessibilityUIElement::isCollapsed() const
761 {
762     // FIXME: implement
763     return false;
764 }
765
766 bool AccessibilityUIElement::isIgnored() const
767 {
768     // FIXME: implement
769     return false;
770 }
771
772 bool AccessibilityUIElement::hasPopup() const
773 {
774     // FIXME: implement
775     return false;
776 }
777
778 void AccessibilityUIElement::takeFocus()
779 {
780     // FIXME: implement
781 }
782
783 void AccessibilityUIElement::takeSelection()
784 {
785     // FIXME: implement
786 }
787
788 void AccessibilityUIElement::addSelection()
789 {
790     // FIXME: implement
791 }
792
793 void AccessibilityUIElement::removeSelection()
794 {
795     // FIXME: implement
796 }
797
798 AccessibilityUIElement AccessibilityUIElement::uiElementForSearchPredicate(JSContextRef context, AccessibilityUIElement* startElement, bool isDirectionNext, JSValueRef searchKey, JSStringRef searchText)
799 {
800     // FIXME: implement
801     return 0;
802 }
803
804 double AccessibilityUIElement::numberAttributeValue(JSStringRef attribute)
805 {
806     // FIXME: implement
807     return 0;
808 }
809 #endif // PLATFORM(IOS)