Test gardening for GTK.
[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
28 #if HAVE(ACCESSIBILITY)
29
30 #include "AccessibilityUIElement.h"
31
32 #include <JavaScriptCore/JSObjectRef.h>
33 #include <JavaScriptCore/JSRetainPtr.h>
34 #include <limits.h>
35
36 // Static Functions
37
38 static inline AccessibilityUIElement* toAXElement(JSObjectRef object)
39 {
40     // FIXME: We should ASSERT that it is the right class here.
41     return static_cast<AccessibilityUIElement*>(JSObjectGetPrivate(object));
42 }
43
44 static JSValueRef allAttributesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
45 {
46     JSRetainPtr<JSStringRef> attributes(Adopt, toAXElement(thisObject)->allAttributes());
47     return JSValueMakeString(context, attributes.get());
48 }
49
50 static JSValueRef attributesOfLinkedUIElementsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
51 {
52     JSRetainPtr<JSStringRef> linkedUIDescription(Adopt, toAXElement(thisObject)->attributesOfLinkedUIElements());
53     return JSValueMakeString(context, linkedUIDescription.get());
54 }
55
56 static JSValueRef attributesOfDocumentLinksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
57 {
58     JSRetainPtr<JSStringRef> linkedUIDescription(Adopt, toAXElement(thisObject)->attributesOfDocumentLinks());
59     return JSValueMakeString(context, linkedUIDescription.get());
60 }
61
62 static JSValueRef attributesOfChildrenCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
63 {
64     JSRetainPtr<JSStringRef> childrenDescription(Adopt, toAXElement(thisObject)->attributesOfChildren());
65     return JSValueMakeString(context, childrenDescription.get());
66 }
67
68 static JSValueRef parameterizedAttributeNamesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
69 {
70     JSRetainPtr<JSStringRef> parameterizedAttributeNames(Adopt, toAXElement(thisObject)->parameterizedAttributeNames());
71     return JSValueMakeString(context, parameterizedAttributeNames.get());
72 }
73
74 static JSValueRef attributesOfColumnHeadersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
75 {
76     JSRetainPtr<JSStringRef> attributesOfColumnHeaders(Adopt, toAXElement(thisObject)->attributesOfColumnHeaders());
77     return JSValueMakeString(context, attributesOfColumnHeaders.get());
78 }
79
80 static JSValueRef attributesOfRowHeadersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
81 {
82     JSRetainPtr<JSStringRef> attributesOfRowHeaders(Adopt, toAXElement(thisObject)->attributesOfRowHeaders());
83     return JSValueMakeString(context, attributesOfRowHeaders.get());
84 }
85
86 static JSValueRef attributesOfColumnsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
87 {
88     JSRetainPtr<JSStringRef> attributesOfColumns(Adopt, toAXElement(thisObject)->attributesOfColumns());
89     return JSValueMakeString(context, attributesOfColumns.get());
90 }
91
92 static JSValueRef attributesOfRowsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
93 {
94     JSRetainPtr<JSStringRef> attributesOfRows(Adopt, toAXElement(thisObject)->attributesOfRows());
95     return JSValueMakeString(context, attributesOfRows.get());
96 }
97
98 static JSValueRef attributesOfVisibleCellsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
99 {
100     JSRetainPtr<JSStringRef> attributesOfVisibleCells(Adopt, toAXElement(thisObject)->attributesOfVisibleCells());
101     return JSValueMakeString(context, attributesOfVisibleCells.get());
102 }
103
104 static JSValueRef attributesOfHeaderCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
105 {
106     JSRetainPtr<JSStringRef> attributesOfHeader(Adopt, toAXElement(thisObject)->attributesOfHeader());
107     return JSValueMakeString(context, attributesOfHeader.get());
108 }
109
110 static JSValueRef indexInTableCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
111 {
112     return JSValueMakeNumber(context, toAXElement(thisObject)->indexInTable());
113 }
114
115 static JSValueRef rowIndexRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
116 {
117     JSRetainPtr<JSStringRef> rowIndexRange(Adopt, toAXElement(thisObject)->rowIndexRange());
118     return JSValueMakeString(context, rowIndexRange.get());
119 }
120
121 static JSValueRef columnIndexRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
122 {
123     JSRetainPtr<JSStringRef> columnIndexRange(Adopt, toAXElement(thisObject)->columnIndexRange());
124     return JSValueMakeString(context, columnIndexRange.get());
125 }
126
127 static JSValueRef lineForIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
128 {
129     int indexNumber = -1;
130     if (argumentCount == 1)
131         indexNumber = JSValueToNumber(context, arguments[0], exception);
132     
133     return JSValueMakeNumber(context, toAXElement(thisObject)->lineForIndex(indexNumber));
134 }
135
136 static JSValueRef rangeForLineCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
137 {
138     int indexNumber = -1;
139     if (argumentCount == 1)
140         indexNumber = JSValueToNumber(context, arguments[0], exception);
141     
142     JSRetainPtr<JSStringRef> rangeLine(Adopt, toAXElement(thisObject)->rangeForLine(indexNumber));
143     return JSValueMakeString(context, rangeLine.get());
144 }
145
146 static JSValueRef boundsForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
147 {
148     unsigned location = UINT_MAX, length = 0;
149     if (argumentCount == 2) {
150         location = JSValueToNumber(context, arguments[0], exception);
151         length = JSValueToNumber(context, arguments[1], exception);
152     }
153
154     JSRetainPtr<JSStringRef> boundsDescription(Adopt, toAXElement(thisObject)->boundsForRange(location, length));
155     return JSValueMakeString(context, boundsDescription.get());    
156 }
157
158 static JSValueRef rangeForPositionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
159 {
160     int x = 0, y = 0;
161     if (argumentCount == 2) {
162         x = JSValueToNumber(context, arguments[0], exception);
163         y = JSValueToNumber(context, arguments[1], exception);
164     }
165     
166     JSRetainPtr<JSStringRef> rangeDescription(Adopt, toAXElement(thisObject)->rangeForPosition(x, y));
167     return JSValueMakeString(context, rangeDescription.get());    
168 }
169
170 static JSValueRef stringForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
171 {
172     unsigned location = UINT_MAX, length = 0;
173     if (argumentCount == 2) {
174         location = JSValueToNumber(context, arguments[0], exception);
175         length = JSValueToNumber(context, arguments[1], exception);
176     }
177     
178     JSRetainPtr<JSStringRef> stringDescription(Adopt, toAXElement(thisObject)->stringForRange(location, length));
179     return JSValueMakeString(context, stringDescription.get());    
180 }
181
182 static JSValueRef attributedStringForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
183 {
184     unsigned location = UINT_MAX, length = 0;
185     if (argumentCount == 2) {
186         location = JSValueToNumber(context, arguments[0], exception);
187         length = JSValueToNumber(context, arguments[1], exception);
188     }
189     
190     JSRetainPtr<JSStringRef> stringDescription(Adopt, toAXElement(thisObject)->attributedStringForRange(location, length));
191     return JSValueMakeString(context, stringDescription.get());    
192 }
193
194 static JSValueRef attributedStringRangeIsMisspelledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
195 {
196     unsigned location = UINT_MAX, length = 0;
197     if (argumentCount == 2) {
198         location = JSValueToNumber(context, arguments[0], exception);
199         length = JSValueToNumber(context, arguments[1], exception);
200     }
201     
202     return JSValueMakeBoolean(context, toAXElement(thisObject)->attributedStringRangeIsMisspelled(location, length));
203 }
204
205 static JSValueRef uiElementCountForSearchPredicateCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
206 {
207     AccessibilityUIElement* startElement = nullptr;
208     bool isDirectionNext = true;
209     JSValueRef searchKey = nullptr;
210     JSRetainPtr<JSStringRef> searchText = nullptr;
211     bool visibleOnly = false;
212     bool immediateDescendantsOnly = false;
213     if (argumentCount >= 5 && argumentCount <= 6) {
214         if (JSValueIsObject(context, arguments[0]))
215             startElement = toAXElement(JSValueToObject(context, arguments[0], exception));
216         
217         isDirectionNext = JSValueToBoolean(context, arguments[1]);
218         
219         searchKey = arguments[2];
220         
221         if (JSValueIsString(context, arguments[3]))
222             searchText.adopt(JSValueToStringCopy(context, arguments[3], exception));
223         
224         visibleOnly = JSValueToBoolean(context, arguments[4]);
225         
226         if (argumentCount == 6)
227             immediateDescendantsOnly = JSValueToBoolean(context, arguments[5]);
228     }
229     
230     return JSValueMakeNumber(context, toAXElement(thisObject)->uiElementCountForSearchPredicate(context, startElement, isDirectionNext, searchKey, searchText.get(), visibleOnly, immediateDescendantsOnly));
231 }
232
233 static JSValueRef uiElementForSearchPredicateCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
234 {
235     AccessibilityUIElement* startElement = nullptr;
236     bool isDirectionNext = true;
237     JSValueRef searchKey = nullptr;
238     JSRetainPtr<JSStringRef> searchText = nullptr;
239     bool visibleOnly = false;
240     bool immediateDescendantsOnly = false;
241     if (argumentCount >= 5 && argumentCount <= 6) {
242         if (JSValueIsObject(context, arguments[0]))
243             startElement = toAXElement(JSValueToObject(context, arguments[0], exception));
244         
245         isDirectionNext = JSValueToBoolean(context, arguments[1]);
246         
247         searchKey = arguments[2];
248         
249         if (JSValueIsString(context, arguments[3]))
250             searchText.adopt(JSValueToStringCopy(context, arguments[3], exception));
251         
252         visibleOnly = JSValueToBoolean(context, arguments[4]);
253         
254         if (argumentCount == 6)
255             immediateDescendantsOnly = JSValueToBoolean(context, arguments[5]);
256     }
257     
258     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->uiElementForSearchPredicate(context, startElement, isDirectionNext, searchKey, searchText.get(), visibleOnly, immediateDescendantsOnly));
259 }
260
261 static JSValueRef selectTextWithCriteriaCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
262 {
263     if (argumentCount < 2 || argumentCount > 4)
264         return JSValueMakeUndefined(context);
265     
266     JSRetainPtr<JSStringRef> ambiguityResolution(Adopt, JSValueToStringCopy(context, arguments[0], exception));
267     JSValueRef searchStrings = arguments[1];
268     JSStringRef replacementString = nullptr;
269     if (argumentCount == 3)
270         replacementString = JSValueToStringCopy(context, arguments[2], exception);
271     JSStringRef activityString = nullptr;
272     if (argumentCount == 4)
273         activityString = JSValueToStringCopy(context, arguments[3], exception);
274     
275     JSRetainPtr<JSStringRef> result(Adopt, toAXElement(thisObject)->selectTextWithCriteria(context, ambiguityResolution.get(), searchStrings, replacementString, activityString));
276     if (replacementString)
277         JSStringRelease(replacementString);
278     if (activityString)
279         JSStringRelease(activityString);
280     return JSValueMakeString(context, result.get());
281 }
282
283 static JSValueRef indexOfChildCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
284 {
285     if (argumentCount != 1)
286         return 0;
287     
288     JSObjectRef otherElement = JSValueToObject(context, arguments[0], exception);
289     AccessibilityUIElement* childElement = toAXElement(otherElement);
290     return JSValueMakeNumber(context, (double)toAXElement(thisObject)->indexOfChild(childElement));
291 }
292
293 #if PLATFORM(IOS)
294
295 static JSValueRef headerElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
296 {
297     if (argumentCount != 1)
298         return 0;
299     
300     unsigned index = JSValueToNumber(context, arguments[0], exception);
301     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->headerElementAtIndex(index));
302 }
303
304 static JSValueRef linkedElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
305 {
306     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->linkedElement());
307 }
308
309 static JSValueRef elementsForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
310 {
311     if (argumentCount != 2)
312         return 0;
313     
314     unsigned location = JSValueToNumber(context, arguments[0], exception);
315     unsigned length = JSValueToNumber(context, arguments[1], exception);
316     
317     Vector<AccessibilityUIElement> elements;
318     toAXElement(thisObject)->elementsForRange(location, length, elements);
319     
320     JSValueRef arrayResult = JSObjectMakeArray(context, 0, 0, 0);
321     JSObjectRef arrayObj = JSValueToObject(context, arrayResult, 0);
322     unsigned elementsSize = elements.size();
323     for (unsigned k = 0; k < elementsSize; ++k)
324         JSObjectSetPropertyAtIndex(context, arrayObj, k, AccessibilityUIElement::makeJSAccessibilityUIElement(context, elements[k]), 0);
325     
326     return arrayResult;
327 }
328
329 static JSValueRef increaseTextSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
330 {
331     toAXElement(thisObject)->increaseTextSelection();
332     return JSValueMakeUndefined(context);
333 }
334
335 static JSValueRef scrollPageUpCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
336 {
337     return JSValueMakeBoolean(context, toAXElement(thisObject)->scrollPageUp());
338 }
339
340 static JSValueRef scrollPageDownCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
341 {
342     return JSValueMakeBoolean(context, toAXElement(thisObject)->scrollPageDown());
343 }
344
345 static JSValueRef scrollPageLeftCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
346 {
347     return JSValueMakeBoolean(context, toAXElement(thisObject)->scrollPageLeft());
348 }
349
350 static JSValueRef scrollPageRightCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
351 {
352     return JSValueMakeBoolean(context, toAXElement(thisObject)->scrollPageRight());
353 }
354
355 static JSValueRef decreaseTextSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
356 {
357     toAXElement(thisObject)->decreaseTextSelection();
358     return JSValueMakeUndefined(context);
359 }
360
361 static JSValueRef assistiveTechnologySimulatedFocusCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
362 {
363     toAXElement(thisObject)->assistiveTechnologySimulatedFocus();
364     return JSValueMakeUndefined(context);
365 }
366
367 static JSValueRef fieldsetAncestorElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
368 {
369     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->fieldsetAncestorElement());
370 }
371
372 #endif
373
374 static JSValueRef childAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
375 {
376     int indexNumber = -1;
377     if (argumentCount == 1)
378         indexNumber = JSValueToNumber(context, arguments[0], exception);
379     
380     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->getChildAtIndex(indexNumber));
381 }
382
383 static JSValueRef selectedChildAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
384 {
385     int indexNumber = -1;
386     if (argumentCount == 1)
387         indexNumber = JSValueToNumber(context, arguments[0], exception);
388     
389     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->selectedChildAtIndex(indexNumber));
390 }
391
392 static JSValueRef linkedUIElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
393 {
394     int indexNumber = -1;
395     if (argumentCount == 1)
396         indexNumber = JSValueToNumber(context, arguments[0], exception);
397     
398     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->linkedUIElementAtIndex(indexNumber));
399 }
400
401 static JSValueRef disclosedRowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
402 {
403     int indexNumber = 0;
404     if (argumentCount == 1)
405         indexNumber = JSValueToNumber(context, arguments[0], exception);
406     
407     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->disclosedRowAtIndex(indexNumber));
408 }
409
410 static JSValueRef ariaOwnsElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
411 {
412     int indexNumber = 0;
413     if (argumentCount == 1)
414         indexNumber = JSValueToNumber(context, arguments[0], exception);
415     
416     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->ariaOwnsElementAtIndex(indexNumber));
417 }
418
419 static JSValueRef ariaFlowToElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
420 {
421     int indexNumber = 0;
422     if (argumentCount == 1)
423         indexNumber = JSValueToNumber(context, arguments[0], exception);
424     
425     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->ariaFlowToElementAtIndex(indexNumber));
426 }
427
428 static JSValueRef ariaControlsElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
429 {
430     int indexNumber = 0;
431     if (argumentCount == 1)
432         indexNumber = JSValueToNumber(context, arguments[0], exception);
433
434     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->ariaControlsElementAtIndex(indexNumber));
435 }
436
437 static JSValueRef selectedRowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
438 {
439     int indexNumber = 0;
440     if (argumentCount == 1)
441         indexNumber = JSValueToNumber(context, arguments[0], exception);
442     
443     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->selectedRowAtIndex(indexNumber));
444 }
445
446 static JSValueRef rowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
447 {
448     int indexNumber = 0;
449     if (argumentCount == 1)
450         indexNumber = JSValueToNumber(context, arguments[0], exception);
451     
452     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->rowAtIndex(indexNumber));
453 }
454
455 static JSValueRef isEqualCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
456 {
457     JSObjectRef otherElement = 0;
458     if (argumentCount == 1)
459         otherElement = JSValueToObject(context, arguments[0], exception);
460     else
461         return JSValueMakeBoolean(context, false);
462     
463     return JSValueMakeBoolean(context, toAXElement(thisObject)->isEqual(toAXElement(otherElement)));
464 }
465
466 static JSValueRef setValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
467 {
468     JSRetainPtr<JSStringRef> valueText = 0;
469     if (argumentCount == 1) {
470         if (JSValueIsString(context, arguments[0]))
471             valueText.adopt(JSValueToStringCopy(context, arguments[0], exception));
472     }
473     
474     toAXElement(thisObject)->setValue(valueText.get());
475     
476     return JSValueMakeUndefined(context);
477 }
478
479 static JSValueRef setSelectedChildCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
480 {
481     JSObjectRef element = 0;
482     if (argumentCount == 1)
483         element = JSValueToObject(context, arguments[0], exception);
484
485     toAXElement(thisObject)->setSelectedChild(toAXElement(element));
486
487     return JSValueMakeUndefined(context);
488 }
489
490 static JSValueRef setSelectedChildAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
491 {
492     if (argumentCount == 1) {
493         unsigned indexNumber = JSValueToNumber(context, arguments[0], exception);
494         toAXElement(thisObject)->setSelectedChildAtIndex(indexNumber);
495     }
496     return JSValueMakeUndefined(context);
497 }
498
499 static JSValueRef removeSelectionAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
500 {
501     if (argumentCount == 1) {
502         unsigned indexNumber = JSValueToNumber(context, arguments[0], exception);
503         toAXElement(thisObject)->removeSelectionAtIndex(indexNumber);
504     }
505     return JSValueMakeUndefined(context);
506 }
507
508 static JSValueRef elementAtPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
509 {
510     int x = 0;
511     int y = 0;
512     if (argumentCount == 2) {
513         x = JSValueToNumber(context, arguments[0], exception);
514         y = JSValueToNumber(context, arguments[1], exception);
515     }
516     
517     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->elementAtPoint(x, y));
518 }
519
520 static JSValueRef isAttributeSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
521 {
522     JSStringRef attribute = 0;
523     if (argumentCount == 1)
524         attribute = JSValueToStringCopy(context, arguments[0], exception);    
525     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isAttributeSupported(attribute));
526     if (attribute)
527         JSStringRelease(attribute);
528     return result;
529 }
530
531 static JSValueRef isAttributeSettableCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
532 {
533     JSStringRef attribute = 0;
534     if (argumentCount == 1)
535         attribute = JSValueToStringCopy(context, arguments[0], exception);    
536     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isAttributeSettable(attribute));
537     if (attribute)
538         JSStringRelease(attribute);
539     return result;
540 }
541
542 static JSValueRef isPressActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
543 {
544     return JSValueMakeBoolean(context, toAXElement(thisObject)->isPressActionSupported());
545 }
546
547 static JSValueRef isIncrementActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
548 {
549     return JSValueMakeBoolean(context, toAXElement(thisObject)->isIncrementActionSupported());
550 }
551
552 static JSValueRef isDecrementActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
553 {
554     return JSValueMakeBoolean(context, toAXElement(thisObject)->isDecrementActionSupported());
555 }
556
557 static JSValueRef boolAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
558 {
559     JSStringRef attribute = 0;
560     if (argumentCount == 1)
561         attribute = JSValueToStringCopy(context, arguments[0], exception);
562     bool val = toAXElement(thisObject)->boolAttributeValue(attribute);
563     JSValueRef result = JSValueMakeBoolean(context, val);
564     if (attribute)
565         JSStringRelease(attribute);
566     return result;
567 }
568
569 static JSValueRef setBoolAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
570 {
571     JSStringRef attribute = nullptr;
572     bool value = false;
573     if (argumentCount == 2) {
574         attribute = JSValueToStringCopy(context, arguments[0], exception);
575         value = JSValueToBoolean(context, arguments[1]);
576     }
577     toAXElement(thisObject)->setBoolAttributeValue(attribute, value);
578     if (attribute)
579         JSStringRelease(attribute);
580     return JSValueMakeUndefined(context);
581 }
582
583 static JSValueRef stringAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
584 {
585     JSStringRef attribute = 0;
586     if (argumentCount == 1)
587         attribute = JSValueToStringCopy(context, arguments[0], exception);
588     JSRetainPtr<JSStringRef> stringAttributeValue(Adopt, toAXElement(thisObject)->stringAttributeValue(attribute));
589     JSValueRef result = JSValueMakeString(context, stringAttributeValue.get());
590     if (attribute)
591         JSStringRelease(attribute);
592     return result;
593 }
594
595 static JSValueRef convertElementsToObjectArray(JSContextRef context, Vector<AccessibilityUIElement>& elements, JSValueRef* exception)
596 {
597     JSValueRef arrayResult = JSObjectMakeArray(context, 0, 0, 0);
598     JSObjectRef arrayObj = JSValueToObject(context, arrayResult, 0);
599
600     size_t elementCount = elements.size();
601     for (size_t i = 0; i < elementCount; ++i)
602         JSObjectSetPropertyAtIndex(context, arrayObj, i, AccessibilityUIElement::makeJSAccessibilityUIElement(context, elements[i]), 0);
603
604     return arrayResult;
605 }
606
607 static JSValueRef columnHeadersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
608 {
609     Vector<AccessibilityUIElement> elements;
610     toAXElement(thisObject)->columnHeaders(elements);
611     return convertElementsToObjectArray(context, elements, exception);
612 }
613
614 static JSValueRef rowHeadersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
615 {
616     Vector<AccessibilityUIElement> elements;
617     toAXElement(thisObject)->rowHeaders(elements);
618     return convertElementsToObjectArray(context, elements, exception);
619 }
620
621 static JSValueRef uiElementArrayAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
622 {
623     if (argumentCount != 1)
624         return JSValueMakeUndefined(context);
625     
626     JSRetainPtr<JSStringRef> attribute(Adopt, JSValueToStringCopy(context, arguments[0], exception));
627     
628     Vector<AccessibilityUIElement> elements;
629     toAXElement(thisObject)->uiElementArrayAttributeValue(attribute.get(), elements);
630     return convertElementsToObjectArray(context, elements, exception);
631 }
632
633 static JSValueRef uiElementAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
634 {
635     JSRetainPtr<JSStringRef> attribute;
636     if (argumentCount == 1)
637         attribute.adopt(JSValueToStringCopy(context, arguments[0], exception));
638     
639     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->uiElementAttributeValue(attribute.get()));
640 }
641
642 static JSValueRef numberAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
643 {
644     JSStringRef attribute = 0;
645     if (argumentCount == 1)
646         attribute = JSValueToStringCopy(context, arguments[0], exception);
647     double val = toAXElement(thisObject)->numberAttributeValue(attribute);
648     JSValueRef result = JSValueMakeNumber(context, val);
649     if (attribute)
650         JSStringRelease(attribute);
651     return result;
652 }
653
654 static JSValueRef cellForColumnAndRowCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
655 {
656     unsigned column = 0, row = 0;
657     if (argumentCount == 2) {
658         column = JSValueToNumber(context, arguments[0], exception);
659         row = JSValueToNumber(context, arguments[1], exception);
660     }
661     
662     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->cellForColumnAndRow(column, row));
663 }
664
665 static JSValueRef titleUIElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
666 {
667     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->titleUIElement());
668 }
669
670 static JSValueRef parentElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
671 {
672     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->parentElement());
673 }
674
675 static JSValueRef disclosedByRowCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
676 {
677     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->disclosedByRow());
678 }
679
680 static JSValueRef setSelectedTextRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
681 {
682     unsigned location = UINT_MAX, length = 0;
683     if (argumentCount == 2) {
684         location = JSValueToNumber(context, arguments[0], exception);
685         length = JSValueToNumber(context, arguments[1], exception);
686     }
687     
688     toAXElement(thisObject)->setSelectedTextRange(location, length);
689     return JSValueMakeUndefined(context);
690 }
691
692 static JSValueRef incrementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
693 {
694     toAXElement(thisObject)->increment();
695     return JSValueMakeUndefined(context);
696 }
697
698 static JSValueRef decrementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
699 {
700     toAXElement(thisObject)->decrement();
701     return JSValueMakeUndefined(context);
702 }
703
704 static JSValueRef showMenuCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
705 {
706     toAXElement(thisObject)->showMenu();
707     return JSValueMakeUndefined(context);
708 }
709
710 static JSValueRef pressCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
711 {
712     toAXElement(thisObject)->press();
713     return JSValueMakeUndefined(context);
714 }
715
716 static JSValueRef scrollToMakeVisibleWithSubFocusCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
717 {
718     unsigned x = 0;
719     unsigned y = 0;
720     unsigned width = 0;
721     unsigned height = 0;
722     if (argumentCount == 4) {
723         x = JSValueToNumber(context, arguments[0], exception);
724         y = JSValueToNumber(context, arguments[1], exception);
725         width = JSValueToNumber(context, arguments[2], exception);
726         height = JSValueToNumber(context, arguments[3], exception);
727     }
728
729     toAXElement(thisObject)->scrollToMakeVisibleWithSubFocus(x, y, width, height);
730     return JSValueMakeUndefined(context);
731 }
732
733 static JSValueRef scrollToGlobalPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
734 {
735     unsigned x = 0;
736     unsigned y = 0;
737     if (argumentCount == 2) {
738         x = JSValueToNumber(context, arguments[0], exception);
739         y = JSValueToNumber(context, arguments[1], exception);
740     }
741
742     toAXElement(thisObject)->scrollToGlobalPoint(x, y);
743     return JSValueMakeUndefined(context);
744 }
745
746 static JSValueRef scrollToMakeVisibleCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
747 {
748     toAXElement(thisObject)->scrollToMakeVisible();
749     return JSValueMakeUndefined(context);
750 }
751
752 static JSValueRef takeFocusCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
753 {
754     toAXElement(thisObject)->takeFocus();
755     return JSValueMakeUndefined(context);
756 }
757
758 static JSValueRef takeSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
759 {
760     toAXElement(thisObject)->takeSelection();
761     return JSValueMakeUndefined(context);
762 }
763
764 static JSValueRef addSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
765 {
766     toAXElement(thisObject)->addSelection();
767     return JSValueMakeUndefined(context);
768 }
769
770 static JSValueRef removeSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
771 {
772     toAXElement(thisObject)->removeSelection();
773     return JSValueMakeUndefined(context);
774 }
775
776 static JSValueRef lineTextMarkerRangeForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
777 {
778     AccessibilityTextMarker* textMarker = nullptr;
779     if (argumentCount == 1)
780         textMarker = toTextMarker(JSValueToObject(context, arguments[0], exception));
781     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->lineTextMarkerRangeForTextMarker(textMarker));
782 }
783
784 static JSValueRef textMarkerRangeForElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
785 {
786     AccessibilityUIElement* uiElement = 0;
787     if (argumentCount == 1)
788         uiElement = toAXElement(JSValueToObject(context, arguments[0], exception));
789     
790     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeForElement(uiElement));
791 }
792
793 static JSValueRef selectedTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
794 {
795     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->selectedTextMarkerRange());
796 }
797
798 static JSValueRef resetSelectedTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
799 {
800     toAXElement(thisObject)->resetSelectedTextMarkerRange();
801     return JSValueMakeUndefined(context);
802 }
803
804 static JSValueRef attributedStringForTextMarkerRangeContainsAttributeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
805 {
806     AccessibilityTextMarkerRange* markerRange = 0;
807     JSStringRef attribute = 0;
808     if (argumentCount == 2) {
809         attribute = JSValueToStringCopy(context, arguments[0], exception);
810         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[1], exception));
811     }
812     
813     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->attributedStringForTextMarkerRangeContainsAttribute(attribute, markerRange));
814     if (attribute)
815         JSStringRelease(attribute);
816     
817     return result;    
818 }
819
820 static JSValueRef indexForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
821 {
822     AccessibilityTextMarker* marker = 0;
823     if (argumentCount == 1)
824         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
825     
826     return JSValueMakeNumber(context, toAXElement(thisObject)->indexForTextMarker(marker));
827 }
828
829 static JSValueRef isTextMarkerValidCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
830 {
831     AccessibilityTextMarker* marker = 0;
832     if (argumentCount == 1)
833         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
834     
835     return JSValueMakeBoolean(context, toAXElement(thisObject)->isTextMarkerValid(marker));
836 }
837
838 static JSValueRef textMarkerForIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
839 {
840     int textIndex = 0;
841     if (argumentCount == 1)
842         textIndex = JSValueToNumber(context, arguments[0], exception);
843     
844     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->textMarkerForIndex(textIndex));
845 }
846
847 static JSValueRef textMarkerRangeLengthCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
848 {
849     AccessibilityTextMarkerRange* range = 0;
850     if (argumentCount == 1)
851         range = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
852     
853     return JSValueMakeNumber(context, (int)toAXElement(thisObject)->textMarkerRangeLength(range));
854 }
855
856 static JSValueRef nextTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
857 {
858     AccessibilityTextMarker* marker = 0;
859     if (argumentCount == 1)
860         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
861     
862     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->nextTextMarker(marker));
863 }
864
865 static JSValueRef previousTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
866 {
867     AccessibilityTextMarker* marker = 0;
868     if (argumentCount == 1)
869         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
870     
871     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->previousTextMarker(marker));
872 }
873
874 static JSValueRef stringForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
875 {
876     AccessibilityTextMarkerRange* markerRange = 0;
877     if (argumentCount == 1)
878         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
879     
880     JSRetainPtr<JSStringRef> markerRangeString(Adopt, toAXElement(thisObject)->stringForTextMarkerRange(markerRange));
881     return JSValueMakeString(context, markerRangeString.get());    
882 }
883
884 static JSValueRef attributedStringForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
885 {
886     AccessibilityTextMarkerRange* markerRange = 0;
887     if (argumentCount == 1)
888         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
889
890     JSRetainPtr<JSStringRef> markerRangeString(Adopt, toAXElement(thisObject)->attributedStringForTextMarkerRange(markerRange));
891     return JSValueMakeString(context, markerRangeString.get());
892 }
893
894 static JSValueRef attributedStringForTextMarkerRangeWithOptionsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
895 {
896     AccessibilityTextMarkerRange* markerRange = nullptr;
897     bool includeSpellCheck = false;
898     if (argumentCount == 2) {
899         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
900         includeSpellCheck = JSValueToBoolean(context, arguments[1]);
901     }
902
903     JSRetainPtr<JSStringRef> markerRangeString(Adopt, toAXElement(thisObject)->attributedStringForTextMarkerRangeWithOptions(markerRange, includeSpellCheck));
904     return JSValueMakeString(context, markerRangeString.get());
905 }
906
907 static JSValueRef endTextMarkerForBoundsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
908 {
909     int x = 0;
910     int y = 0;
911     int width = 0;
912     int height = 0;
913     if (argumentCount == 4) {
914         x = JSValueToNumber(context, arguments[0], exception);
915         y = JSValueToNumber(context, arguments[1], exception);
916         width = JSValueToNumber(context, arguments[2], exception);
917         height = JSValueToNumber(context, arguments[3], exception);
918     }
919     
920     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->endTextMarkerForBounds(x, y, width, height));
921 }
922
923 static JSValueRef startTextMarkerForBoundsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
924 {
925     int x = 0;
926     int y = 0;
927     int width = 0;
928     int height = 0;
929     if (argumentCount == 4) {
930         x = JSValueToNumber(context, arguments[0], exception);
931         y = JSValueToNumber(context, arguments[1], exception);
932         width = JSValueToNumber(context, arguments[2], exception);
933         height = JSValueToNumber(context, arguments[3], exception);
934     }
935     
936     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->startTextMarkerForBounds(x, y, width, height));
937 }
938
939 static JSValueRef textMarkerForPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
940 {
941     int x = 0;
942     int y = 0;
943     if (argumentCount == 2) {
944         x = JSValueToNumber(context, arguments[0], exception);
945         y = JSValueToNumber(context, arguments[1], exception);
946     }
947     
948     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->textMarkerForPoint(x, y));
949 }
950
951 static JSValueRef textMarkerRangeForMarkersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
952 {
953     AccessibilityTextMarker* startMarker = nullptr;
954     AccessibilityTextMarker* endMarker = nullptr;
955     if (argumentCount == 2) {
956         startMarker = toTextMarker(JSValueToObject(context, arguments[0], exception));
957         endMarker = toTextMarker(JSValueToObject(context, arguments[1], exception));
958     }
959     
960     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeForMarkers(startMarker, endMarker));
961 }
962
963 static JSValueRef startTextMarkerForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
964 {
965     AccessibilityTextMarkerRange* markerRange = 0;
966     if (argumentCount == 1)
967         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
968     
969     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->startTextMarkerForTextMarkerRange(markerRange));
970 }
971
972 static JSValueRef endTextMarkerForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
973 {
974     AccessibilityTextMarkerRange* markerRange = 0;
975     if (argumentCount == 1)
976         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
977     
978     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->endTextMarkerForTextMarkerRange(markerRange));
979 }
980
981 static JSValueRef accessibilityElementForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
982 {
983     AccessibilityTextMarker* marker = nullptr;
984     if (argumentCount == 1)
985         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
986     
987     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->accessibilityElementForTextMarker(marker));
988 }
989
990 static JSValueRef startTextMarkerCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
991 {
992     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->startTextMarker());
993 }
994
995 static JSValueRef endTextMarkerCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
996 {
997     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->endTextMarker());
998 }
999
1000 static JSValueRef leftWordTextMarkerRangeForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1001 {
1002     AccessibilityTextMarker* marker = nullptr;
1003     if (argumentCount == 1)
1004         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1005     
1006     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->leftWordTextMarkerRangeForTextMarker(marker));
1007 }
1008
1009 static JSValueRef rightWordTextMarkerRangeForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1010 {
1011     AccessibilityTextMarker* marker = nullptr;
1012     if (argumentCount == 1)
1013         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1014     
1015     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->rightWordTextMarkerRangeForTextMarker(marker));
1016 }
1017
1018 static JSValueRef previousWordStartTextMarkerForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1019 {
1020     AccessibilityTextMarker* marker = nullptr;
1021     if (argumentCount == 1)
1022         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1023     
1024     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->previousWordStartTextMarkerForTextMarker(marker));
1025 }
1026
1027 static JSValueRef nextWordEndTextMarkerForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1028 {
1029     AccessibilityTextMarker* marker = nullptr;
1030     if (argumentCount == 1)
1031         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1032     
1033     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->nextWordEndTextMarkerForTextMarker(marker));
1034 }
1035
1036 static JSValueRef paragraphTextMarkerRangeForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1037 {
1038     AccessibilityTextMarker* marker = nullptr;
1039     if (argumentCount == 1)
1040         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1041     
1042     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->paragraphTextMarkerRangeForTextMarker(marker));
1043 }
1044
1045 static JSValueRef previousParagraphStartTextMarkerForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1046 {
1047     AccessibilityTextMarker* marker = nullptr;
1048     if (argumentCount == 1)
1049         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1050     
1051     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->previousParagraphStartTextMarkerForTextMarker(marker));
1052 }
1053
1054 static JSValueRef nextParagraphEndTextMarkerForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1055 {
1056     AccessibilityTextMarker* marker = nullptr;
1057     if (argumentCount == 1)
1058         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1059     
1060     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->nextParagraphEndTextMarkerForTextMarker(marker));
1061 }
1062
1063 static JSValueRef sentenceTextMarkerRangeForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1064 {
1065     AccessibilityTextMarker* marker = nullptr;
1066     if (argumentCount == 1)
1067         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1068     
1069     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->sentenceTextMarkerRangeForTextMarker(marker));
1070 }
1071
1072 static JSValueRef previousSentenceStartTextMarkerForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1073 {
1074     AccessibilityTextMarker* marker = nullptr;
1075     if (argumentCount == 1)
1076         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1077     
1078     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->previousSentenceStartTextMarkerForTextMarker(marker));
1079 }
1080
1081 static JSValueRef nextSentenceEndTextMarkerForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1082 {
1083     AccessibilityTextMarker* marker = nullptr;
1084     if (argumentCount == 1)
1085         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
1086     
1087     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->nextSentenceEndTextMarkerForTextMarker(marker));
1088 }
1089
1090 static JSValueRef setSelectedVisibleTextRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1091 {
1092     AccessibilityUIElement* uiElement = toAXElement(thisObject);
1093     AccessibilityTextMarkerRange* textMarkerRange = nullptr;
1094     if (argumentCount == 1)
1095         textMarkerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
1096
1097     if (uiElement)
1098         return JSValueMakeBoolean(context, uiElement->setSelectedVisibleTextRange(textMarkerRange));
1099
1100     return JSValueMakeBoolean(context, false);
1101 }
1102
1103 // Static Value Getters
1104
1105 static JSValueRef getARIADropEffectsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1106 {
1107     JSRetainPtr<JSStringRef> dropEffects(Adopt, toAXElement(thisObject)->ariaDropEffects());
1108     return JSValueMakeString(context, dropEffects.get());
1109 }
1110
1111 static JSValueRef getClassListCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1112 {
1113     JSRetainPtr<JSStringRef> classList(Adopt, toAXElement(thisObject)->classList());
1114     return JSValueMakeString(context, classList.get());
1115 }
1116
1117 static JSValueRef getARIAIsGrabbedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1118 {
1119     return JSValueMakeBoolean(context, toAXElement(thisObject)->ariaIsGrabbed());
1120 }
1121
1122 static JSValueRef getIsValidCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1123 {
1124     AccessibilityUIElement* uiElement = toAXElement(thisObject);
1125     if (!uiElement->platformUIElement())
1126         return JSValueMakeBoolean(context, false);
1127     
1128     // There might be other platform logic that one could check here...
1129     
1130     return JSValueMakeBoolean(context, true);
1131 }
1132
1133 static JSValueRef getRoleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1134 {
1135     JSRetainPtr<JSStringRef> role(Adopt, toAXElement(thisObject)->role());
1136     return JSValueMakeString(context, role.get());
1137 }
1138
1139 static JSValueRef getSubroleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1140 {
1141     JSRetainPtr<JSStringRef> role(Adopt, toAXElement(thisObject)->subrole());
1142     return JSValueMakeString(context, role.get());
1143 }
1144
1145 static JSValueRef getRoleDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1146 {
1147     JSRetainPtr<JSStringRef> roleDesc(Adopt, toAXElement(thisObject)->roleDescription());
1148     return JSValueMakeString(context, roleDesc.get());
1149 }
1150
1151 static JSValueRef getComputedRoleStringCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1152 {
1153     JSRetainPtr<JSStringRef> compRole(Adopt, toAXElement(thisObject)->computedRoleString());
1154     return JSValueMakeString(context, compRole.get());
1155 }
1156
1157 static JSValueRef getTitleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1158 {
1159     JSRetainPtr<JSStringRef> title(Adopt, toAXElement(thisObject)->title());
1160     return JSValueMakeString(context, title.get());
1161 }
1162
1163 static JSValueRef getDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1164 {
1165     JSRetainPtr<JSStringRef> description(Adopt, toAXElement(thisObject)->description());
1166     return JSValueMakeString(context, description.get());
1167 }
1168
1169 static JSValueRef getStringValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1170 {
1171     JSRetainPtr<JSStringRef> stringValue(Adopt, toAXElement(thisObject)->stringValue());
1172     return JSValueMakeString(context, stringValue.get());
1173 }
1174
1175 static JSValueRef getLanguageCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1176 {
1177     JSRetainPtr<JSStringRef> language(Adopt, toAXElement(thisObject)->language());
1178     return JSValueMakeString(context, language.get());
1179 }
1180
1181 static JSValueRef getHelpTextCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1182 {
1183     JSRetainPtr<JSStringRef> language(Adopt, toAXElement(thisObject)->helpText());
1184     return JSValueMakeString(context, language.get());
1185 }
1186
1187 static JSValueRef getOrientationCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1188 {
1189     JSRetainPtr<JSStringRef> orientation(Adopt, toAXElement(thisObject)->orientation());
1190     return JSValueMakeString(context, orientation.get());
1191 }
1192
1193 static JSValueRef getChildrenCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1194 {
1195     return JSValueMakeNumber(context, toAXElement(thisObject)->childrenCount());
1196 }
1197
1198 static JSValueRef rowCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1199 {
1200     return JSValueMakeNumber(context, toAXElement(thisObject)->rowCount());
1201 }
1202
1203 static JSValueRef columnCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1204 {
1205     return JSValueMakeNumber(context, toAXElement(thisObject)->columnCount());
1206 }
1207
1208 static JSValueRef getXCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1209 {
1210     return JSValueMakeNumber(context, toAXElement(thisObject)->x());
1211 }
1212
1213 static JSValueRef getYCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1214 {
1215     return JSValueMakeNumber(context, toAXElement(thisObject)->y());
1216 }
1217
1218 static JSValueRef getWidthCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1219 {
1220     return JSValueMakeNumber(context, toAXElement(thisObject)->width());
1221 }
1222
1223 static JSValueRef getHeightCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1224 {
1225     return JSValueMakeNumber(context, toAXElement(thisObject)->height());
1226 }
1227
1228 static JSValueRef getClickPointXCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1229 {
1230     return JSValueMakeNumber(context, toAXElement(thisObject)->clickPointX());
1231 }
1232
1233 static JSValueRef getClickPointYCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1234 {
1235     return JSValueMakeNumber(context, toAXElement(thisObject)->clickPointY());
1236 }
1237
1238 static JSValueRef getIntValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1239 {
1240     return JSValueMakeNumber(context, toAXElement(thisObject)->intValue());
1241 }
1242
1243 static JSValueRef getMinValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1244 {
1245     return JSValueMakeNumber(context, toAXElement(thisObject)->minValue());
1246 }
1247
1248 static JSValueRef getMaxValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1249 {
1250     return JSValueMakeNumber(context, toAXElement(thisObject)->maxValue());
1251 }
1252
1253 static JSValueRef getInsertionPointLineNumberCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1254 {
1255     return JSValueMakeNumber(context, toAXElement(thisObject)->insertionPointLineNumber());
1256 }
1257
1258 static JSValueRef getPathDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1259 {
1260     JSRetainPtr<JSStringRef> pathDescription(Adopt, toAXElement(thisObject)->pathDescription());
1261     return JSValueMakeString(context, pathDescription.get());
1262 }
1263
1264 static JSValueRef getSelectedTextRangeCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1265 {
1266     JSRetainPtr<JSStringRef> selectedTextRange(Adopt, toAXElement(thisObject)->selectedTextRange());
1267     return JSValueMakeString(context, selectedTextRange.get());
1268 }
1269
1270 static JSValueRef getIsEnabledCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1271 {
1272     return JSValueMakeBoolean(context, toAXElement(thisObject)->isEnabled());
1273 }
1274
1275 static JSValueRef getIsRequiredCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1276 {
1277     return JSValueMakeBoolean(context, toAXElement(thisObject)->isRequired());
1278 }
1279
1280 static JSValueRef getIsFocusedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1281 {
1282     return JSValueMakeBoolean(context, toAXElement(thisObject)->isFocused());
1283 }
1284
1285 static JSValueRef getIsFocusableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1286 {
1287     return JSValueMakeBoolean(context, toAXElement(thisObject)->isFocusable());
1288 }
1289
1290 static JSValueRef getIsSelectedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1291 {
1292     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelected());
1293 }
1294
1295 static JSValueRef getIsSelectableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1296 {
1297     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelectable());
1298 }
1299
1300 static JSValueRef getIsMultiSelectableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1301 {
1302     return JSValueMakeBoolean(context, toAXElement(thisObject)->isMultiSelectable());
1303 }
1304
1305 static JSValueRef getIsSelectedOptionActiveCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1306 {
1307     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelectedOptionActive());
1308 }
1309
1310 static JSValueRef getIsExpandedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1311 {
1312     return JSValueMakeBoolean(context, toAXElement(thisObject)->isExpanded());
1313 }
1314
1315 static JSValueRef getIsCheckedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1316 {
1317     return JSValueMakeBoolean(context, toAXElement(thisObject)->isChecked());
1318 }
1319
1320 static JSValueRef getIsIndeterminate(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1321 {
1322     return JSValueMakeBoolean(context, toAXElement(thisObject)->isIndeterminate());
1323 }
1324
1325 static JSValueRef getIsVisibleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1326 {
1327     return JSValueMakeBoolean(context, toAXElement(thisObject)->isVisible());
1328 }
1329
1330 static JSValueRef getIsOffScreenCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1331 {
1332     return JSValueMakeBoolean(context, toAXElement(thisObject)->isOffScreen());
1333 }
1334
1335 static JSValueRef getIsCollapsedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1336 {
1337     return JSValueMakeBoolean(context, toAXElement(thisObject)->isCollapsed());
1338 }
1339
1340 static JSValueRef isIgnoredCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1341 {
1342     return JSValueMakeBoolean(context, toAXElement(thisObject)->isIgnored());
1343 }
1344
1345 static JSValueRef speakAsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1346 {
1347     JSRetainPtr<JSStringRef> speakAsString(Adopt, toAXElement(thisObject)->speakAs());
1348     return JSValueMakeString(context, speakAsString.get());
1349 }
1350
1351 static JSValueRef selectedChildrenCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1352 {
1353     return JSValueMakeNumber(context, toAXElement(thisObject)->selectedChildrenCount());
1354 }
1355
1356 static JSValueRef horizontalScrollbarCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1357 {
1358     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->horizontalScrollbar());
1359 }
1360
1361 static JSValueRef verticalScrollbarCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1362 {
1363     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->verticalScrollbar());
1364 }
1365
1366 static JSValueRef getHasPopupCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1367 {
1368     return JSValueMakeBoolean(context, toAXElement(thisObject)->hasPopup());
1369 }
1370
1371 static JSValueRef hierarchicalLevelCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1372 {
1373     return JSValueMakeNumber(context, toAXElement(thisObject)->hierarchicalLevel());
1374 }
1375
1376 static JSValueRef getValueDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1377 {
1378     JSRetainPtr<JSStringRef> valueDescription(Adopt, toAXElement(thisObject)->valueDescription());
1379     return JSValueMakeString(context, valueDescription.get());
1380 }
1381
1382 static JSValueRef getAccessibilityValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1383 {
1384     JSRetainPtr<JSStringRef> accessibilityValue(Adopt, toAXElement(thisObject)->accessibilityValue());
1385     return JSValueMakeString(context, accessibilityValue.get());
1386 }
1387
1388 static JSValueRef getDocumentEncodingCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1389 {
1390     JSRetainPtr<JSStringRef> documentEncoding(Adopt, toAXElement(thisObject)->documentEncoding());
1391     return JSValueMakeString(context, documentEncoding.get());
1392 }
1393
1394 static JSValueRef getDocumentURICallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1395 {
1396     JSRetainPtr<JSStringRef> documentURI(Adopt, toAXElement(thisObject)->documentURI());
1397     return JSValueMakeString(context, documentURI.get());
1398 }
1399
1400 static JSValueRef getURLCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1401 {
1402     JSRetainPtr<JSStringRef> url(Adopt, toAXElement(thisObject)->url());
1403     return JSValueMakeString(context, url.get());
1404 }
1405
1406 static JSValueRef addNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1407 {
1408     if (argumentCount != 1)
1409         return JSValueMakeBoolean(context, false);
1410     
1411     JSObjectRef callback = JSValueToObject(context, arguments[0], exception);
1412     bool succeeded = toAXElement(thisObject)->addNotificationListener(callback);
1413     return JSValueMakeBoolean(context, succeeded);
1414 }
1415
1416 static JSValueRef removeNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1417 {
1418     toAXElement(thisObject)->removeNotificationListener();
1419     return JSValueMakeUndefined(context);
1420 }
1421
1422 #if PLATFORM(GTK)
1423 static JSValueRef characterAtOffsetCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1424 {
1425     int offset = -1;
1426     if (argumentCount == 1)
1427         offset = JSValueToNumber(context, arguments[0], exception);
1428
1429     JSRetainPtr<JSStringRef> characterAtOffset(Adopt, toAXElement(thisObject)->characterAtOffset(offset));
1430     return JSValueMakeString(context, characterAtOffset.get());
1431 }
1432
1433 static JSValueRef wordAtOffsetCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1434 {
1435     int offset = -1;
1436     if (argumentCount == 1)
1437         offset = JSValueToNumber(context, arguments[0], exception);
1438
1439     JSRetainPtr<JSStringRef> wordAtOffset(Adopt, toAXElement(thisObject)->wordAtOffset(offset));
1440     return JSValueMakeString(context, wordAtOffset.get());
1441 }
1442
1443 static JSValueRef lineAtOffsetCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1444 {
1445     int offset = -1;
1446     if (argumentCount == 1)
1447         offset = JSValueToNumber(context, arguments[0], exception);
1448
1449     JSRetainPtr<JSStringRef> lineAtOffset(Adopt, toAXElement(thisObject)->lineAtOffset(offset));
1450     return JSValueMakeString(context, lineAtOffset.get());
1451 }
1452
1453 static JSValueRef sentenceAtOffsetCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1454 {
1455     int offset = -1;
1456     if (argumentCount == 1)
1457         offset = JSValueToNumber(context, arguments[0], exception);
1458
1459     JSRetainPtr<JSStringRef> sentenceAtOffset(Adopt, toAXElement(thisObject)->sentenceAtOffset(offset));
1460     return JSValueMakeString(context, sentenceAtOffset.get());
1461 }
1462
1463 #elif PLATFORM(IOS)
1464
1465 static JSValueRef getIsSearchFieldCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1466 {
1467     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSearchField());
1468 }
1469
1470 static JSValueRef getIsTextAreaCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1471 {
1472     return JSValueMakeBoolean(context, toAXElement(thisObject)->isTextArea());
1473 }
1474
1475 static JSValueRef stringForSelectionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1476 {
1477     JSRetainPtr<JSStringRef> labelString(Adopt, toAXElement(thisObject)->stringForSelection());
1478     return JSValueMakeString(context, labelString.get());
1479 }
1480
1481 static JSValueRef getIdentifierCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1482 {
1483     JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->identifier());
1484     return JSValueMakeString(context, valueString.get());
1485 }
1486
1487
1488 static JSValueRef getTraitsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1489 {
1490     JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->traits());
1491     return JSValueMakeString(context, valueString.get());
1492 }
1493
1494 static JSValueRef getElementTextPositionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1495 {
1496     return JSValueMakeNumber(context, toAXElement(thisObject)->elementTextPosition());
1497 }
1498
1499 static JSValueRef getElementTextLengthCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1500 {
1501     return JSValueMakeNumber(context, toAXElement(thisObject)->elementTextLength());
1502 }
1503
1504 static JSValueRef hasContainedByFieldsetTraitCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
1505 {
1506     return JSValueMakeBoolean(context, toAXElement(thisObject)->hasContainedByFieldsetTrait());
1507 }
1508
1509 static JSValueRef textMarkerRangeMatchesTextNearMarkersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
1510 {
1511     JSStringRef searchText = nullptr;
1512     AccessibilityTextMarker* startMarker = nullptr;
1513     AccessibilityTextMarker* endMarker = nullptr;
1514     if (argumentCount == 3) {
1515         searchText = JSValueToStringCopy(context, arguments[0], exception);
1516         startMarker = toTextMarker(JSValueToObject(context, arguments[1], exception));
1517         endMarker = toTextMarker(JSValueToObject(context, arguments[2], exception));
1518     }
1519     
1520     JSValueRef result = AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeMatchesTextNearMarkers(searchText, startMarker, endMarker));
1521     if (searchText)
1522         JSStringRelease(searchText);
1523     return result;
1524 }
1525
1526 #endif // PLATFORM(IOS)
1527
1528 #if PLATFORM(MAC) && !PLATFORM(IOS)
1529 static JSValueRef supportedActionsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1530 {
1531     JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->supportedActions());
1532     return JSValueMakeString(context, valueString.get());
1533 }
1534
1535 static JSValueRef mathPostscriptsDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1536 {
1537     JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->mathPostscriptsDescription());
1538     return JSValueMakeString(context, valueString.get());
1539 }
1540
1541 static JSValueRef mathPrescriptsDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
1542 {
1543     JSRetainPtr<JSStringRef> valueString(Adopt, toAXElement(thisObject)->mathPrescriptsDescription());
1544     return JSValueMakeString(context, valueString.get());
1545 }
1546
1547 #endif
1548
1549 // Implementation
1550
1551 // Unsupported methods on various platforms.
1552 #if !PLATFORM(MAC) || PLATFORM(IOS)
1553 JSStringRef AccessibilityUIElement::rangeForLine(int line) { return 0; }
1554 JSStringRef AccessibilityUIElement::rangeForPosition(int, int) { return 0; }
1555 void AccessibilityUIElement::setSelectedChild(AccessibilityUIElement*) const { }
1556 void AccessibilityUIElement::setSelectedChildAtIndex(unsigned) const { }
1557 void AccessibilityUIElement::removeSelectionAtIndex(unsigned) const { }
1558 AccessibilityUIElement AccessibilityUIElement::horizontalScrollbar() const { return 0; }
1559 AccessibilityUIElement AccessibilityUIElement::verticalScrollbar() const { return 0; }
1560 AccessibilityUIElement AccessibilityUIElement::uiElementAttributeValue(JSStringRef) const { return 0; }
1561 #endif
1562
1563 #if !PLATFORM(MAC) && !PLATFORM(IOS)
1564 JSStringRef AccessibilityUIElement::speakAs() { return nullptr; }
1565 JSStringRef AccessibilityUIElement::pathDescription() const { return 0; }
1566 void AccessibilityUIElement::setValue(JSStringRef) { }
1567 #endif
1568
1569 #if !PLATFORM(COCOA)
1570 void AccessibilityUIElement::uiElementArrayAttributeValue(JSStringRef, Vector<AccessibilityUIElement>&) const { }
1571 #endif
1572
1573 #if !PLATFORM(WIN)
1574 bool AccessibilityUIElement::isEqual(AccessibilityUIElement* otherElement)
1575 {
1576     if (!otherElement)
1577         return false;
1578     return platformUIElement() == otherElement->platformUIElement();
1579 }
1580 #endif
1581
1582 #if !PLATFORM(MAC)
1583 void AccessibilityUIElement::setBoolAttributeValue(JSStringRef, bool) { }
1584 #endif
1585
1586 #if !SUPPORTS_AX_TEXTMARKERS
1587
1588 AccessibilityTextMarkerRange AccessibilityUIElement::lineTextMarkerRangeForTextMarker(AccessibilityTextMarker*)
1589 {
1590     return nullptr;
1591 }
1592
1593 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForElement(AccessibilityUIElement*)
1594 {
1595     return 0;
1596 }
1597
1598 AccessibilityTextMarkerRange AccessibilityUIElement::selectedTextMarkerRange()
1599 {
1600     return nullptr;
1601 }
1602
1603 void AccessibilityUIElement::resetSelectedTextMarkerRange()
1604 {
1605 }
1606
1607 int AccessibilityUIElement::textMarkerRangeLength(AccessibilityTextMarkerRange*)
1608 {
1609     return 0;
1610 }
1611
1612 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForMarkers(AccessibilityTextMarker*, AccessibilityTextMarker*)
1613 {
1614     return 0;
1615 }
1616
1617 AccessibilityTextMarker AccessibilityUIElement::startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
1618 {
1619     return 0;
1620 }
1621
1622 AccessibilityTextMarker AccessibilityUIElement::endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
1623 {
1624     return 0;   
1625 }
1626
1627 AccessibilityUIElement AccessibilityUIElement::accessibilityElementForTextMarker(AccessibilityTextMarker*)
1628 {
1629     return 0;
1630 }
1631
1632 AccessibilityTextMarker AccessibilityUIElement::endTextMarkerForBounds(int x, int y, int width, int height)
1633 {
1634     return 0;
1635 }
1636
1637 AccessibilityTextMarker AccessibilityUIElement::startTextMarkerForBounds(int x, int y, int width, int height)
1638 {
1639     return 0;
1640 }
1641
1642 AccessibilityTextMarker AccessibilityUIElement::textMarkerForPoint(int x, int y)
1643 {
1644     return 0;
1645 }
1646
1647 AccessibilityTextMarker AccessibilityUIElement::previousTextMarker(AccessibilityTextMarker*)
1648 {
1649     return 0;    
1650 }
1651
1652 AccessibilityTextMarker AccessibilityUIElement::nextTextMarker(AccessibilityTextMarker*)
1653 {
1654     return 0;
1655 }
1656
1657 JSStringRef AccessibilityUIElement::stringForTextMarkerRange(AccessibilityTextMarkerRange*)
1658 {
1659     return 0;
1660 }
1661
1662 JSStringRef AccessibilityUIElement::attributedStringForTextMarkerRange(AccessibilityTextMarkerRange*)
1663 {
1664     return nullptr;
1665 }
1666
1667 JSStringRef AccessibilityUIElement::attributedStringForTextMarkerRangeWithOptions(AccessibilityTextMarkerRange*, bool includeSpellCheck)
1668 {
1669     return nullptr;
1670 }
1671
1672 bool AccessibilityUIElement::attributedStringForTextMarkerRangeContainsAttribute(JSStringRef, AccessibilityTextMarkerRange*)
1673 {
1674     return false;
1675 }
1676
1677 int AccessibilityUIElement::indexForTextMarker(AccessibilityTextMarker*)
1678 {
1679     return -1;
1680 }
1681
1682 bool AccessibilityUIElement::isTextMarkerValid(AccessibilityTextMarker*)
1683 {
1684     return false;
1685 }
1686
1687 AccessibilityTextMarker AccessibilityUIElement::textMarkerForIndex(int)
1688 {
1689     return 0;
1690 }
1691
1692 AccessibilityTextMarker AccessibilityUIElement::startTextMarker()
1693 {
1694     return nullptr;
1695 }
1696
1697 AccessibilityTextMarker AccessibilityUIElement::endTextMarker()
1698 {
1699     return nullptr;
1700 }
1701
1702 bool AccessibilityUIElement::setSelectedVisibleTextRange(AccessibilityTextMarkerRange*)
1703 {
1704     return false;
1705 }
1706
1707 AccessibilityTextMarkerRange AccessibilityUIElement::leftWordTextMarkerRangeForTextMarker(AccessibilityTextMarker*)
1708 {
1709     return nullptr;
1710 }
1711
1712 AccessibilityTextMarkerRange AccessibilityUIElement::rightWordTextMarkerRangeForTextMarker(AccessibilityTextMarker*)
1713 {
1714     return nullptr;
1715 }
1716
1717 AccessibilityTextMarker AccessibilityUIElement::previousWordStartTextMarkerForTextMarker(AccessibilityTextMarker*)
1718 {
1719     return nullptr;
1720 }
1721
1722 AccessibilityTextMarker AccessibilityUIElement::nextWordEndTextMarkerForTextMarker(AccessibilityTextMarker*)
1723 {
1724     return nullptr;
1725 }
1726
1727 AccessibilityTextMarkerRange AccessibilityUIElement::paragraphTextMarkerRangeForTextMarker(AccessibilityTextMarker*)
1728 {
1729     return nullptr;
1730 }
1731
1732 AccessibilityTextMarker AccessibilityUIElement::previousParagraphStartTextMarkerForTextMarker(AccessibilityTextMarker*)
1733 {
1734     return nullptr;
1735 }
1736
1737 AccessibilityTextMarker AccessibilityUIElement::nextParagraphEndTextMarkerForTextMarker(AccessibilityTextMarker*)
1738 {
1739     return nullptr;
1740 }
1741
1742 AccessibilityTextMarkerRange AccessibilityUIElement::sentenceTextMarkerRangeForTextMarker(AccessibilityTextMarker*)
1743 {
1744     return nullptr;
1745 }
1746
1747 AccessibilityTextMarker AccessibilityUIElement::previousSentenceStartTextMarkerForTextMarker(AccessibilityTextMarker*)
1748 {
1749     return nullptr;
1750 }
1751
1752 AccessibilityTextMarker AccessibilityUIElement::nextSentenceEndTextMarkerForTextMarker(AccessibilityTextMarker*)
1753 {
1754     return nullptr;
1755 }
1756
1757 #if PLATFORM(IOS)
1758 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeMatchesTextNearMarkers(JSStringRef, AccessibilityTextMarker*, AccessibilityTextMarker*)
1759 {
1760     return nullptr;
1761 }
1762 #endif
1763
1764 #endif
1765
1766 // Destruction
1767
1768 static void finalize(JSObjectRef thisObject)
1769 {
1770     delete toAXElement(thisObject);
1771 }
1772
1773 // Object Creation
1774
1775 JSObjectRef AccessibilityUIElement::makeJSAccessibilityUIElement(JSContextRef context, const AccessibilityUIElement& element)
1776 {
1777     if (!element.platformUIElement())
1778         return nullptr;
1779
1780     return JSObjectMake(context, AccessibilityUIElement::getJSClass(), new AccessibilityUIElement(element));
1781 }
1782
1783 JSClassRef AccessibilityUIElement::getJSClass()
1784 {
1785     static JSStaticValue staticValues[] = {
1786         { "accessibilityValue", getAccessibilityValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1787         { "role", getRoleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1788         { "subrole", getSubroleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1789         { "roleDescription", getRoleDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1790         { "computedRoleString", getComputedRoleStringCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1791         { "title", getTitleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1792         { "description", getDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1793         { "language", getLanguageCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1794         { "helpText", getHelpTextCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1795         { "stringValue", getStringValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1796         { "x", getXCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1797         { "y", getYCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1798         { "width", getWidthCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1799         { "height", getHeightCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1800         { "clickPointX", getClickPointXCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1801         { "clickPointY", getClickPointYCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1802         { "intValue", getIntValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1803         { "minValue", getMinValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1804         { "maxValue", getMaxValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1805         { "pathDescription", getPathDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1806         { "childrenCount", getChildrenCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1807         { "rowCount", rowCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1808         { "columnCount", columnCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1809         { "insertionPointLineNumber", getInsertionPointLineNumberCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1810         { "selectedTextRange", getSelectedTextRangeCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1811         { "isEnabled", getIsEnabledCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1812         { "isRequired", getIsRequiredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1813         { "isFocused", getIsFocusedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1814         { "isFocusable", getIsFocusableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1815         { "isSelected", getIsSelectedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1816         { "isSelectable", getIsSelectableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1817         { "isMultiSelectable", getIsMultiSelectableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1818         { "isSelectedOptionActive", getIsSelectedOptionActiveCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1819         { "isExpanded", getIsExpandedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1820         { "isChecked", getIsCheckedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1821         { "isIndeterminate", getIsIndeterminate, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1822         { "isVisible", getIsVisibleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1823         { "isOffScreen", getIsOffScreenCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1824         { "isCollapsed", getIsCollapsedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1825         { "hasPopup", getHasPopupCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1826         { "valueDescription", getValueDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1827         { "hierarchicalLevel", hierarchicalLevelCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1828         { "documentEncoding", getDocumentEncodingCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1829         { "documentURI", getDocumentURICallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1830         { "url", getURLCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1831         { "isValid", getIsValidCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1832         { "orientation", getOrientationCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1833         { "ariaIsGrabbed", getARIAIsGrabbedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1834         { "ariaDropEffects", getARIADropEffectsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1835         { "classList", getClassListCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1836         { "isIgnored", isIgnoredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1837         { "speakAs", speakAsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1838         { "selectedChildrenCount", selectedChildrenCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1839         { "horizontalScrollbar", horizontalScrollbarCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1840         { "verticalScrollbar", verticalScrollbarCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1841         { "startTextMarker", startTextMarkerCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1842         { "endTextMarker", endTextMarkerCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1843 #if PLATFORM(IOS)
1844         { "identifier", getIdentifierCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1845         { "traits", getTraitsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1846         { "elementTextPosition", getElementTextPositionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1847         { "elementTextLength", getElementTextLengthCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1848         { "stringForSelection", stringForSelectionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1849         { "hasContainedByFieldsetTrait", hasContainedByFieldsetTraitCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1850         { "isSearchField", getIsSearchFieldCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1851         { "isTextArea", getIsTextAreaCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1852 #endif // PLATFORM(IOS)
1853 #if PLATFORM(MAC) && !PLATFORM(IOS)
1854         { "supportedActions", supportedActionsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1855         { "mathPostscriptsDescription", mathPostscriptsDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1856         { "mathPrescriptsDescription", mathPrescriptsDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1857 #endif
1858         { 0, 0, 0, 0 }
1859     };
1860
1861     static JSStaticFunction staticFunctions[] = {
1862         { "allAttributes", allAttributesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1863         { "attributesOfLinkedUIElements", attributesOfLinkedUIElementsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1864         { "attributesOfDocumentLinks", attributesOfDocumentLinksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1865         { "attributesOfChildren", attributesOfChildrenCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1866         { "parameterizedAttributeNames", parameterizedAttributeNamesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1867         { "lineForIndex", lineForIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1868         { "rangeForLine", rangeForLineCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1869         { "boundsForRange", boundsForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1870         { "rangeForPosition", rangeForPositionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1871         { "stringForRange", stringForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1872         { "attributedStringForRange", attributedStringForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1873         { "attributedStringRangeIsMisspelled", attributedStringRangeIsMisspelledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1874         { "uiElementCountForSearchPredicate", uiElementCountForSearchPredicateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1875         { "uiElementForSearchPredicate", uiElementForSearchPredicateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1876         { "selectTextWithCriteria", selectTextWithCriteriaCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1877         { "childAtIndex", childAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1878         { "linkedUIElementAtIndex", linkedUIElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1879         { "indexOfChild", indexOfChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1880         { "elementAtPoint", elementAtPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1881         { "attributesOfColumnHeaders", attributesOfColumnHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1882         { "attributesOfRowHeaders", attributesOfRowHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1883         { "attributesOfColumns", attributesOfColumnsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1884         { "attributesOfRows", attributesOfRowsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1885         { "attributesOfVisibleCells", attributesOfVisibleCellsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1886         { "attributesOfHeader", attributesOfHeaderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1887         { "indexInTable", indexInTableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1888         { "rowIndexRange", rowIndexRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1889         { "columnIndexRange", columnIndexRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1890         { "cellForColumnAndRow", cellForColumnAndRowCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1891         { "titleUIElement", titleUIElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1892         { "setSelectedTextRange", setSelectedTextRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1893         { "stringAttributeValue", stringAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1894         { "uiElementArrayAttributeValue", uiElementArrayAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1895         { "rowHeaders", rowHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1896         { "columnHeaders", columnHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1897         { "uiElementAttributeValue", uiElementAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1898         { "numberAttributeValue", numberAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1899         { "boolAttributeValue", boolAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1900         { "setBoolAttributeValue", setBoolAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1901         { "isAttributeSupported", isAttributeSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1902         { "isAttributeSettable", isAttributeSettableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1903         { "isPressActionSupported", isPressActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1904         { "isIncrementActionSupported", isIncrementActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1905         { "isDecrementActionSupported", isDecrementActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1906         { "parentElement", parentElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1907         { "disclosedByRow", disclosedByRowCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1908         { "increment", incrementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1909         { "decrement", decrementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1910         { "showMenu", showMenuCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1911         { "press", pressCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1912         { "disclosedRowAtIndex", disclosedRowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1913         { "ariaOwnsElementAtIndex", ariaOwnsElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1914         { "ariaFlowToElementAtIndex", ariaFlowToElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1915         { "ariaControlsElementAtIndex", ariaControlsElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1916         { "selectedRowAtIndex", selectedRowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1917         { "rowAtIndex", rowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1918         { "isEqual", isEqualCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1919         { "addNotificationListener", addNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1920         { "removeNotificationListener", removeNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1921         { "takeFocus", takeFocusCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1922         { "takeSelection", takeSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1923         { "addSelection", addSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1924         { "removeSelection", removeSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1925         { "lineTextMarkerRangeForTextMarker", lineTextMarkerRangeForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1926         { "textMarkerRangeForElement", textMarkerRangeForElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1927         { "selectedTextMarkerRange", selectedTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1928         { "resetSelectedTextMarkerRange", resetSelectedTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1929         { "attributedStringForTextMarkerRangeContainsAttribute", attributedStringForTextMarkerRangeContainsAttributeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1930         { "indexForTextMarker", indexForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1931         { "isTextMarkerValid", isTextMarkerValidCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1932         { "textMarkerRangeForMarkers", textMarkerRangeForMarkersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1933         { "textMarkerForIndex", textMarkerForIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1934         { "startTextMarkerForTextMarkerRange", startTextMarkerForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1935         { "endTextMarkerForTextMarkerRange", endTextMarkerForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1936         { "accessibilityElementForTextMarker", accessibilityElementForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1937         { "textMarkerRangeLength", textMarkerRangeLengthCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1938         { "endTextMarkerForBounds", endTextMarkerForBoundsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1939         { "startTextMarkerForBounds", startTextMarkerForBoundsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1940         { "textMarkerForPoint", textMarkerForPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1941         { "nextTextMarker", nextTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1942         { "previousTextMarker", previousTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1943         { "stringForTextMarkerRange", stringForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1944         { "attributedStringForTextMarkerRange", attributedStringForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1945         { "attributedStringForTextMarkerRangeWithOptions", attributedStringForTextMarkerRangeWithOptionsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1946         { "leftWordTextMarkerRangeForTextMarker", leftWordTextMarkerRangeForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1947         { "rightWordTextMarkerRangeForTextMarker", rightWordTextMarkerRangeForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1948         { "previousWordStartTextMarkerForTextMarker", previousWordStartTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1949         { "nextWordEndTextMarkerForTextMarker", nextWordEndTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1950         { "paragraphTextMarkerRangeForTextMarker", paragraphTextMarkerRangeForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1951         { "previousParagraphStartTextMarkerForTextMarker", previousParagraphStartTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1952         { "nextParagraphEndTextMarkerForTextMarker", nextParagraphEndTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1953         { "sentenceTextMarkerRangeForTextMarker", sentenceTextMarkerRangeForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1954         { "previousSentenceStartTextMarkerForTextMarker", previousSentenceStartTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1955         { "nextSentenceEndTextMarkerForTextMarker", nextSentenceEndTextMarkerForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1956         { "setSelectedChild", setSelectedChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1957         { "setSelectedChildAtIndex", setSelectedChildAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1958         { "removeSelectionAtIndex", removeSelectionAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1959         { "setValue", setValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1960         { "setSelectedVisibleTextRange", setSelectedVisibleTextRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1961         { "selectedChildAtIndex", selectedChildAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1962         { "scrollToMakeVisible", scrollToMakeVisibleCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1963         { "scrollToGlobalPoint", scrollToGlobalPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1964         { "scrollToMakeVisibleWithSubFocus", scrollToMakeVisibleWithSubFocusCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1965 #if PLATFORM(GTK)
1966         { "characterAtOffset", characterAtOffsetCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1967         { "wordAtOffset", wordAtOffsetCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1968         { "lineAtOffset", lineAtOffsetCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1969         { "sentenceAtOffset", sentenceAtOffsetCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1970 #elif PLATFORM(IOS)
1971         { "linkedElement", linkedElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1972         { "headerElementAtIndex", headerElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1973         { "elementsForRange", elementsForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1974         { "increaseTextSelection", increaseTextSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1975         { "decreaseTextSelection", decreaseTextSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1976         { "scrollPageUp", scrollPageUpCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1977         { "scrollPageDown", scrollPageDownCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1978         { "scrollPageLeft", scrollPageLeftCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1979         { "scrollPageRight", scrollPageRightCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1980         { "assistiveTechnologySimulatedFocus", assistiveTechnologySimulatedFocusCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1981         { "fieldsetAncestorElement", fieldsetAncestorElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1982         { "textMarkerRangeMatchesTextNearMarkers", textMarkerRangeMatchesTextNearMarkersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1983 #endif
1984         { 0, 0, 0 }
1985     };
1986
1987     static JSClassDefinition classDefinition = {
1988         0, kJSClassAttributeNone, "AccessibilityUIElement", 0, staticValues, staticFunctions,
1989         0, finalize, 0, 0, 0, 0, 0, 0, 0, 0, 0
1990     };
1991
1992     static JSClassRef accessibilityUIElementClass = JSClassCreate(&classDefinition);
1993     return accessibilityUIElementClass;
1994 }
1995 #endif