AX: crash when accessing selectedTab in a tab list
[WebKit-https.git] / Tools / DumpRenderTree / AccessibilityUIElement.cpp
1 /*
2  * Copyright (C) 2008, 2009 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "AccessibilityUIElement.h"
28
29 #include <JavaScriptCore/JSRetainPtr.h>
30
31 // Static Functions
32
33 static inline AccessibilityUIElement* toAXElement(JSObjectRef object)
34 {
35     // FIXME: We should ASSERT that it is the right class here.
36     return static_cast<AccessibilityUIElement*>(JSObjectGetPrivate(object));
37 }
38
39 static JSValueRef allAttributesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
40 {
41     JSRetainPtr<JSStringRef> attributes(Adopt, toAXElement(thisObject)->allAttributes());
42     return JSValueMakeString(context, attributes.get());
43 }
44
45 static JSValueRef attributesOfLinkedUIElementsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
46 {
47     JSRetainPtr<JSStringRef> linkedUIDescription(Adopt, toAXElement(thisObject)->attributesOfLinkedUIElements());
48     return JSValueMakeString(context, linkedUIDescription.get());
49 }
50
51 static JSValueRef attributesOfDocumentLinksCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
52 {
53     JSRetainPtr<JSStringRef> linkedUIDescription(Adopt, toAXElement(thisObject)->attributesOfDocumentLinks());
54     return JSValueMakeString(context, linkedUIDescription.get());
55 }
56
57 static JSValueRef attributesOfChildrenCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
58 {
59     JSRetainPtr<JSStringRef> childrenDescription(Adopt, toAXElement(thisObject)->attributesOfChildren());
60     return JSValueMakeString(context, childrenDescription.get());
61 }
62
63 static JSValueRef parameterizedAttributeNamesCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
64 {
65     JSRetainPtr<JSStringRef> parameterizedAttributeNames(Adopt, toAXElement(thisObject)->parameterizedAttributeNames());
66     return JSValueMakeString(context, parameterizedAttributeNames.get());
67 }
68
69 static JSValueRef attributesOfColumnHeadersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
70 {
71     JSRetainPtr<JSStringRef> attributesOfColumnHeaders(Adopt, toAXElement(thisObject)->attributesOfColumnHeaders());
72     return JSValueMakeString(context, attributesOfColumnHeaders.get());
73 }
74
75 static JSValueRef attributesOfRowHeadersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
76 {
77     JSRetainPtr<JSStringRef> attributesOfRowHeaders(Adopt, toAXElement(thisObject)->attributesOfRowHeaders());
78     return JSValueMakeString(context, attributesOfRowHeaders.get());
79 }
80
81 static JSValueRef attributesOfColumnsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
82 {
83     JSRetainPtr<JSStringRef> attributesOfColumns(Adopt, toAXElement(thisObject)->attributesOfColumns());
84     return JSValueMakeString(context, attributesOfColumns.get());
85 }
86
87 static JSValueRef attributesOfRowsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
88 {
89     JSRetainPtr<JSStringRef> attributesOfRows(Adopt, toAXElement(thisObject)->attributesOfRows());
90     return JSValueMakeString(context, attributesOfRows.get());
91 }
92
93 static JSValueRef attributesOfVisibleCellsCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
94 {
95     JSRetainPtr<JSStringRef> attributesOfVisibleCells(Adopt, toAXElement(thisObject)->attributesOfVisibleCells());
96     return JSValueMakeString(context, attributesOfVisibleCells.get());
97 }
98
99 static JSValueRef attributesOfHeaderCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
100 {
101     JSRetainPtr<JSStringRef> attributesOfHeader(Adopt, toAXElement(thisObject)->attributesOfHeader());
102     return JSValueMakeString(context, attributesOfHeader.get());
103 }
104
105 static JSValueRef indexInTableCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
106 {
107     return JSValueMakeNumber(context, toAXElement(thisObject)->indexInTable());
108 }
109
110 static JSValueRef rowIndexRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
111 {
112     JSRetainPtr<JSStringRef> rowIndexRange(Adopt, toAXElement(thisObject)->rowIndexRange());
113     return JSValueMakeString(context, rowIndexRange.get());
114 }
115
116 static JSValueRef columnIndexRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
117 {
118     JSRetainPtr<JSStringRef> columnIndexRange(Adopt, toAXElement(thisObject)->columnIndexRange());
119     return JSValueMakeString(context, columnIndexRange.get());
120 }
121
122 static JSValueRef lineForIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
123 {
124     int indexNumber = -1;
125     if (argumentCount == 1)
126         indexNumber = JSValueToNumber(context, arguments[0], exception);
127     
128     return JSValueMakeNumber(context, toAXElement(thisObject)->lineForIndex(indexNumber));
129 }
130
131 static JSValueRef rangeForLineCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
132 {
133     int indexNumber = -1;
134     if (argumentCount == 1)
135         indexNumber = JSValueToNumber(context, arguments[0], exception);
136     
137     JSRetainPtr<JSStringRef> rangeLine(Adopt, toAXElement(thisObject)->rangeForLine(indexNumber));
138     return JSValueMakeString(context, rangeLine.get());
139 }
140
141 static JSValueRef boundsForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
142 {
143     unsigned location = UINT_MAX, length = 0;
144     if (argumentCount == 2) {
145         location = JSValueToNumber(context, arguments[0], exception);
146         length = JSValueToNumber(context, arguments[1], exception);
147     }
148
149     JSRetainPtr<JSStringRef> boundsDescription(Adopt, toAXElement(thisObject)->boundsForRange(location, length));
150     return JSValueMakeString(context, boundsDescription.get());    
151 }
152
153 static JSValueRef stringForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
154 {
155     unsigned location = UINT_MAX, length = 0;
156     if (argumentCount == 2) {
157         location = JSValueToNumber(context, arguments[0], exception);
158         length = JSValueToNumber(context, arguments[1], exception);
159     }
160     
161     JSRetainPtr<JSStringRef> stringDescription(Adopt, toAXElement(thisObject)->stringForRange(location, length));
162     return JSValueMakeString(context, stringDescription.get());    
163 }
164
165 static JSValueRef attributedStringForRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
166 {
167     unsigned location = UINT_MAX, length = 0;
168     if (argumentCount == 2) {
169         location = JSValueToNumber(context, arguments[0], exception);
170         length = JSValueToNumber(context, arguments[1], exception);
171     }
172     
173     JSRetainPtr<JSStringRef> stringDescription(Adopt, toAXElement(thisObject)->attributedStringForRange(location, length));
174     return JSValueMakeString(context, stringDescription.get());    
175 }
176
177 static JSValueRef attributedStringRangeIsMisspelledCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
178 {
179     unsigned location = UINT_MAX, length = 0;
180     if (argumentCount == 2) {
181         location = JSValueToNumber(context, arguments[0], exception);
182         length = JSValueToNumber(context, arguments[1], exception);
183     }
184     
185     return JSValueMakeBoolean(context, toAXElement(thisObject)->attributedStringRangeIsMisspelled(location, length));
186 }
187
188 static JSValueRef uiElementForSearchPredicateCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
189 {
190     AccessibilityUIElement* startElement = 0;
191     bool isDirectionNext = true;
192     JSStringRef searchKey = 0;
193     JSStringRef searchText = 0;
194     if (argumentCount == 4) {
195         startElement = toAXElement(JSValueToObject(context, arguments[0], exception));
196         isDirectionNext = JSValueToBoolean(context, arguments[1]);
197         if (JSValueIsString(context, arguments[2]))
198             searchKey = JSValueToStringCopy(context, arguments[2], exception);
199         if (JSValueIsString(context, arguments[3]))
200             searchText = JSValueToStringCopy(context, arguments[3], exception);
201     }
202     
203     JSObjectRef resultObject = AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->uiElementForSearchPredicate(startElement, isDirectionNext, searchKey, searchText));
204     if (searchKey)
205         JSStringRelease(searchKey);
206     if (searchText)
207         JSStringRelease(searchText);
208     
209     return resultObject;
210 }
211
212 static JSValueRef indexOfChildCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
213 {
214     if (argumentCount != 1)
215         return 0;
216     
217     JSObjectRef otherElement = JSValueToObject(context, arguments[0], exception);
218     AccessibilityUIElement* childElement = toAXElement(otherElement);
219     return JSValueMakeNumber(context, (double)toAXElement(thisObject)->indexOfChild(childElement));
220 }
221
222 static JSValueRef childAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
223 {
224     int indexNumber = -1;
225     if (argumentCount == 1)
226         indexNumber = JSValueToNumber(context, arguments[0], exception);
227     
228     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->getChildAtIndex(indexNumber));
229 }
230
231 static JSValueRef selectedChildAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
232 {
233     int indexNumber = -1;
234     if (argumentCount == 1)
235         indexNumber = JSValueToNumber(context, arguments[0], exception);
236     
237     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->selectedChildAtIndex(indexNumber));
238 }
239
240 static JSValueRef linkedUIElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
241 {
242     int indexNumber = -1;
243     if (argumentCount == 1)
244         indexNumber = JSValueToNumber(context, arguments[0], exception);
245     
246     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->linkedUIElementAtIndex(indexNumber));
247 }
248
249 static JSValueRef disclosedRowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
250 {
251     int indexNumber = 0;
252     if (argumentCount == 1)
253         indexNumber = JSValueToNumber(context, arguments[0], exception);
254     
255     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->disclosedRowAtIndex(indexNumber));
256 }
257
258 static JSValueRef ariaOwnsElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
259 {
260     int indexNumber = 0;
261     if (argumentCount == 1)
262         indexNumber = JSValueToNumber(context, arguments[0], exception);
263     
264     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->ariaOwnsElementAtIndex(indexNumber));
265 }
266
267 static JSValueRef ariaFlowToElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
268 {
269     int indexNumber = 0;
270     if (argumentCount == 1)
271         indexNumber = JSValueToNumber(context, arguments[0], exception);
272     
273     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->ariaFlowToElementAtIndex(indexNumber));
274 }
275
276 static JSValueRef selectedRowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
277 {
278     int indexNumber = 0;
279     if (argumentCount == 1)
280         indexNumber = JSValueToNumber(context, arguments[0], exception);
281     
282     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->selectedRowAtIndex(indexNumber));
283 }
284
285 static JSValueRef isEqualCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
286 {
287     JSObjectRef otherElement = 0;
288     if (argumentCount == 1)
289         otherElement = JSValueToObject(context, arguments[0], exception);
290     else
291         return JSValueMakeBoolean(context, false);
292     
293     return JSValueMakeBoolean(context, toAXElement(thisObject)->isEqual(toAXElement(otherElement)));
294 }
295
296 static JSValueRef setSelectedChildCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
297 {
298     JSObjectRef element = 0;
299     if (argumentCount == 1)
300         element = JSValueToObject(context, arguments[0], exception);
301
302     toAXElement(thisObject)->setSelectedChild(toAXElement(element));
303
304     return JSValueMakeUndefined(context);
305 }
306
307 static JSValueRef elementAtPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
308 {
309     int x = 0;
310     int y = 0;
311     if (argumentCount == 2) {
312         x = JSValueToNumber(context, arguments[0], exception);
313         y = JSValueToNumber(context, arguments[1], exception);
314     }
315     
316     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->elementAtPoint(x, y));
317 }
318
319 static JSValueRef isAttributeSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
320 {
321     JSStringRef attribute = 0;
322     if (argumentCount == 1)
323         attribute = JSValueToStringCopy(context, arguments[0], exception);    
324     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isAttributeSupported(attribute));
325     if (attribute)
326         JSStringRelease(attribute);
327     return result;
328 }
329
330 static JSValueRef isAttributeSettableCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
331 {
332     JSStringRef attribute = 0;
333     if (argumentCount == 1)
334         attribute = JSValueToStringCopy(context, arguments[0], exception);    
335     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isAttributeSettable(attribute));
336     if (attribute)
337         JSStringRelease(attribute);
338     return result;
339 }
340
341
342 static JSValueRef isActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
343 {
344     JSStringRef action = 0;
345     if (argumentCount == 1)
346         action = JSValueToStringCopy(context, arguments[0], exception);    
347     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isActionSupported(action));
348     if (action)
349         JSStringRelease(action);
350     return result;
351 }
352
353 static JSValueRef boolAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
354 {
355     JSStringRef attribute = 0;
356     if (argumentCount == 1)
357         attribute = JSValueToStringCopy(context, arguments[0], exception);
358     bool val = toAXElement(thisObject)->boolAttributeValue(attribute);
359     JSValueRef result = JSValueMakeBoolean(context, val);
360     if (attribute)
361         JSStringRelease(attribute);
362     return result;
363 }
364
365 static JSValueRef stringAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
366 {
367     JSStringRef attribute = 0;
368     if (argumentCount == 1)
369         attribute = JSValueToStringCopy(context, arguments[0], exception);
370     JSRetainPtr<JSStringRef> stringAttributeValue(Adopt, toAXElement(thisObject)->stringAttributeValue(attribute));
371     JSValueRef result = JSValueMakeString(context, stringAttributeValue.get());
372     if (attribute)
373         JSStringRelease(attribute);
374     return result;
375 }
376
377 static JSValueRef uiElementAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
378 {
379     JSStringRef attribute = 0;
380     if (argumentCount == 1)
381         attribute = JSValueToStringCopy(context, arguments[0], exception);
382     
383     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->uiElementAttributeValue(attribute));
384 }
385
386 static JSValueRef numberAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
387 {
388     JSStringRef attribute = 0;
389     if (argumentCount == 1)
390         attribute = JSValueToStringCopy(context, arguments[0], exception);
391     double val = toAXElement(thisObject)->numberAttributeValue(attribute);
392     JSValueRef result = JSValueMakeNumber(context, val);
393     if (attribute)
394         JSStringRelease(attribute);
395     return result;
396 }
397
398 static JSValueRef cellForColumnAndRowCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
399 {
400     unsigned column = 0, row = 0;
401     if (argumentCount == 2) {
402         column = JSValueToNumber(context, arguments[0], exception);
403         row = JSValueToNumber(context, arguments[1], exception);
404     }
405     
406     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->cellForColumnAndRow(column, row));
407 }
408
409 static JSValueRef titleUIElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
410 {
411     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->titleUIElement());
412 }
413
414 static JSValueRef parentElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
415 {
416     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->parentElement());
417 }
418
419 static JSValueRef disclosedByRowCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
420 {
421     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->disclosedByRow());
422 }
423
424 static JSValueRef setSelectedTextRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
425 {
426     unsigned location = UINT_MAX, length = 0;
427     if (argumentCount == 2) {
428         location = JSValueToNumber(context, arguments[0], exception);
429         length = JSValueToNumber(context, arguments[1], exception);
430     }
431     
432     toAXElement(thisObject)->setSelectedTextRange(location, length);
433     return JSValueMakeUndefined(context);
434 }
435
436 static JSValueRef incrementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
437 {
438     toAXElement(thisObject)->increment();
439     return JSValueMakeUndefined(context);
440 }
441
442 static JSValueRef decrementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
443 {
444     toAXElement(thisObject)->decrement();
445     return JSValueMakeUndefined(context);
446 }
447
448 static JSValueRef showMenuCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
449 {
450     toAXElement(thisObject)->showMenu();
451     return JSValueMakeUndefined(context);
452 }
453
454 static JSValueRef pressCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
455 {
456     toAXElement(thisObject)->press();
457     return JSValueMakeUndefined(context);
458 }
459
460 static JSValueRef takeFocusCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
461 {
462     toAXElement(thisObject)->takeFocus();
463     return JSValueMakeUndefined(context);
464 }
465
466 static JSValueRef takeSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
467 {
468     toAXElement(thisObject)->takeSelection();
469     return JSValueMakeUndefined(context);
470 }
471
472 static JSValueRef addSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
473 {
474     toAXElement(thisObject)->addSelection();
475     return JSValueMakeUndefined(context);
476 }
477
478 static JSValueRef removeSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
479 {
480     toAXElement(thisObject)->removeSelection();
481     return JSValueMakeUndefined(context);
482 }
483
484 static JSValueRef textMarkerRangeForElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
485 {
486     AccessibilityUIElement* uiElement = 0;
487     if (argumentCount == 1)
488         uiElement = toAXElement(JSValueToObject(context, arguments[0], exception));
489     
490     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeForElement(uiElement));
491 }
492
493 static JSValueRef textMarkerRangeLengthCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
494 {
495     AccessibilityTextMarkerRange* range = 0;
496     if (argumentCount == 1)
497         range = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
498     
499     return JSValueMakeNumber(context, (int)toAXElement(thisObject)->textMarkerRangeLength(range));
500 }
501
502 static JSValueRef nextTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
503 {
504     AccessibilityTextMarker* marker = 0;
505     if (argumentCount == 1)
506         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
507     
508     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->nextTextMarker(marker));
509 }
510
511 static JSValueRef previousTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
512 {
513     AccessibilityTextMarker* marker = 0;
514     if (argumentCount == 1)
515         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
516     
517     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->previousTextMarker(marker));
518 }
519
520 static JSValueRef stringForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
521 {
522     AccessibilityTextMarkerRange* markerRange = 0;
523     if (argumentCount == 1)
524         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
525     
526     JSRetainPtr<JSStringRef> markerRangeString(Adopt, toAXElement(thisObject)->stringForTextMarkerRange(markerRange));
527     return JSValueMakeString(context, markerRangeString.get());    
528 }
529
530 static JSValueRef textMarkerForPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
531 {
532     int x = 0;
533     int y = 0;
534     if (argumentCount == 2) {
535         x = JSValueToNumber(context, arguments[0], exception);
536         y = JSValueToNumber(context, arguments[1], exception);
537     }
538     
539     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->textMarkerForPoint(x, y));
540 }
541
542 static JSValueRef textMarkerRangeForMarkersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
543 {
544     AccessibilityTextMarker* startMarker = 0;
545     AccessibilityTextMarker* endMarker = 0;
546     if (argumentCount == 2) {
547         startMarker = toTextMarker(JSValueToObject(context, arguments[0], exception));
548         endMarker = toTextMarker(JSValueToObject(context, arguments[1], exception));
549     }
550     
551     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeForMarkers(startMarker, endMarker));
552 }
553
554 static JSValueRef startTextMarkerForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
555 {
556     AccessibilityTextMarkerRange* markerRange = 0;
557     if (argumentCount == 1)
558         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
559     
560     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->startTextMarkerForTextMarkerRange(markerRange));
561 }
562
563 static JSValueRef endTextMarkerForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
564 {
565     AccessibilityTextMarkerRange* markerRange = 0;
566     if (argumentCount == 1)
567         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
568     
569     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->endTextMarkerForTextMarkerRange(markerRange));
570 }
571
572 static JSValueRef accessibilityElementForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
573 {
574     AccessibilityTextMarker* marker = 0;
575     if (argumentCount == 1)
576         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
577     
578     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->accessibilityElementForTextMarker(marker));
579 }
580
581 // Static Value Getters
582
583 static JSValueRef getARIADropEffectsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
584 {
585     JSRetainPtr<JSStringRef> dropEffects(Adopt, toAXElement(thisObject)->ariaDropEffects());
586     return JSValueMakeString(context, dropEffects.get());
587 }
588
589 static JSValueRef getARIAIsGrabbedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
590 {
591     return JSValueMakeBoolean(context, toAXElement(thisObject)->ariaIsGrabbed());
592 }
593
594 static JSValueRef getIsValidCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
595 {
596     AccessibilityUIElement* uiElement = toAXElement(thisObject);
597     if (!uiElement->platformUIElement())
598         return JSValueMakeBoolean(context, false);
599     
600     // There might be other platform logic that one could check here...
601     
602     return JSValueMakeBoolean(context, true);
603 }
604
605 static JSValueRef getRoleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
606 {
607     JSRetainPtr<JSStringRef> role(Adopt, toAXElement(thisObject)->role());
608     return JSValueMakeString(context, role.get());
609 }
610
611 static JSValueRef getSubroleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
612 {
613     JSRetainPtr<JSStringRef> role(Adopt, toAXElement(thisObject)->subrole());
614     return JSValueMakeString(context, role.get());
615 }
616
617 static JSValueRef getRoleDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
618 {
619     JSRetainPtr<JSStringRef> roleDesc(Adopt, toAXElement(thisObject)->roleDescription());
620     return JSValueMakeString(context, roleDesc.get());
621 }
622
623 static JSValueRef getTitleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
624 {
625     JSRetainPtr<JSStringRef> title(Adopt, toAXElement(thisObject)->title());
626     return JSValueMakeString(context, title.get());
627 }
628
629 static JSValueRef getDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
630 {
631     JSRetainPtr<JSStringRef> description(Adopt, toAXElement(thisObject)->description());
632     return JSValueMakeString(context, description.get());
633 }
634
635 static JSValueRef getStringValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
636 {
637     JSRetainPtr<JSStringRef> stringValue(Adopt, toAXElement(thisObject)->stringValue());
638     return JSValueMakeString(context, stringValue.get());
639 }
640
641 static JSValueRef getLanguageCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
642 {
643     JSRetainPtr<JSStringRef> language(Adopt, toAXElement(thisObject)->language());
644     return JSValueMakeString(context, language.get());
645 }
646
647 static JSValueRef getHelpTextCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
648 {
649     JSRetainPtr<JSStringRef> language(Adopt, toAXElement(thisObject)->helpText());
650     return JSValueMakeString(context, language.get());
651 }
652
653 static JSValueRef getOrientationCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
654 {
655     JSRetainPtr<JSStringRef> orientation(Adopt, toAXElement(thisObject)->orientation());
656     return JSValueMakeString(context, orientation.get());
657 }
658
659 static JSValueRef getChildrenCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
660 {
661     return JSValueMakeNumber(context, toAXElement(thisObject)->childrenCount());
662 }
663
664 static JSValueRef rowCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
665 {
666     return JSValueMakeNumber(context, toAXElement(thisObject)->rowCount());
667 }
668
669 static JSValueRef columnCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
670 {
671     return JSValueMakeNumber(context, toAXElement(thisObject)->columnCount());
672 }
673
674 static JSValueRef getXCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
675 {
676     return JSValueMakeNumber(context, toAXElement(thisObject)->x());
677 }
678
679 static JSValueRef getYCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
680 {
681     return JSValueMakeNumber(context, toAXElement(thisObject)->y());
682 }
683
684 static JSValueRef getWidthCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
685 {
686     return JSValueMakeNumber(context, toAXElement(thisObject)->width());
687 }
688
689 static JSValueRef getHeightCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
690 {
691     return JSValueMakeNumber(context, toAXElement(thisObject)->height());
692 }
693
694 static JSValueRef getClickPointXCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
695 {
696     return JSValueMakeNumber(context, toAXElement(thisObject)->clickPointX());
697 }
698
699 static JSValueRef getClickPointYCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
700 {
701     return JSValueMakeNumber(context, toAXElement(thisObject)->clickPointY());
702 }
703
704 static JSValueRef getIntValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
705 {
706     return JSValueMakeNumber(context, toAXElement(thisObject)->intValue());
707 }
708
709 static JSValueRef getMinValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
710 {
711     return JSValueMakeNumber(context, toAXElement(thisObject)->minValue());
712 }
713
714 static JSValueRef getMaxValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
715 {
716     return JSValueMakeNumber(context, toAXElement(thisObject)->maxValue());
717 }
718
719 static JSValueRef getInsertionPointLineNumberCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
720 {
721     return JSValueMakeNumber(context, toAXElement(thisObject)->insertionPointLineNumber());
722 }
723
724 static JSValueRef getSelectedTextRangeCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
725 {
726     JSRetainPtr<JSStringRef> selectedTextRange(Adopt, toAXElement(thisObject)->selectedTextRange());
727     return JSValueMakeString(context, selectedTextRange.get());
728 }
729
730 static JSValueRef getIsEnabledCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
731 {
732     return JSValueMakeBoolean(context, toAXElement(thisObject)->isEnabled());
733 }
734
735 static JSValueRef getIsRequiredCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
736 {
737     return JSValueMakeBoolean(context, toAXElement(thisObject)->isRequired());
738 }
739
740 static JSValueRef getIsFocusedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
741 {
742     return JSValueMakeBoolean(context, toAXElement(thisObject)->isFocused());
743 }
744
745 static JSValueRef getIsFocusableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
746 {
747     return JSValueMakeBoolean(context, toAXElement(thisObject)->isFocusable());
748 }
749
750 static JSValueRef getIsSelectedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
751 {
752     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelected());
753 }
754
755 static JSValueRef getIsSelectableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
756 {
757     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelectable());
758 }
759
760 static JSValueRef getIsMultiSelectableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
761 {
762     return JSValueMakeBoolean(context, toAXElement(thisObject)->isMultiSelectable());
763 }
764
765 static JSValueRef getIsExpandedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
766 {
767     return JSValueMakeBoolean(context, toAXElement(thisObject)->isExpanded());
768 }
769
770 static JSValueRef getIsCheckedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
771 {
772     return JSValueMakeBoolean(context, toAXElement(thisObject)->isChecked());
773 }
774
775 static JSValueRef getIsVisibleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
776 {
777     return JSValueMakeBoolean(context, toAXElement(thisObject)->isVisible());
778 }
779
780 static JSValueRef getIsOffScreenCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
781 {
782     return JSValueMakeBoolean(context, toAXElement(thisObject)->isOffScreen());
783 }
784
785 static JSValueRef getIsCollapsedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
786 {
787     return JSValueMakeBoolean(context, toAXElement(thisObject)->isCollapsed());
788 }
789
790 static JSValueRef isIgnoredCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
791 {
792     return JSValueMakeBoolean(context, toAXElement(thisObject)->isIgnored());
793 }
794
795 static JSValueRef speakCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
796 {
797     JSRetainPtr<JSStringRef> speakString(Adopt, toAXElement(thisObject)->speak());
798     return JSValueMakeString(context, speakString.get());
799 }
800
801 static JSValueRef selectedChildrenCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
802 {
803     return JSValueMakeNumber(context, toAXElement(thisObject)->selectedChildrenCount());
804 }
805
806 static JSValueRef getHasPopupCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
807 {
808     return JSValueMakeBoolean(context, toAXElement(thisObject)->hasPopup());
809 }
810
811 static JSValueRef hierarchicalLevelCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
812 {
813     return JSValueMakeNumber(context, toAXElement(thisObject)->hierarchicalLevel());
814 }
815
816 static JSValueRef getValueDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
817 {
818     JSRetainPtr<JSStringRef> valueDescription(Adopt, toAXElement(thisObject)->valueDescription());
819     return JSValueMakeString(context, valueDescription.get());
820 }
821
822 static JSValueRef getAccessibilityValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
823 {
824     JSRetainPtr<JSStringRef> accessibilityValue(Adopt, toAXElement(thisObject)->accessibilityValue());
825     return JSValueMakeString(context, accessibilityValue.get());
826 }
827
828 static JSValueRef getDocumentEncodingCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
829 {
830     JSRetainPtr<JSStringRef> documentEncoding(Adopt, toAXElement(thisObject)->documentEncoding());
831     return JSValueMakeString(context, documentEncoding.get());
832 }
833
834 static JSValueRef getDocumentURICallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
835 {
836     JSRetainPtr<JSStringRef> documentURI(Adopt, toAXElement(thisObject)->documentURI());
837     return JSValueMakeString(context, documentURI.get());
838 }
839
840 static JSValueRef getURLCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
841 {
842     JSRetainPtr<JSStringRef> url(Adopt, toAXElement(thisObject)->url());
843     return JSValueMakeString(context, url.get());
844 }
845
846 static JSValueRef addNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
847 {
848     if (argumentCount != 1)
849         return JSValueMakeBoolean(context, false);
850     
851     JSObjectRef callback = JSValueToObject(context, arguments[0], exception);
852     bool succeeded = toAXElement(thisObject)->addNotificationListener(callback);
853     return JSValueMakeBoolean(context, succeeded);
854 }
855
856 static JSValueRef removeNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
857 {
858     toAXElement(thisObject)->removeNotificationListener();
859     return JSValueMakeUndefined(context);
860 }
861
862 // Implementation
863
864 // Unsupported methods on various platforms.
865 #if !PLATFORM(MAC)
866 JSStringRef AccessibilityUIElement::speak() { return 0; }
867 JSStringRef AccessibilityUIElement::rangeForLine(int line) { return 0; }
868 void AccessibilityUIElement::setSelectedChild(AccessibilityUIElement*) const { }
869 unsigned AccessibilityUIElement::selectedChildrenCount() const { return 0; }
870 AccessibilityUIElement AccessibilityUIElement::selectedChildAtIndex(unsigned) const { return 0; }
871 AccessibilityUIElement AccessibilityUIElement::uiElementAttributeValue(JSStringRef) const { return 0; }
872 #endif
873
874 #if !PLATFORM(WIN)
875 bool AccessibilityUIElement::isEqual(AccessibilityUIElement* otherElement)
876 {
877     return platformUIElement() == otherElement->platformUIElement();
878 }
879 #endif
880
881 #if !SUPPORTS_AX_TEXTMARKERS
882
883 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForElement(AccessibilityUIElement*)
884 {
885     return 0;
886 }
887
888 int AccessibilityUIElement::textMarkerRangeLength(AccessibilityTextMarkerRange*)
889 {
890     return 0;
891 }
892
893 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForMarkers(AccessibilityTextMarker*, AccessibilityTextMarker*)
894 {
895     return 0;
896 }
897
898 AccessibilityTextMarker AccessibilityUIElement::startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
899 {
900     return 0;
901 }
902
903 AccessibilityTextMarker AccessibilityUIElement::endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
904 {
905     return 0;   
906 }
907
908 AccessibilityUIElement AccessibilityUIElement::accessibilityElementForTextMarker(AccessibilityTextMarker*)
909 {
910     return 0;
911 }
912
913 AccessibilityTextMarker AccessibilityUIElement::textMarkerForPoint(int x, int y)
914 {
915     return 0;
916 }
917
918 AccessibilityTextMarker AccessibilityUIElement::previousTextMarker(AccessibilityTextMarker*)
919 {
920     return 0;    
921 }
922
923 AccessibilityTextMarker AccessibilityUIElement::nextTextMarker(AccessibilityTextMarker*)
924 {
925     return 0;
926 }
927
928 JSStringRef AccessibilityUIElement::stringForTextMarkerRange(AccessibilityTextMarkerRange*)
929 {
930     return 0;
931 }
932
933 #endif
934
935 // Destruction
936
937 static void finalize(JSObjectRef thisObject)
938 {
939     delete toAXElement(thisObject);
940 }
941
942 // Object Creation
943
944 JSObjectRef AccessibilityUIElement::makeJSAccessibilityUIElement(JSContextRef context, const AccessibilityUIElement& element)
945 {
946     if (!element)
947         return 0;
948     
949     return JSObjectMake(context, AccessibilityUIElement::getJSClass(), new AccessibilityUIElement(element));
950 }
951
952 JSClassRef AccessibilityUIElement::getJSClass()
953 {
954     static JSStaticValue staticValues[] = {
955         { "accessibilityValue", getAccessibilityValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
956         { "role", getRoleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
957         { "subrole", getSubroleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
958         { "roleDescription", getRoleDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
959         { "title", getTitleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
960         { "description", getDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
961         { "language", getLanguageCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
962         { "helpText", getHelpTextCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
963         { "stringValue", getStringValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
964         { "x", getXCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
965         { "y", getYCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
966         { "width", getWidthCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
967         { "height", getHeightCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
968         { "clickPointX", getClickPointXCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
969         { "clickPointY", getClickPointYCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
970         { "intValue", getIntValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
971         { "minValue", getMinValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
972         { "maxValue", getMaxValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
973         { "childrenCount", getChildrenCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
974         { "rowCount", rowCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
975         { "columnCount", columnCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
976         { "insertionPointLineNumber", getInsertionPointLineNumberCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
977         { "selectedTextRange", getSelectedTextRangeCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
978         { "isEnabled", getIsEnabledCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
979         { "isRequired", getIsRequiredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
980         { "isFocused", getIsFocusedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
981         { "isFocusable", getIsFocusableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
982         { "isSelected", getIsSelectedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
983         { "isSelectable", getIsSelectableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
984         { "isMultiSelectable", getIsMultiSelectableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
985         { "isExpanded", getIsExpandedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
986         { "isChecked", getIsCheckedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
987         { "isVisible", getIsVisibleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
988         { "isOffScreen", getIsOffScreenCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
989         { "isCollapsed", getIsCollapsedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
990         { "hasPopup", getHasPopupCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
991         { "valueDescription", getValueDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
992         { "hierarchicalLevel", hierarchicalLevelCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
993         { "documentEncoding", getDocumentEncodingCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
994         { "documentURI", getDocumentURICallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
995         { "url", getURLCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
996         { "isValid", getIsValidCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
997         { "orientation", getOrientationCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
998         { "ariaIsGrabbed", getARIAIsGrabbedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
999         { "ariaDropEffects", getARIADropEffectsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1000         { "isIgnored", isIgnoredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1001         { "speak", speakCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1002         { "selectedChildrenCount", selectedChildrenCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1003         { 0, 0, 0, 0 }
1004     };
1005
1006     static JSStaticFunction staticFunctions[] = {
1007         { "allAttributes", allAttributesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1008         { "attributesOfLinkedUIElements", attributesOfLinkedUIElementsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1009         { "attributesOfDocumentLinks", attributesOfDocumentLinksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1010         { "attributesOfChildren", attributesOfChildrenCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1011         { "parameterizedAttributeNames", parameterizedAttributeNamesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1012         { "lineForIndex", lineForIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1013         { "rangeForLine", rangeForLineCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1014         { "boundsForRange", boundsForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1015         { "stringForRange", stringForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1016         { "attributedStringForRange", attributedStringForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1017         { "attributedStringRangeIsMisspelled", attributedStringRangeIsMisspelledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1018         { "uiElementForSearchPredicate", uiElementForSearchPredicateCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1019         { "childAtIndex", childAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1020         { "linkedUIElementAtIndex", linkedUIElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1021         { "indexOfChild", indexOfChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1022         { "elementAtPoint", elementAtPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1023         { "attributesOfColumnHeaders", attributesOfColumnHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1024         { "attributesOfRowHeaders", attributesOfRowHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1025         { "attributesOfColumns", attributesOfColumnsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1026         { "attributesOfRows", attributesOfRowsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1027         { "attributesOfVisibleCells", attributesOfVisibleCellsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1028         { "attributesOfHeader", attributesOfHeaderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1029         { "indexInTable", indexInTableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1030         { "rowIndexRange", rowIndexRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1031         { "columnIndexRange", columnIndexRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1032         { "cellForColumnAndRow", cellForColumnAndRowCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1033         { "titleUIElement", titleUIElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1034         { "setSelectedTextRange", setSelectedTextRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1035         { "stringAttributeValue", stringAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1036         { "uiElementAttributeValue", uiElementAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1037         { "numberAttributeValue", numberAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1038         { "boolAttributeValue", boolAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1039         { "isAttributeSupported", isAttributeSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1040         { "isAttributeSettable", isAttributeSettableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1041         { "isActionSupported", isActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1042         { "parentElement", parentElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1043         { "disclosedByRow", disclosedByRowCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1044         { "increment", incrementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1045         { "decrement", decrementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1046         { "showMenu", showMenuCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1047         { "press", pressCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1048         { "disclosedRowAtIndex", disclosedRowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1049         { "ariaOwnsElementAtIndex", ariaOwnsElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1050         { "ariaFlowToElementAtIndex", ariaFlowToElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1051         { "selectedRowAtIndex", selectedRowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1052         { "isEqual", isEqualCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1053         { "addNotificationListener", addNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1054         { "removeNotificationListener", removeNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1055         { "takeFocus", takeFocusCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1056         { "takeSelection", takeSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1057         { "addSelection", addSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1058         { "removeSelection", removeSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1059         { "textMarkerRangeForElement", textMarkerRangeForElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1060         { "textMarkerRangeForMarkers", textMarkerRangeForMarkersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1061         { "startTextMarkerForTextMarkerRange", startTextMarkerForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1062         { "endTextMarkerForTextMarkerRange", endTextMarkerForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1063         { "accessibilityElementForTextMarker", accessibilityElementForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1064         { "textMarkerRangeLength", textMarkerRangeLengthCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1065         { "textMarkerForPoint", textMarkerForPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1066         { "nextTextMarker", nextTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1067         { "previousTextMarker", previousTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1068         { "stringForTextMarkerRange", stringForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1069         { "setSelectedChild", setSelectedChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1070         { "selectedChildAtIndex", selectedChildAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
1071         { 0, 0, 0 }
1072     };
1073
1074     static JSClassDefinition classDefinition = {
1075         0, kJSClassAttributeNone, "AccessibilityUIElement", 0, staticValues, staticFunctions,
1076         0, finalize, 0, 0, 0, 0, 0, 0, 0, 0, 0
1077     };
1078
1079     static JSClassRef accessibilityUIElementClass = JSClassCreate(&classDefinition);
1080     return accessibilityUIElementClass;
1081 }