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