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