9dfbc6ce585f3cdaee2259ca6dec8e32661ab959
[WebKit-https.git] / Tools / DumpRenderTree / AccessibilityUIElement.cpp
1 /*
2  * Copyright (C) 2008, 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 #include "config.h"
27 #include "AccessibilityUIElement.h"
28
29 #include <JavaScriptCore/JSRetainPtr.h>
30
31 // Static Functions
32
33 static inline AccessibilityUIElement* toAXElement(JSObjectRef object)
34 {
35     // FIXME: We should ASSERT that it is the right class here.
36     return static_cast<AccessibilityUIElement*>(JSObjectGetPrivate(object));
37 }
38
39 static JSValueRef allAttributesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
40 {
41     JSRetainPtr<JSStringRef> attributes(Adopt, toAXElement(thisObject)->allAttributes());
42     return JSValueMakeString(context, attributes.get());
43 }
44
45 static JSValueRef attributesOfLinkedUIElementsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
46 {
47     JSRetainPtr<JSStringRef> linkedUIDescription(Adopt, toAXElement(thisObject)->attributesOfLinkedUIElements());
48     return JSValueMakeString(context, linkedUIDescription.get());
49 }
50
51 static JSValueRef attributesOfDocumentLinksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
52 {
53     JSRetainPtr<JSStringRef> linkedUIDescription(Adopt, toAXElement(thisObject)->attributesOfDocumentLinks());
54     return JSValueMakeString(context, linkedUIDescription.get());
55 }
56
57 static JSValueRef attributesOfChildrenCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
58 {
59     JSRetainPtr<JSStringRef> childrenDescription(Adopt, toAXElement(thisObject)->attributesOfChildren());
60     return JSValueMakeString(context, childrenDescription.get());
61 }
62
63 static JSValueRef parameterizedAttributeNamesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
64 {
65     JSRetainPtr<JSStringRef> parameterizedAttributeNames(Adopt, toAXElement(thisObject)->parameterizedAttributeNames());
66     return JSValueMakeString(context, parameterizedAttributeNames.get());
67 }
68
69 static JSValueRef attributesOfColumnHeadersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
70 {
71     JSRetainPtr<JSStringRef> attributesOfColumnHeaders(Adopt, toAXElement(thisObject)->attributesOfColumnHeaders());
72     return JSValueMakeString(context, attributesOfColumnHeaders.get());
73 }
74
75 static JSValueRef attributesOfRowHeadersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
76 {
77     JSRetainPtr<JSStringRef> attributesOfRowHeaders(Adopt, toAXElement(thisObject)->attributesOfRowHeaders());
78     return JSValueMakeString(context, attributesOfRowHeaders.get());
79 }
80
81 static JSValueRef attributesOfColumnsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
82 {
83     JSRetainPtr<JSStringRef> attributesOfColumns(Adopt, toAXElement(thisObject)->attributesOfColumns());
84     return JSValueMakeString(context, attributesOfColumns.get());
85 }
86
87 static JSValueRef attributesOfRowsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
88 {
89     JSRetainPtr<JSStringRef> attributesOfRows(Adopt, toAXElement(thisObject)->attributesOfRows());
90     return JSValueMakeString(context, attributesOfRows.get());
91 }
92
93 static JSValueRef attributesOfVisibleCellsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
94 {
95     JSRetainPtr<JSStringRef> attributesOfVisibleCells(Adopt, toAXElement(thisObject)->attributesOfVisibleCells());
96     return JSValueMakeString(context, attributesOfVisibleCells.get());
97 }
98
99 static JSValueRef attributesOfHeaderCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
100 {
101     JSRetainPtr<JSStringRef> attributesOfHeader(Adopt, toAXElement(thisObject)->attributesOfHeader());
102     return JSValueMakeString(context, attributesOfHeader.get());
103 }
104
105 static JSValueRef indexInTableCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
106 {
107     return JSValueMakeNumber(context, toAXElement(thisObject)->indexInTable());
108 }
109
110 static JSValueRef rowIndexRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
111 {
112     JSRetainPtr<JSStringRef> rowIndexRange(Adopt, toAXElement(thisObject)->rowIndexRange());
113     return JSValueMakeString(context, rowIndexRange.get());
114 }
115
116 static JSValueRef columnIndexRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
117 {
118     JSRetainPtr<JSStringRef> columnIndexRange(Adopt, toAXElement(thisObject)->columnIndexRange());
119     return JSValueMakeString(context, columnIndexRange.get());
120 }
121
122 static JSValueRef lineForIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
123 {
124     int indexNumber = -1;
125     if (argumentCount == 1)
126         indexNumber = JSValueToNumber(context, arguments[0], exception);
127     
128     return JSValueMakeNumber(context, toAXElement(thisObject)->lineForIndex(indexNumber));
129 }
130
131 static JSValueRef rangeForLineCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
132 {
133     int indexNumber = -1;
134     if (argumentCount == 1)
135         indexNumber = JSValueToNumber(context, arguments[0], exception);
136     
137     JSRetainPtr<JSStringRef> rangeLine(Adopt, toAXElement(thisObject)->rangeForLine(indexNumber));
138     return JSValueMakeString(context, rangeLine.get());
139 }
140
141 static JSValueRef boundsForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
142 {
143     unsigned location = UINT_MAX, length = 0;
144     if (argumentCount == 2) {
145         location = JSValueToNumber(context, arguments[0], exception);
146         length = JSValueToNumber(context, arguments[1], exception);
147     }
148
149     JSRetainPtr<JSStringRef> boundsDescription(Adopt, toAXElement(thisObject)->boundsForRange(location, length));
150     return JSValueMakeString(context, boundsDescription.get());    
151 }
152
153 static JSValueRef rangeForPositionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
154 {
155     int x = 0, y = 0;
156     if (argumentCount == 2) {
157         x = JSValueToNumber(context, arguments[0], exception);
158         y = JSValueToNumber(context, arguments[1], exception);
159     }
160     
161     JSRetainPtr<JSStringRef> rangeDescription(Adopt, toAXElement(thisObject)->rangeForPosition(x, y));
162     return JSValueMakeString(context, rangeDescription.get());    
163 }
164
165 static JSValueRef stringForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
166 {
167     unsigned location = UINT_MAX, length = 0;
168     if (argumentCount == 2) {
169         location = JSValueToNumber(context, arguments[0], exception);
170         length = JSValueToNumber(context, arguments[1], exception);
171     }
172     
173     JSRetainPtr<JSStringRef> stringDescription(Adopt, toAXElement(thisObject)->stringForRange(location, length));
174     return JSValueMakeString(context, stringDescription.get());    
175 }
176
177 static JSValueRef attributedStringForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
178 {
179     unsigned location = UINT_MAX, length = 0;
180     if (argumentCount == 2) {
181         location = JSValueToNumber(context, arguments[0], exception);
182         length = JSValueToNumber(context, arguments[1], exception);
183     }
184     
185     JSRetainPtr<JSStringRef> stringDescription(Adopt, toAXElement(thisObject)->attributedStringForRange(location, length));
186     return JSValueMakeString(context, stringDescription.get());    
187 }
188
189 static JSValueRef attributedStringRangeIsMisspelledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
190 {
191     unsigned location = UINT_MAX, length = 0;
192     if (argumentCount == 2) {
193         location = JSValueToNumber(context, arguments[0], exception);
194         length = JSValueToNumber(context, arguments[1], exception);
195     }
196     
197     return JSValueMakeBoolean(context, toAXElement(thisObject)->attributedStringRangeIsMisspelled(location, length));
198 }
199
200 static JSValueRef uiElementForSearchPredicateCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
201 {
202     AccessibilityUIElement* startElement = 0;
203     bool isDirectionNext = true;
204     JSStringRef searchKey = 0;
205     JSStringRef searchText = 0;
206     if (argumentCount == 4) {
207         JSObjectRef startElementObject = JSValueToObject(context, arguments[0], exception);
208         if (startElementObject)
209             startElement = toAXElement(startElementObject);
210         isDirectionNext = JSValueToBoolean(context, arguments[1]);
211         if (JSValueIsString(context, arguments[2]))
212             searchKey = JSValueToStringCopy(context, arguments[2], exception);
213         if (JSValueIsString(context, arguments[3]))
214             searchText = JSValueToStringCopy(context, arguments[3], exception);
215     }
216     
217     JSObjectRef resultObject = AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->uiElementForSearchPredicate(startElement, isDirectionNext, searchKey, searchText));
218     if (searchKey)
219         JSStringRelease(searchKey);
220     if (searchText)
221         JSStringRelease(searchText);
222     
223     return resultObject;
224 }
225
226 static JSValueRef indexOfChildCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
227 {
228     if (argumentCount != 1)
229         return 0;
230     
231     JSObjectRef otherElement = JSValueToObject(context, arguments[0], exception);
232     AccessibilityUIElement* childElement = toAXElement(otherElement);
233     return JSValueMakeNumber(context, (double)toAXElement(thisObject)->indexOfChild(childElement));
234 }
235
236 #if PLATFORM(IOS)
237
238 static JSValueRef headerElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
239 {
240     if (argumentCount != 1)
241         return 0;
242     
243     unsigned index = JSValueToNumber(context, arguments[0], exception);
244     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->headerElementAtIndex(index));
245 }
246
247 static JSValueRef linkedElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
248 {
249     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->linkedElement());
250 }
251
252 static JSValueRef elementsForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
253 {
254     if (argumentCount != 2)
255         return 0;
256     
257     unsigned location = JSValueToNumber(context, arguments[0], exception);
258     unsigned length = JSValueToNumber(context, arguments[1], exception);
259     
260     Vector<AccessibilityUIElement> elements;
261     toAXElement(thisObject)->elementsForRange(location, length, elements);
262     
263     unsigned elementsSize = elements.size();
264     JSValueRef valueElements[elementsSize];
265     for (unsigned k = 0; k < elementsSize; ++k)
266         valueElements[k] = AccessibilityUIElement::makeJSAccessibilityUIElement(context, elements[k]);
267     
268     return JSObjectMakeArray(context, elementsSize, valueElements, 0);
269 }
270
271 static JSValueRef increaseTextSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
272 {
273     toAXElement(thisObject)->increaseTextSelection();
274     return JSValueMakeUndefined(context);
275 }
276
277 static JSValueRef decreaseTextSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
278 {
279     toAXElement(thisObject)->decreaseTextSelection();
280     return JSValueMakeUndefined(context);
281 }
282
283 static JSValueRef assistiveTechnologySimulatedFocusCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
284 {
285     toAXElement(thisObject)->assistiveTechnologySimulatedFocus();
286     return JSValueMakeUndefined(context);
287 }
288
289 #endif
290
291 static JSValueRef childAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
292 {
293     int indexNumber = -1;
294     if (argumentCount == 1)
295         indexNumber = JSValueToNumber(context, arguments[0], exception);
296     
297     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->getChildAtIndex(indexNumber));
298 }
299
300 static JSValueRef selectedChildAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
301 {
302     int indexNumber = -1;
303     if (argumentCount == 1)
304         indexNumber = JSValueToNumber(context, arguments[0], exception);
305     
306     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->selectedChildAtIndex(indexNumber));
307 }
308
309 static JSValueRef linkedUIElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
310 {
311     int indexNumber = -1;
312     if (argumentCount == 1)
313         indexNumber = JSValueToNumber(context, arguments[0], exception);
314     
315     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->linkedUIElementAtIndex(indexNumber));
316 }
317
318 static JSValueRef disclosedRowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
319 {
320     int indexNumber = 0;
321     if (argumentCount == 1)
322         indexNumber = JSValueToNumber(context, arguments[0], exception);
323     
324     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->disclosedRowAtIndex(indexNumber));
325 }
326
327 static JSValueRef ariaOwnsElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
328 {
329     int indexNumber = 0;
330     if (argumentCount == 1)
331         indexNumber = JSValueToNumber(context, arguments[0], exception);
332     
333     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->ariaOwnsElementAtIndex(indexNumber));
334 }
335
336 static JSValueRef ariaFlowToElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
337 {
338     int indexNumber = 0;
339     if (argumentCount == 1)
340         indexNumber = JSValueToNumber(context, arguments[0], exception);
341     
342     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->ariaFlowToElementAtIndex(indexNumber));
343 }
344
345 static JSValueRef selectedRowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
346 {
347     int indexNumber = 0;
348     if (argumentCount == 1)
349         indexNumber = JSValueToNumber(context, arguments[0], exception);
350     
351     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->selectedRowAtIndex(indexNumber));
352 }
353
354 static JSValueRef rowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
355 {
356     int indexNumber = 0;
357     if (argumentCount == 1)
358         indexNumber = JSValueToNumber(context, arguments[0], exception);
359     
360     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->rowAtIndex(indexNumber));
361 }
362
363 static JSValueRef isEqualCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
364 {
365     JSObjectRef otherElement = 0;
366     if (argumentCount == 1)
367         otherElement = JSValueToObject(context, arguments[0], exception);
368     else
369         return JSValueMakeBoolean(context, false);
370     
371     return JSValueMakeBoolean(context, toAXElement(thisObject)->isEqual(toAXElement(otherElement)));
372 }
373
374 static JSValueRef setSelectedChildCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
375 {
376     JSObjectRef element = 0;
377     if (argumentCount == 1)
378         element = JSValueToObject(context, arguments[0], exception);
379
380     toAXElement(thisObject)->setSelectedChild(toAXElement(element));
381
382     return JSValueMakeUndefined(context);
383 }
384
385 static JSValueRef elementAtPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
386 {
387     int x = 0;
388     int y = 0;
389     if (argumentCount == 2) {
390         x = JSValueToNumber(context, arguments[0], exception);
391         y = JSValueToNumber(context, arguments[1], exception);
392     }
393     
394     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->elementAtPoint(x, y));
395 }
396
397 static JSValueRef isAttributeSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
398 {
399     JSStringRef attribute = 0;
400     if (argumentCount == 1)
401         attribute = JSValueToStringCopy(context, arguments[0], exception);    
402     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isAttributeSupported(attribute));
403     if (attribute)
404         JSStringRelease(attribute);
405     return result;
406 }
407
408 static JSValueRef isAttributeSettableCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
409 {
410     JSStringRef attribute = 0;
411     if (argumentCount == 1)
412         attribute = JSValueToStringCopy(context, arguments[0], exception);    
413     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isAttributeSettable(attribute));
414     if (attribute)
415         JSStringRelease(attribute);
416     return result;
417 }
418
419 static JSValueRef isPressActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
420 {
421     return JSValueMakeBoolean(context, toAXElement(thisObject)->isPressActionSupported());
422 }
423
424 static JSValueRef isIncrementActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
425 {
426     return JSValueMakeBoolean(context, toAXElement(thisObject)->isIncrementActionSupported());
427 }
428
429 static JSValueRef isDecrementActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
430 {
431     return JSValueMakeBoolean(context, toAXElement(thisObject)->isDecrementActionSupported());
432 }
433
434 static JSValueRef boolAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
435 {
436     JSStringRef attribute = 0;
437     if (argumentCount == 1)
438         attribute = JSValueToStringCopy(context, arguments[0], exception);
439     bool val = toAXElement(thisObject)->boolAttributeValue(attribute);
440     JSValueRef result = JSValueMakeBoolean(context, val);
441     if (attribute)
442         JSStringRelease(attribute);
443     return result;
444 }
445
446 static JSValueRef stringAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
447 {
448     JSStringRef attribute = 0;
449     if (argumentCount == 1)
450         attribute = JSValueToStringCopy(context, arguments[0], exception);
451     JSRetainPtr<JSStringRef> stringAttributeValue(Adopt, toAXElement(thisObject)->stringAttributeValue(attribute));
452     JSValueRef result = JSValueMakeString(context, stringAttributeValue.get());
453     if (attribute)
454         JSStringRelease(attribute);
455     return result;
456 }
457
458 static JSValueRef uiElementAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
459 {
460     JSRetainPtr<JSStringRef> attribute;
461     if (argumentCount == 1)
462         attribute.adopt(JSValueToStringCopy(context, arguments[0], exception));
463     
464     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->uiElementAttributeValue(attribute.get()));
465 }
466
467 static JSValueRef numberAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
468 {
469     JSStringRef attribute = 0;
470     if (argumentCount == 1)
471         attribute = JSValueToStringCopy(context, arguments[0], exception);
472     double val = toAXElement(thisObject)->numberAttributeValue(attribute);
473     JSValueRef result = JSValueMakeNumber(context, val);
474     if (attribute)
475         JSStringRelease(attribute);
476     return result;
477 }
478
479 static JSValueRef cellForColumnAndRowCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
480 {
481     unsigned column = 0, row = 0;
482     if (argumentCount == 2) {
483         column = JSValueToNumber(context, arguments[0], exception);
484         row = JSValueToNumber(context, arguments[1], exception);
485     }
486     
487     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->cellForColumnAndRow(column, row));
488 }
489
490 static JSValueRef titleUIElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
491 {
492     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->titleUIElement());
493 }
494
495 static JSValueRef parentElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
496 {
497     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->parentElement());
498 }
499
500 static JSValueRef disclosedByRowCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
501 {
502     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->disclosedByRow());
503 }
504
505 static JSValueRef setSelectedTextRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
506 {
507     unsigned location = UINT_MAX, length = 0;
508     if (argumentCount == 2) {
509         location = JSValueToNumber(context, arguments[0], exception);
510         length = JSValueToNumber(context, arguments[1], exception);
511     }
512     
513     toAXElement(thisObject)->setSelectedTextRange(location, length);
514     return JSValueMakeUndefined(context);
515 }
516
517 static JSValueRef incrementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
518 {
519     toAXElement(thisObject)->increment();
520     return JSValueMakeUndefined(context);
521 }
522
523 static JSValueRef decrementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
524 {
525     toAXElement(thisObject)->decrement();
526     return JSValueMakeUndefined(context);
527 }
528
529 static JSValueRef showMenuCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
530 {
531     toAXElement(thisObject)->showMenu();
532     return JSValueMakeUndefined(context);
533 }
534
535 static JSValueRef pressCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
536 {
537     toAXElement(thisObject)->press();
538     return JSValueMakeUndefined(context);
539 }
540
541 static JSValueRef scrollToMakeVisibleCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
542 {
543     toAXElement(thisObject)->scrollToMakeVisible();
544     return JSValueMakeUndefined(context);
545 }
546
547 static JSValueRef takeFocusCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
548 {
549     toAXElement(thisObject)->takeFocus();
550     return JSValueMakeUndefined(context);
551 }
552
553 static JSValueRef takeSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
554 {
555     toAXElement(thisObject)->takeSelection();
556     return JSValueMakeUndefined(context);
557 }
558
559 static JSValueRef addSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
560 {
561     toAXElement(thisObject)->addSelection();
562     return JSValueMakeUndefined(context);
563 }
564
565 static JSValueRef removeSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
566 {
567     toAXElement(thisObject)->removeSelection();
568     return JSValueMakeUndefined(context);
569 }
570
571 static JSValueRef textMarkerRangeForElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
572 {
573     AccessibilityUIElement* uiElement = 0;
574     if (argumentCount == 1)
575         uiElement = toAXElement(JSValueToObject(context, arguments[0], exception));
576     
577     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeForElement(uiElement));
578 }
579
580 static JSValueRef attributedStringForTextMarkerRangeContainsAttributeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
581 {
582     AccessibilityTextMarkerRange* markerRange = 0;
583     JSStringRef attribute = 0;
584     if (argumentCount == 2) {
585         attribute = JSValueToStringCopy(context, arguments[0], exception);
586         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[1], exception));
587     }
588     
589     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->attributedStringForTextMarkerRangeContainsAttribute(attribute, markerRange));
590     if (attribute)
591         JSStringRelease(attribute);
592     
593     return result;    
594 }
595
596 static JSValueRef indexForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
597 {
598     AccessibilityTextMarker* marker = 0;
599     if (argumentCount == 1)
600         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
601     
602     return JSValueMakeNumber(context, toAXElement(thisObject)->indexForTextMarker(marker));
603 }
604
605 static JSValueRef isTextMarkerValidCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
606 {
607     AccessibilityTextMarker* marker = 0;
608     if (argumentCount == 1)
609         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
610     
611     return JSValueMakeBoolean(context, toAXElement(thisObject)->isTextMarkerValid(marker));
612 }
613
614 static JSValueRef textMarkerForIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
615 {
616     int textIndex = 0;
617     if (argumentCount == 1)
618         textIndex = JSValueToNumber(context, arguments[0], exception);
619     
620     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->textMarkerForIndex(textIndex));
621 }
622
623 static JSValueRef textMarkerRangeLengthCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
624 {
625     AccessibilityTextMarkerRange* range = 0;
626     if (argumentCount == 1)
627         range = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
628     
629     return JSValueMakeNumber(context, (int)toAXElement(thisObject)->textMarkerRangeLength(range));
630 }
631
632 static JSValueRef nextTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
633 {
634     AccessibilityTextMarker* marker = 0;
635     if (argumentCount == 1)
636         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
637     
638     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->nextTextMarker(marker));
639 }
640
641 static JSValueRef previousTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
642 {
643     AccessibilityTextMarker* marker = 0;
644     if (argumentCount == 1)
645         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
646     
647     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->previousTextMarker(marker));
648 }
649
650 static JSValueRef stringForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
651 {
652     AccessibilityTextMarkerRange* markerRange = 0;
653     if (argumentCount == 1)
654         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
655     
656     JSRetainPtr<JSStringRef> markerRangeString(Adopt, toAXElement(thisObject)->stringForTextMarkerRange(markerRange));
657     return JSValueMakeString(context, markerRangeString.get());    
658 }
659
660 static JSValueRef textMarkerForPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
661 {
662     int x = 0;
663     int y = 0;
664     if (argumentCount == 2) {
665         x = JSValueToNumber(context, arguments[0], exception);
666         y = JSValueToNumber(context, arguments[1], exception);
667     }
668     
669     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->textMarkerForPoint(x, y));
670 }
671
672 static JSValueRef textMarkerRangeForMarkersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
673 {
674     AccessibilityTextMarker* startMarker = 0;
675     AccessibilityTextMarker* endMarker = 0;
676     if (argumentCount == 2) {
677         startMarker = toTextMarker(JSValueToObject(context, arguments[0], exception));
678         endMarker = toTextMarker(JSValueToObject(context, arguments[1], exception));
679     }
680     
681     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeForMarkers(startMarker, endMarker));
682 }
683
684 static JSValueRef startTextMarkerForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
685 {
686     AccessibilityTextMarkerRange* markerRange = 0;
687     if (argumentCount == 1)
688         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
689     
690     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->startTextMarkerForTextMarkerRange(markerRange));
691 }
692
693 static JSValueRef endTextMarkerForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
694 {
695     AccessibilityTextMarkerRange* markerRange = 0;
696     if (argumentCount == 1)
697         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
698     
699     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->endTextMarkerForTextMarkerRange(markerRange));
700 }
701
702 static JSValueRef accessibilityElementForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
703 {
704     AccessibilityTextMarker* marker = 0;
705     if (argumentCount == 1)
706         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
707     
708     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->accessibilityElementForTextMarker(marker));
709 }
710
711 // Static Value Getters
712
713 static JSValueRef getARIADropEffectsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
714 {
715     JSRetainPtr<JSStringRef> dropEffects(Adopt, toAXElement(thisObject)->ariaDropEffects());
716     return JSValueMakeString(context, dropEffects.get());
717 }
718
719 static JSValueRef getARIAIsGrabbedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
720 {
721     return JSValueMakeBoolean(context, toAXElement(thisObject)->ariaIsGrabbed());
722 }
723
724 static JSValueRef getIsValidCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
725 {
726     AccessibilityUIElement* uiElement = toAXElement(thisObject);
727     if (!uiElement->platformUIElement())
728         return JSValueMakeBoolean(context, false);
729     
730     // There might be other platform logic that one could check here...
731     
732     return JSValueMakeBoolean(context, true);
733 }
734
735 static JSValueRef getRoleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
736 {
737     JSRetainPtr<JSStringRef> role(Adopt, toAXElement(thisObject)->role());
738     return JSValueMakeString(context, role.get());
739 }
740
741 static JSValueRef getSubroleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
742 {
743     JSRetainPtr<JSStringRef> role(Adopt, toAXElement(thisObject)->subrole());
744     return JSValueMakeString(context, role.get());
745 }
746
747 static JSValueRef getRoleDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
748 {
749     JSRetainPtr<JSStringRef> roleDesc(Adopt, toAXElement(thisObject)->roleDescription());
750     return JSValueMakeString(context, roleDesc.get());
751 }
752
753 static JSValueRef getTitleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
754 {
755     JSRetainPtr<JSStringRef> title(Adopt, toAXElement(thisObject)->title());
756     return JSValueMakeString(context, title.get());
757 }
758
759 static JSValueRef getDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
760 {
761     JSRetainPtr<JSStringRef> description(Adopt, toAXElement(thisObject)->description());
762     return JSValueMakeString(context, description.get());
763 }
764
765 static JSValueRef getStringValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
766 {
767     JSRetainPtr<JSStringRef> stringValue(Adopt, toAXElement(thisObject)->stringValue());
768     return JSValueMakeString(context, stringValue.get());
769 }
770
771 static JSValueRef getLanguageCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
772 {
773     JSRetainPtr<JSStringRef> language(Adopt, toAXElement(thisObject)->language());
774     return JSValueMakeString(context, language.get());
775 }
776
777 static JSValueRef getHelpTextCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
778 {
779     JSRetainPtr<JSStringRef> language(Adopt, toAXElement(thisObject)->helpText());
780     return JSValueMakeString(context, language.get());
781 }
782
783 static JSValueRef getOrientationCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
784 {
785     JSRetainPtr<JSStringRef> orientation(Adopt, toAXElement(thisObject)->orientation());
786     return JSValueMakeString(context, orientation.get());
787 }
788
789 static JSValueRef getChildrenCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
790 {
791     return JSValueMakeNumber(context, toAXElement(thisObject)->childrenCount());
792 }
793
794 static JSValueRef rowCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
795 {
796     return JSValueMakeNumber(context, toAXElement(thisObject)->rowCount());
797 }
798
799 static JSValueRef columnCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
800 {
801     return JSValueMakeNumber(context, toAXElement(thisObject)->columnCount());
802 }
803
804 static JSValueRef getXCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
805 {
806     return JSValueMakeNumber(context, toAXElement(thisObject)->x());
807 }
808
809 static JSValueRef getYCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
810 {
811     return JSValueMakeNumber(context, toAXElement(thisObject)->y());
812 }
813
814 static JSValueRef getWidthCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
815 {
816     return JSValueMakeNumber(context, toAXElement(thisObject)->width());
817 }
818
819 static JSValueRef getHeightCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
820 {
821     return JSValueMakeNumber(context, toAXElement(thisObject)->height());
822 }
823
824 static JSValueRef getClickPointXCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
825 {
826     return JSValueMakeNumber(context, toAXElement(thisObject)->clickPointX());
827 }
828
829 static JSValueRef getClickPointYCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
830 {
831     return JSValueMakeNumber(context, toAXElement(thisObject)->clickPointY());
832 }
833
834 static JSValueRef getIntValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
835 {
836     return JSValueMakeNumber(context, toAXElement(thisObject)->intValue());
837 }
838
839 static JSValueRef getMinValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
840 {
841     return JSValueMakeNumber(context, toAXElement(thisObject)->minValue());
842 }
843
844 static JSValueRef getMaxValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
845 {
846     return JSValueMakeNumber(context, toAXElement(thisObject)->maxValue());
847 }
848
849 static JSValueRef getInsertionPointLineNumberCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
850 {
851     return JSValueMakeNumber(context, toAXElement(thisObject)->insertionPointLineNumber());
852 }
853
854 static JSValueRef getSelectedTextRangeCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
855 {
856     JSRetainPtr<JSStringRef> selectedTextRange(Adopt, toAXElement(thisObject)->selectedTextRange());
857     return JSValueMakeString(context, selectedTextRange.get());
858 }
859
860 static JSValueRef getIsEnabledCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
861 {
862     return JSValueMakeBoolean(context, toAXElement(thisObject)->isEnabled());
863 }
864
865 static JSValueRef getIsRequiredCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
866 {
867     return JSValueMakeBoolean(context, toAXElement(thisObject)->isRequired());
868 }
869
870 static JSValueRef getIsFocusedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
871 {
872     return JSValueMakeBoolean(context, toAXElement(thisObject)->isFocused());
873 }
874
875 static JSValueRef getIsFocusableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
876 {
877     return JSValueMakeBoolean(context, toAXElement(thisObject)->isFocusable());
878 }
879
880 static JSValueRef getIsSelectedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
881 {
882     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelected());
883 }
884
885 static JSValueRef getIsSelectableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
886 {
887     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelectable());
888 }
889
890 static JSValueRef getIsMultiSelectableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
891 {
892     return JSValueMakeBoolean(context, toAXElement(thisObject)->isMultiSelectable());
893 }
894
895 static JSValueRef getIsSelectedOptionActiveCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
896 {
897     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelectedOptionActive());
898 }
899
900 static JSValueRef getIsExpandedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
901 {
902     return JSValueMakeBoolean(context, toAXElement(thisObject)->isExpanded());
903 }
904
905 static JSValueRef getIsCheckedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
906 {
907     return JSValueMakeBoolean(context, toAXElement(thisObject)->isChecked());
908 }
909
910 static JSValueRef getIsVisibleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
911 {
912     return JSValueMakeBoolean(context, toAXElement(thisObject)->isVisible());
913 }
914
915 static JSValueRef getIsOffScreenCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
916 {
917     return JSValueMakeBoolean(context, toAXElement(thisObject)->isOffScreen());
918 }
919
920 static JSValueRef getIsCollapsedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
921 {
922     return JSValueMakeBoolean(context, toAXElement(thisObject)->isCollapsed());
923 }
924
925 static JSValueRef isIgnoredCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
926 {
927     return JSValueMakeBoolean(context, toAXElement(thisObject)->isIgnored());
928 }
929
930 static JSValueRef speakCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
931 {
932     JSRetainPtr<JSStringRef> speakString(Adopt, toAXElement(thisObject)->speak());
933     return JSValueMakeString(context, speakString.get());
934 }
935
936 static JSValueRef selectedChildrenCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
937 {
938     return JSValueMakeNumber(context, toAXElement(thisObject)->selectedChildrenCount());
939 }
940
941 static JSValueRef horizontalScrollbarCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
942 {
943     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->horizontalScrollbar());
944 }
945
946 static JSValueRef verticalScrollbarCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
947 {
948     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->verticalScrollbar());
949 }
950
951 static JSValueRef getHasPopupCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
952 {
953     return JSValueMakeBoolean(context, toAXElement(thisObject)->hasPopup());
954 }
955
956 static JSValueRef hierarchicalLevelCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
957 {
958     return JSValueMakeNumber(context, toAXElement(thisObject)->hierarchicalLevel());
959 }
960
961 static JSValueRef getValueDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
962 {
963     JSRetainPtr<JSStringRef> valueDescription(Adopt, toAXElement(thisObject)->valueDescription());
964     return JSValueMakeString(context, valueDescription.get());
965 }
966
967 static JSValueRef getAccessibilityValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
968 {
969     JSRetainPtr<JSStringRef> accessibilityValue(Adopt, toAXElement(thisObject)->accessibilityValue());
970     return JSValueMakeString(context, accessibilityValue.get());
971 }
972
973 static JSValueRef getDocumentEncodingCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
974 {
975     JSRetainPtr<JSStringRef> documentEncoding(Adopt, toAXElement(thisObject)->documentEncoding());
976     return JSValueMakeString(context, documentEncoding.get());
977 }
978
979 static JSValueRef getDocumentURICallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
980 {
981     JSRetainPtr<JSStringRef> documentURI(Adopt, toAXElement(thisObject)->documentURI());
982     return JSValueMakeString(context, documentURI.get());
983 }
984
985 static JSValueRef getURLCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
986 {
987     JSRetainPtr<JSStringRef> url(Adopt, toAXElement(thisObject)->url());
988     return JSValueMakeString(context, url.get());
989 }
990
991 static JSValueRef addNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
992 {
993     if (argumentCount != 1)
994         return JSValueMakeBoolean(context, false);
995     
996     JSObjectRef callback = JSValueToObject(context, arguments[0], exception);
997     bool succeeded = toAXElement(thisObject)->addNotificationListener(callback);
998     return JSValueMakeBoolean(context, succeeded);
999 }
1000
1001 static JSValueRef removeNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1002 {
1003     toAXElement(thisObject)->removeNotificationListener();
1004     return JSValueMakeUndefined(context);
1005 }
1006
1007 #if PLATFORM(IOS)
1008
1009 static JSValueRef stringForSelectionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1010 {
1011     JSRetainPtr<JSStringRef> labelString(Adopt, toAXElement(thisObject)->stringForSelection());
1012     return JSValueMakeString(context, labelString.get());
1013 }
1014
1015 static JSValueRef getIPhoneLabelCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1016 {
1017     JSRetainPtr<JSStringRef> labelString(Adopt, toAXElement(thisObject)->iphoneLabel());
1018     return JSValueMakeString(context, labelString.get());
1019 }
1020
1021 static JSValueRef getIPhoneHintCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1022 {
1023     JSRetainPtr<JSStringRef> hintString(Adopt, toAXElement(thisObject)->iphoneHint());
1024     return JSValueMakeString(context, hintString.get());
1025 }
1026
1027 static JSValueRef getIPhoneValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1028 {
1029     JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->iphoneValue());
1030     return JSValueMakeString(context, valueString.get());
1031 }
1032
1033 static JSValueRef getIPhoneIdentifierCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1034 {
1035     JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->iphoneIdentifier());
1036     return JSValueMakeString(context, valueString.get());
1037 }
1038
1039
1040 static JSValueRef getIPhoneTraitsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1041 {
1042     JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->iphoneTraits());
1043     return JSValueMakeString(context, valueString.get());
1044 }
1045
1046 static JSValueRef getIPhoneIsElementCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1047 {
1048     return JSValueMakeBoolean(context, toAXElement(thisObject)->iphoneIsElement());
1049 }
1050
1051 static JSValueRef getIPhoneElementTextPositionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1052 {
1053     return JSValueMakeNumber(context, toAXElement(thisObject)->iphoneElementTextPosition());
1054 }
1055
1056 static JSValueRef getIPhoneElementTextLengthCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1057 {
1058     return JSValueMakeNumber(context, toAXElement(thisObject)->iphoneElementTextLength());
1059 }
1060
1061 #endif // PLATFORM(IOS)
1062
1063 #if PLATFORM(MAC) && !PLATFORM(IOS)
1064 static JSValueRef supportedActionsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1065 {
1066     JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->supportedActions());
1067     return JSValueMakeString(context, valueString.get());
1068 }
1069 #endif
1070
1071 // Implementation
1072
1073 // Unsupported methods on various platforms.
1074 #if !PLATFORM(MAC) || PLATFORM(IOS)
1075 JSStringRef AccessibilityUIElement::speak() { return 0; }
1076 JSStringRef AccessibilityUIElement::rangeForLine(int line) { return 0; }
1077 JSStringRef AccessibilityUIElement::rangeForPosition(int, int) { return 0; }
1078 void AccessibilityUIElement::setSelectedChild(AccessibilityUIElement*) const { }
1079 unsigned AccessibilityUIElement::selectedChildrenCount() const { return 0; }
1080 AccessibilityUIElement AccessibilityUIElement::selectedChildAtIndex(unsigned) const { return 0; }
1081 AccessibilityUIElement AccessibilityUIElement::horizontalScrollbar() const { return 0; }
1082 AccessibilityUIElement AccessibilityUIElement::verticalScrollbar() const { return 0; }
1083 AccessibilityUIElement AccessibilityUIElement::uiElementAttributeValue(JSStringRef) const { return 0; }
1084 #endif
1085
1086 #if !PLATFORM(WIN)
1087 bool AccessibilityUIElement::isEqual(AccessibilityUIElement* otherElement)
1088 {
1089     if (!otherElement)
1090         return false;
1091     return platformUIElement() == otherElement->platformUIElement();
1092 }
1093 #endif
1094
1095 #if !SUPPORTS_AX_TEXTMARKERS
1096
1097 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForElement(AccessibilityUIElement*)
1098 {
1099     return 0;
1100 }
1101
1102 int AccessibilityUIElement::textMarkerRangeLength(AccessibilityTextMarkerRange*)
1103 {
1104     return 0;
1105 }
1106
1107 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForMarkers(AccessibilityTextMarker*, AccessibilityTextMarker*)
1108 {
1109     return 0;
1110 }
1111
1112 AccessibilityTextMarker AccessibilityUIElement::startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
1113 {
1114     return 0;
1115 }
1116
1117 AccessibilityTextMarker AccessibilityUIElement::endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
1118 {
1119     return 0;   
1120 }
1121
1122 AccessibilityUIElement AccessibilityUIElement::accessibilityElementForTextMarker(AccessibilityTextMarker*)
1123 {
1124     return 0;
1125 }
1126
1127 AccessibilityTextMarker AccessibilityUIElement::textMarkerForPoint(int x, int y)
1128 {
1129     return 0;
1130 }
1131
1132 AccessibilityTextMarker AccessibilityUIElement::previousTextMarker(AccessibilityTextMarker*)
1133 {
1134     return 0;    
1135 }
1136
1137 AccessibilityTextMarker AccessibilityUIElement::nextTextMarker(AccessibilityTextMarker*)
1138 {
1139     return 0;
1140 }
1141
1142 JSStringRef AccessibilityUIElement::stringForTextMarkerRange(AccessibilityTextMarkerRange*)
1143 {
1144     return 0;
1145 }
1146
1147 bool AccessibilityUIElement::attributedStringForTextMarkerRangeContainsAttribute(JSStringRef, AccessibilityTextMarkerRange*)
1148 {
1149     return false;
1150 }
1151
1152 int AccessibilityUIElement::indexForTextMarker(AccessibilityTextMarker*)
1153 {
1154     return -1;
1155 }
1156
1157 bool AccessibilityUIElement::isTextMarkerValid(AccessibilityTextMarker*)
1158 {
1159     return false;
1160 }
1161
1162 AccessibilityTextMarker AccessibilityUIElement::textMarkerForIndex(int)
1163 {
1164     return 0;
1165 }
1166
1167 #endif
1168
1169 // Destruction
1170
1171 static void finalize(JSObjectRef thisObject)
1172 {
1173     delete toAXElement(thisObject);
1174 }
1175
1176 // Object Creation
1177
1178 JSObjectRef AccessibilityUIElement::makeJSAccessibilityUIElement(JSContextRef context, const AccessibilityUIElement& element)
1179 {
1180     return JSObjectMake(context, AccessibilityUIElement::getJSClass(), new AccessibilityUIElement(element));
1181 }
1182
1183 JSClassRef AccessibilityUIElement::getJSClass()
1184 {
1185     static JSStaticValue staticValues[] = {
1186         { "accessibilityValue", getAccessibilityValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1187         { "role", getRoleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1188         { "subrole", getSubroleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1189         { "roleDescription", getRoleDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1190         { "title", getTitleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1191         { "description", getDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1192         { "language", getLanguageCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1193         { "helpText", getHelpTextCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1194         { "stringValue", getStringValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1195         { "x", getXCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1196         { "y", getYCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1197         { "width", getWidthCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1198         { "height", getHeightCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1199         { "clickPointX", getClickPointXCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1200         { "clickPointY", getClickPointYCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1201         { "intValue", getIntValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1202         { "minValue", getMinValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1203         { "maxValue", getMaxValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1204         { "childrenCount", getChildrenCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1205         { "rowCount", rowCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1206         { "columnCount", columnCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1207         { "insertionPointLineNumber", getInsertionPointLineNumberCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1208         { "selectedTextRange", getSelectedTextRangeCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1209         { "isEnabled", getIsEnabledCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1210         { "isRequired", getIsRequiredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1211         { "isFocused", getIsFocusedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1212         { "isFocusable", getIsFocusableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1213         { "isSelected", getIsSelectedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1214         { "isSelectable", getIsSelectableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1215         { "isMultiSelectable", getIsMultiSelectableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1216         { "isSelectedOptionActive", getIsSelectedOptionActiveCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1217         { "isExpanded", getIsExpandedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1218         { "isChecked", getIsCheckedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1219         { "isVisible", getIsVisibleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1220         { "isOffScreen", getIsOffScreenCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1221         { "isCollapsed", getIsCollapsedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1222         { "hasPopup", getHasPopupCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1223         { "valueDescription", getValueDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1224         { "hierarchicalLevel", hierarchicalLevelCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1225         { "documentEncoding", getDocumentEncodingCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1226         { "documentURI", getDocumentURICallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1227         { "url", getURLCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1228         { "isValid", getIsValidCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1229         { "orientation", getOrientationCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1230         { "ariaIsGrabbed", getARIAIsGrabbedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1231         { "ariaDropEffects", getARIADropEffectsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1232         { "isIgnored", isIgnoredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1233         { "speak", speakCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1234         { "selectedChildrenCount", selectedChildrenCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1235         { "horizontalScrollbar", horizontalScrollbarCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1236         { "verticalScrollbar", verticalScrollbarCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1237 #if PLATFORM(IOS)
1238         { "iphoneLabel", getIPhoneLabelCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1239         { "iphoneHint", getIPhoneHintCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1240         { "iphoneValue", getIPhoneValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1241         { "iphoneIdentifier", getIPhoneIdentifierCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1242         { "iphoneTraits", getIPhoneTraitsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1243         { "iphoneIsElement", getIPhoneIsElementCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1244         { "iphoneElementTextPosition", getIPhoneElementTextPositionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1245         { "iphoneElementTextLength", getIPhoneElementTextLengthCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1246         { "stringForSelection", stringForSelectionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1247 #endif // PLATFORM(IOS)
1248 #if PLATFORM(MAC) && !PLATFORM(IOS)
1249         { "supportedActions", supportedActionsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1250 #endif
1251         { 0, 0, 0, 0 }
1252     };
1253
1254     static JSStaticFunction staticFunctions[] = {
1255         { "allAttributes", allAttributesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1256         { "attributesOfLinkedUIElements", attributesOfLinkedUIElementsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1257         { "attributesOfDocumentLinks", attributesOfDocumentLinksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1258         { "attributesOfChildren", attributesOfChildrenCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1259         { "parameterizedAttributeNames", parameterizedAttributeNamesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1260         { "lineForIndex", lineForIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1261         { "rangeForLine", rangeForLineCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1262         { "boundsForRange", boundsForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1263         { "rangeForPosition", rangeForPositionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1264         { "stringForRange", stringForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1265         { "attributedStringForRange", attributedStringForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1266         { "attributedStringRangeIsMisspelled", attributedStringRangeIsMisspelledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1267         { "uiElementForSearchPredicate", uiElementForSearchPredicateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1268         { "childAtIndex", childAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1269         { "linkedUIElementAtIndex", linkedUIElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1270         { "indexOfChild", indexOfChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1271         { "elementAtPoint", elementAtPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1272         { "attributesOfColumnHeaders", attributesOfColumnHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1273         { "attributesOfRowHeaders", attributesOfRowHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1274         { "attributesOfColumns", attributesOfColumnsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1275         { "attributesOfRows", attributesOfRowsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1276         { "attributesOfVisibleCells", attributesOfVisibleCellsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1277         { "attributesOfHeader", attributesOfHeaderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1278         { "indexInTable", indexInTableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1279         { "rowIndexRange", rowIndexRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1280         { "columnIndexRange", columnIndexRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1281         { "cellForColumnAndRow", cellForColumnAndRowCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1282         { "titleUIElement", titleUIElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1283         { "setSelectedTextRange", setSelectedTextRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1284         { "stringAttributeValue", stringAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1285         { "uiElementAttributeValue", uiElementAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1286         { "numberAttributeValue", numberAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1287         { "boolAttributeValue", boolAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1288         { "isAttributeSupported", isAttributeSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1289         { "isAttributeSettable", isAttributeSettableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1290         { "isPressActionSupported", isPressActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1291         { "isIncrementActionSupported", isIncrementActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1292         { "isDecrementActionSupported", isDecrementActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1293         { "parentElement", parentElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1294         { "disclosedByRow", disclosedByRowCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1295         { "increment", incrementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1296         { "decrement", decrementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1297         { "showMenu", showMenuCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1298         { "press", pressCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1299         { "disclosedRowAtIndex", disclosedRowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1300         { "ariaOwnsElementAtIndex", ariaOwnsElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1301         { "ariaFlowToElementAtIndex", ariaFlowToElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1302         { "selectedRowAtIndex", selectedRowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1303         { "rowAtIndex", rowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1304         { "isEqual", isEqualCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1305         { "addNotificationListener", addNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1306         { "removeNotificationListener", removeNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1307         { "takeFocus", takeFocusCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1308         { "takeSelection", takeSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1309         { "addSelection", addSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1310         { "removeSelection", removeSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1311         { "textMarkerRangeForElement", textMarkerRangeForElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1312         { "attributedStringForTextMarkerRangeContainsAttribute", attributedStringForTextMarkerRangeContainsAttributeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1313         { "indexForTextMarker", indexForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1314         { "isTextMarkerValid", isTextMarkerValidCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1315         { "textMarkerRangeForMarkers", textMarkerRangeForMarkersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1316         { "textMarkerForIndex", textMarkerForIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1317         { "startTextMarkerForTextMarkerRange", startTextMarkerForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1318         { "endTextMarkerForTextMarkerRange", endTextMarkerForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1319         { "accessibilityElementForTextMarker", accessibilityElementForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1320         { "textMarkerRangeLength", textMarkerRangeLengthCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1321         { "textMarkerForPoint", textMarkerForPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1322         { "nextTextMarker", nextTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1323         { "previousTextMarker", previousTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1324         { "stringForTextMarkerRange", stringForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1325         { "setSelectedChild", setSelectedChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1326         { "selectedChildAtIndex", selectedChildAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1327         { "scrollToMakeVisible", scrollToMakeVisibleCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1328 #if PLATFORM(IOS)
1329         { "linkedElement", linkedElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1330         { "headerElementAtIndex", headerElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1331         { "elementsForRange", elementsForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1332         { "increaseTextSelection", increaseTextSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1333         { "decreaseTextSelection", decreaseTextSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1334         { "assistiveTechnologySimulatedFocus", assistiveTechnologySimulatedFocusCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1335         
1336 #endif
1337         { 0, 0, 0 }
1338     };
1339
1340     static JSClassDefinition classDefinition = {
1341         0, kJSClassAttributeNone, "AccessibilityUIElement", 0, staticValues, staticFunctions,
1342         0, finalize, 0, 0, 0, 0, 0, 0, 0, 0, 0
1343     };
1344
1345     static JSClassRef accessibilityUIElementClass = JSClassCreate(&classDefinition);
1346     return accessibilityUIElementClass;
1347 }