Home | History | Annotate | Download | only in DumpRenderTree
      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 indexOfChildCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    189 {
    190     if (argumentCount != 1)
    191         return 0;
    192 
    193     JSObjectRef otherElement = JSValueToObject(context, arguments[0], exception);
    194     AccessibilityUIElement* childElement = toAXElement(otherElement);
    195     return JSValueMakeNumber(context, (double)toAXElement(thisObject)->indexOfChild(childElement));
    196 }
    197 
    198 static JSValueRef childAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    199 {
    200     int indexNumber = -1;
    201     if (argumentCount == 1)
    202         indexNumber = JSValueToNumber(context, arguments[0], exception);
    203 
    204     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->getChildAtIndex(indexNumber));
    205 }
    206 
    207 static JSValueRef selectedChildAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    208 {
    209     int indexNumber = -1;
    210     if (argumentCount == 1)
    211         indexNumber = JSValueToNumber(context, arguments[0], exception);
    212 
    213     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->selectedChildAtIndex(indexNumber));
    214 }
    215 
    216 static JSValueRef linkedUIElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    217 {
    218     int indexNumber = -1;
    219     if (argumentCount == 1)
    220         indexNumber = JSValueToNumber(context, arguments[0], exception);
    221 
    222     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->linkedUIElementAtIndex(indexNumber));
    223 }
    224 
    225 static JSValueRef disclosedRowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    226 {
    227     int indexNumber = 0;
    228     if (argumentCount == 1)
    229         indexNumber = JSValueToNumber(context, arguments[0], exception);
    230 
    231     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->disclosedRowAtIndex(indexNumber));
    232 }
    233 
    234 static JSValueRef ariaOwnsElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    235 {
    236     int indexNumber = 0;
    237     if (argumentCount == 1)
    238         indexNumber = JSValueToNumber(context, arguments[0], exception);
    239 
    240     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->ariaOwnsElementAtIndex(indexNumber));
    241 }
    242 
    243 static JSValueRef ariaFlowToElementAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    244 {
    245     int indexNumber = 0;
    246     if (argumentCount == 1)
    247         indexNumber = JSValueToNumber(context, arguments[0], exception);
    248 
    249     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->ariaFlowToElementAtIndex(indexNumber));
    250 }
    251 
    252 static JSValueRef selectedRowAtIndexCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    253 {
    254     int indexNumber = 0;
    255     if (argumentCount == 1)
    256         indexNumber = JSValueToNumber(context, arguments[0], exception);
    257 
    258     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->selectedRowAtIndex(indexNumber));
    259 }
    260 
    261 static JSValueRef isEqualCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    262 {
    263     JSObjectRef otherElement = 0;
    264     if (argumentCount == 1)
    265         otherElement = JSValueToObject(context, arguments[0], exception);
    266     else
    267         return JSValueMakeBoolean(context, false);
    268 
    269     return JSValueMakeBoolean(context, toAXElement(thisObject)->isEqual(toAXElement(otherElement)));
    270 }
    271 
    272 static JSValueRef setSelectedChildCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    273 {
    274     JSObjectRef element = 0;
    275     if (argumentCount == 1)
    276         element = JSValueToObject(context, arguments[0], exception);
    277 
    278     toAXElement(thisObject)->setSelectedChild(toAXElement(element));
    279 
    280     return JSValueMakeUndefined(context);
    281 }
    282 
    283 static JSValueRef elementAtPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    284 {
    285     int x = 0;
    286     int y = 0;
    287     if (argumentCount == 2) {
    288         x = JSValueToNumber(context, arguments[0], exception);
    289         y = JSValueToNumber(context, arguments[1], exception);
    290     }
    291 
    292     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->elementAtPoint(x, y));
    293 }
    294 
    295 static JSValueRef isAttributeSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    296 {
    297     JSStringRef attribute = 0;
    298     if (argumentCount == 1)
    299         attribute = JSValueToStringCopy(context, arguments[0], exception);
    300     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isAttributeSupported(attribute));
    301     if (attribute)
    302         JSStringRelease(attribute);
    303     return result;
    304 }
    305 
    306 static JSValueRef isAttributeSettableCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    307 {
    308     JSStringRef attribute = 0;
    309     if (argumentCount == 1)
    310         attribute = JSValueToStringCopy(context, arguments[0], exception);
    311     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isAttributeSettable(attribute));
    312     if (attribute)
    313         JSStringRelease(attribute);
    314     return result;
    315 }
    316 
    317 
    318 static JSValueRef isActionSupportedCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    319 {
    320     JSStringRef action = 0;
    321     if (argumentCount == 1)
    322         action = JSValueToStringCopy(context, arguments[0], exception);
    323     JSValueRef result = JSValueMakeBoolean(context, toAXElement(thisObject)->isActionSupported(action));
    324     if (action)
    325         JSStringRelease(action);
    326     return result;
    327 }
    328 
    329 static JSValueRef boolAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    330 {
    331     JSStringRef attribute = 0;
    332     if (argumentCount == 1)
    333         attribute = JSValueToStringCopy(context, arguments[0], exception);
    334     bool val = toAXElement(thisObject)->boolAttributeValue(attribute);
    335     JSValueRef result = JSValueMakeBoolean(context, val);
    336     if (attribute)
    337         JSStringRelease(attribute);
    338     return result;
    339 }
    340 
    341 static JSValueRef stringAttributeValueCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    342 {
    343     JSStringRef attribute = 0;
    344     if (argumentCount == 1)
    345         attribute = JSValueToStringCopy(context, arguments[0], exception);
    346     JSRetainPtr<JSStringRef> stringAttributeValue(Adopt, toAXElement(thisObject)->stringAttributeValue(attribute));
    347     JSValueRef result = JSValueMakeString(context, stringAttributeValue.get());
    348     if (attribute)
    349         JSStringRelease(attribute);
    350     return result;
    351 }
    352 
    353 static JSValueRef cellForColumnAndRowCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    354 {
    355     unsigned column = 0, row = 0;
    356     if (argumentCount == 2) {
    357         column = JSValueToNumber(context, arguments[0], exception);
    358         row = JSValueToNumber(context, arguments[1], exception);
    359     }
    360 
    361     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->cellForColumnAndRow(column, row));
    362 }
    363 
    364 static JSValueRef titleUIElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    365 {
    366     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->titleUIElement());
    367 }
    368 
    369 static JSValueRef parentElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    370 {
    371     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->parentElement());
    372 }
    373 
    374 static JSValueRef disclosedByRowCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    375 {
    376     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->disclosedByRow());
    377 }
    378 
    379 static JSValueRef setSelectedTextRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    380 {
    381     unsigned location = UINT_MAX, length = 0;
    382     if (argumentCount == 2) {
    383         location = JSValueToNumber(context, arguments[0], exception);
    384         length = JSValueToNumber(context, arguments[1], exception);
    385     }
    386 
    387     toAXElement(thisObject)->setSelectedTextRange(location, length);
    388     return JSValueMakeUndefined(context);
    389 }
    390 
    391 static JSValueRef incrementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    392 {
    393     toAXElement(thisObject)->increment();
    394     return JSValueMakeUndefined(context);
    395 }
    396 
    397 static JSValueRef decrementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    398 {
    399     toAXElement(thisObject)->decrement();
    400     return JSValueMakeUndefined(context);
    401 }
    402 
    403 static JSValueRef showMenuCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    404 {
    405     toAXElement(thisObject)->showMenu();
    406     return JSValueMakeUndefined(context);
    407 }
    408 
    409 static JSValueRef pressCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    410 {
    411     toAXElement(thisObject)->press();
    412     return JSValueMakeUndefined(context);
    413 }
    414 
    415 static JSValueRef takeFocusCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    416 {
    417     toAXElement(thisObject)->takeFocus();
    418     return JSValueMakeUndefined(context);
    419 }
    420 
    421 static JSValueRef takeSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    422 {
    423     toAXElement(thisObject)->takeSelection();
    424     return JSValueMakeUndefined(context);
    425 }
    426 
    427 static JSValueRef addSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    428 {
    429     toAXElement(thisObject)->addSelection();
    430     return JSValueMakeUndefined(context);
    431 }
    432 
    433 static JSValueRef removeSelectionCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    434 {
    435     toAXElement(thisObject)->removeSelection();
    436     return JSValueMakeUndefined(context);
    437 }
    438 
    439 static JSValueRef textMarkerRangeForElementCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    440 {
    441     AccessibilityUIElement* uiElement = 0;
    442     if (argumentCount == 1)
    443         uiElement = toAXElement(JSValueToObject(context, arguments[0], exception));
    444 
    445     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeForElement(uiElement));
    446 }
    447 
    448 static JSValueRef textMarkerRangeLengthCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    449 {
    450     AccessibilityTextMarkerRange* range = 0;
    451     if (argumentCount == 1)
    452         range = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
    453 
    454     return JSValueMakeNumber(context, (int)toAXElement(thisObject)->textMarkerRangeLength(range));
    455 }
    456 
    457 static JSValueRef textMarkerForPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    458 {
    459     int x = 0;
    460     int y = 0;
    461     if (argumentCount == 2) {
    462         x = JSValueToNumber(context, arguments[0], exception);
    463         y = JSValueToNumber(context, arguments[1], exception);
    464     }
    465 
    466     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->textMarkerForPoint(x, y));
    467 }
    468 
    469 static JSValueRef textMarkerRangeForMarkersCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    470 {
    471     AccessibilityTextMarker* startMarker = 0;
    472     AccessibilityTextMarker* endMarker = 0;
    473     if (argumentCount == 2) {
    474         startMarker = toTextMarker(JSValueToObject(context, arguments[0], exception));
    475         endMarker = toTextMarker(JSValueToObject(context, arguments[1], exception));
    476     }
    477 
    478     return AccessibilityTextMarkerRange::makeJSAccessibilityTextMarkerRange(context, toAXElement(thisObject)->textMarkerRangeForMarkers(startMarker, endMarker));
    479 }
    480 
    481 static JSValueRef startTextMarkerForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    482 {
    483     AccessibilityTextMarkerRange* markerRange = 0;
    484     if (argumentCount == 1)
    485         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
    486 
    487     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->startTextMarkerForTextMarkerRange(markerRange));
    488 }
    489 
    490 static JSValueRef endTextMarkerForTextMarkerRangeCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    491 {
    492     AccessibilityTextMarkerRange* markerRange = 0;
    493     if (argumentCount == 1)
    494         markerRange = toTextMarkerRange(JSValueToObject(context, arguments[0], exception));
    495 
    496     return AccessibilityTextMarker::makeJSAccessibilityTextMarker(context, toAXElement(thisObject)->endTextMarkerForTextMarkerRange(markerRange));
    497 }
    498 
    499 static JSValueRef accessibilityElementForTextMarkerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    500 {
    501     AccessibilityTextMarker* marker = 0;
    502     if (argumentCount == 1)
    503         marker = toTextMarker(JSValueToObject(context, arguments[0], exception));
    504 
    505     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, toAXElement(thisObject)->accessibilityElementForTextMarker(marker));
    506 }
    507 
    508 // Static Value Getters
    509 
    510 static JSValueRef getARIADropEffectsCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    511 {
    512     JSRetainPtr<JSStringRef> dropEffects(Adopt, toAXElement(thisObject)->ariaDropEffects());
    513     return JSValueMakeString(context, dropEffects.get());
    514 }
    515 
    516 static JSValueRef getARIAIsGrabbedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    517 {
    518     return JSValueMakeBoolean(context, toAXElement(thisObject)->ariaIsGrabbed());
    519 }
    520 
    521 static JSValueRef getIsValidCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    522 {
    523     AccessibilityUIElement* uiElement = toAXElement(thisObject);
    524     if (!uiElement->platformUIElement())
    525         return JSValueMakeBoolean(context, false);
    526 
    527     // There might be other platform logic that one could check here...
    528 
    529     return JSValueMakeBoolean(context, true);
    530 }
    531 
    532 static JSValueRef getRoleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    533 {
    534     JSRetainPtr<JSStringRef> role(Adopt, toAXElement(thisObject)->role());
    535     return JSValueMakeString(context, role.get());
    536 }
    537 
    538 static JSValueRef getSubroleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    539 {
    540     JSRetainPtr<JSStringRef> role(Adopt, toAXElement(thisObject)->subrole());
    541     return JSValueMakeString(context, role.get());
    542 }
    543 
    544 static JSValueRef getRoleDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    545 {
    546     JSRetainPtr<JSStringRef> roleDesc(Adopt, toAXElement(thisObject)->roleDescription());
    547     return JSValueMakeString(context, roleDesc.get());
    548 }
    549 
    550 static JSValueRef getTitleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    551 {
    552     JSRetainPtr<JSStringRef> title(Adopt, toAXElement(thisObject)->title());
    553     return JSValueMakeString(context, title.get());
    554 }
    555 
    556 static JSValueRef getDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    557 {
    558     JSRetainPtr<JSStringRef> description(Adopt, toAXElement(thisObject)->description());
    559     return JSValueMakeString(context, description.get());
    560 }
    561 
    562 static JSValueRef getStringValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    563 {
    564     JSRetainPtr<JSStringRef> stringValue(Adopt, toAXElement(thisObject)->stringValue());
    565     return JSValueMakeString(context, stringValue.get());
    566 }
    567 
    568 static JSValueRef getLanguageCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    569 {
    570     JSRetainPtr<JSStringRef> language(Adopt, toAXElement(thisObject)->language());
    571     return JSValueMakeString(context, language.get());
    572 }
    573 
    574 static JSValueRef getHelpTextCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    575 {
    576     JSRetainPtr<JSStringRef> language(Adopt, toAXElement(thisObject)->helpText());
    577     return JSValueMakeString(context, language.get());
    578 }
    579 
    580 static JSValueRef getOrientationCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    581 {
    582     JSRetainPtr<JSStringRef> orientation(Adopt, toAXElement(thisObject)->orientation());
    583     return JSValueMakeString(context, orientation.get());
    584 }
    585 
    586 static JSValueRef getChildrenCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    587 {
    588     return JSValueMakeNumber(context, toAXElement(thisObject)->childrenCount());
    589 }
    590 
    591 static JSValueRef rowCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    592 {
    593     return JSValueMakeNumber(context, toAXElement(thisObject)->rowCount());
    594 }
    595 
    596 static JSValueRef columnCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    597 {
    598     return JSValueMakeNumber(context, toAXElement(thisObject)->columnCount());
    599 }
    600 
    601 static JSValueRef getXCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    602 {
    603     return JSValueMakeNumber(context, toAXElement(thisObject)->x());
    604 }
    605 
    606 static JSValueRef getYCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    607 {
    608     return JSValueMakeNumber(context, toAXElement(thisObject)->y());
    609 }
    610 
    611 static JSValueRef getWidthCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    612 {
    613     return JSValueMakeNumber(context, toAXElement(thisObject)->width());
    614 }
    615 
    616 static JSValueRef getHeightCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    617 {
    618     return JSValueMakeNumber(context, toAXElement(thisObject)->height());
    619 }
    620 
    621 static JSValueRef getClickPointXCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    622 {
    623     return JSValueMakeNumber(context, toAXElement(thisObject)->clickPointX());
    624 }
    625 
    626 static JSValueRef getClickPointYCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    627 {
    628     return JSValueMakeNumber(context, toAXElement(thisObject)->clickPointY());
    629 }
    630 
    631 static JSValueRef getIntValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    632 {
    633     return JSValueMakeNumber(context, toAXElement(thisObject)->intValue());
    634 }
    635 
    636 static JSValueRef getMinValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    637 {
    638     return JSValueMakeNumber(context, toAXElement(thisObject)->minValue());
    639 }
    640 
    641 static JSValueRef getMaxValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    642 {
    643     return JSValueMakeNumber(context, toAXElement(thisObject)->maxValue());
    644 }
    645 
    646 static JSValueRef getInsertionPointLineNumberCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    647 {
    648     return JSValueMakeNumber(context, toAXElement(thisObject)->insertionPointLineNumber());
    649 }
    650 
    651 static JSValueRef getSelectedTextRangeCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    652 {
    653     JSRetainPtr<JSStringRef> selectedTextRange(Adopt, toAXElement(thisObject)->selectedTextRange());
    654     return JSValueMakeString(context, selectedTextRange.get());
    655 }
    656 
    657 static JSValueRef getIsEnabledCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    658 {
    659     return JSValueMakeBoolean(context, toAXElement(thisObject)->isEnabled());
    660 }
    661 
    662 static JSValueRef getIsRequiredCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    663 {
    664     return JSValueMakeBoolean(context, toAXElement(thisObject)->isRequired());
    665 }
    666 
    667 static JSValueRef getIsFocusedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    668 {
    669     return JSValueMakeBoolean(context, toAXElement(thisObject)->isFocused());
    670 }
    671 
    672 static JSValueRef getIsFocusableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    673 {
    674     return JSValueMakeBoolean(context, toAXElement(thisObject)->isFocusable());
    675 }
    676 
    677 static JSValueRef getIsSelectedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    678 {
    679     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelected());
    680 }
    681 
    682 static JSValueRef getIsSelectableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    683 {
    684     return JSValueMakeBoolean(context, toAXElement(thisObject)->isSelectable());
    685 }
    686 
    687 static JSValueRef getIsMultiSelectableCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    688 {
    689     return JSValueMakeBoolean(context, toAXElement(thisObject)->isMultiSelectable());
    690 }
    691 
    692 static JSValueRef getIsExpandedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    693 {
    694     return JSValueMakeBoolean(context, toAXElement(thisObject)->isExpanded());
    695 }
    696 
    697 static JSValueRef getIsCheckedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    698 {
    699     return JSValueMakeBoolean(context, toAXElement(thisObject)->isChecked());
    700 }
    701 
    702 static JSValueRef getIsVisibleCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    703 {
    704     return JSValueMakeBoolean(context, toAXElement(thisObject)->isVisible());
    705 }
    706 
    707 static JSValueRef getIsOffScreenCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    708 {
    709     return JSValueMakeBoolean(context, toAXElement(thisObject)->isOffScreen());
    710 }
    711 
    712 static JSValueRef getIsCollapsedCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    713 {
    714     return JSValueMakeBoolean(context, toAXElement(thisObject)->isCollapsed());
    715 }
    716 
    717 static JSValueRef isIgnoredCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    718 {
    719     return JSValueMakeBoolean(context, toAXElement(thisObject)->isIgnored());
    720 }
    721 
    722 static JSValueRef speakCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    723 {
    724     JSRetainPtr<JSStringRef> speakString(Adopt, toAXElement(thisObject)->speak());
    725     return JSValueMakeString(context, speakString.get());
    726 }
    727 
    728 static JSValueRef selectedChildrenCountCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    729 {
    730     return JSValueMakeNumber(context, toAXElement(thisObject)->selectedChildrenCount());
    731 }
    732 
    733 static JSValueRef getHasPopupCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    734 {
    735     return JSValueMakeBoolean(context, toAXElement(thisObject)->hasPopup());
    736 }
    737 
    738 static JSValueRef hierarchicalLevelCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef, JSValueRef*)
    739 {
    740     return JSValueMakeNumber(context, toAXElement(thisObject)->hierarchicalLevel());
    741 }
    742 
    743 static JSValueRef getValueDescriptionCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    744 {
    745     JSRetainPtr<JSStringRef> valueDescription(Adopt, toAXElement(thisObject)->valueDescription());
    746     return JSValueMakeString(context, valueDescription.get());
    747 }
    748 
    749 static JSValueRef getAccessibilityValueCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    750 {
    751     JSRetainPtr<JSStringRef> accessibilityValue(Adopt, toAXElement(thisObject)->accessibilityValue());
    752     return JSValueMakeString(context, accessibilityValue.get());
    753 }
    754 
    755 static JSValueRef getDocumentEncodingCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    756 {
    757     JSRetainPtr<JSStringRef> documentEncoding(Adopt, toAXElement(thisObject)->documentEncoding());
    758     return JSValueMakeString(context, documentEncoding.get());
    759 }
    760 
    761 static JSValueRef getDocumentURICallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    762 {
    763     JSRetainPtr<JSStringRef> documentURI(Adopt, toAXElement(thisObject)->documentURI());
    764     return JSValueMakeString(context, documentURI.get());
    765 }
    766 
    767 static JSValueRef getURLCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
    768 {
    769     JSRetainPtr<JSStringRef> url(Adopt, toAXElement(thisObject)->url());
    770     return JSValueMakeString(context, url.get());
    771 }
    772 
    773 static JSValueRef addNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    774 {
    775     if (argumentCount != 1)
    776         return JSValueMakeBoolean(context, false);
    777 
    778     JSObjectRef callback = JSValueToObject(context, arguments[0], exception);
    779     bool succeeded = toAXElement(thisObject)->addNotificationListener(callback);
    780     return JSValueMakeBoolean(context, succeeded);
    781 }
    782 
    783 static JSValueRef removeNotificationListenerCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
    784 {
    785     toAXElement(thisObject)->removeNotificationListener();
    786     return JSValueMakeUndefined(context);
    787 }
    788 
    789 // Implementation
    790 
    791 // Unsupported methods on various platforms.
    792 #if !PLATFORM(MAC)
    793 JSStringRef AccessibilityUIElement::speak() { return 0; }
    794 JSStringRef AccessibilityUIElement::rangeForLine(int line) { return 0; }
    795 void AccessibilityUIElement::setSelectedChild(AccessibilityUIElement*) const { }
    796 unsigned AccessibilityUIElement::selectedChildrenCount() const { return 0; }
    797 AccessibilityUIElement AccessibilityUIElement::selectedChildAtIndex(unsigned) const { return 0; }
    798 #endif
    799 
    800 #if !PLATFORM(WIN)
    801 bool AccessibilityUIElement::isEqual(AccessibilityUIElement* otherElement)
    802 {
    803     return platformUIElement() == otherElement->platformUIElement();
    804 }
    805 #endif
    806 
    807 #if !SUPPORTS_AX_TEXTMARKERS
    808 
    809 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForElement(AccessibilityUIElement*)
    810 {
    811     return 0;
    812 }
    813 
    814 int AccessibilityUIElement::textMarkerRangeLength(AccessibilityTextMarkerRange*)
    815 {
    816     return 0;
    817 }
    818 
    819 AccessibilityTextMarkerRange AccessibilityUIElement::textMarkerRangeForMarkers(AccessibilityTextMarker*, AccessibilityTextMarker*)
    820 {
    821     return 0;
    822 }
    823 
    824 AccessibilityTextMarker AccessibilityUIElement::startTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
    825 {
    826     return 0;
    827 }
    828 
    829 AccessibilityTextMarker AccessibilityUIElement::endTextMarkerForTextMarkerRange(AccessibilityTextMarkerRange*)
    830 {
    831     return 0;
    832 }
    833 
    834 AccessibilityUIElement AccessibilityUIElement::accessibilityElementForTextMarker(AccessibilityTextMarker*)
    835 {
    836     return 0;
    837 }
    838 
    839 AccessibilityTextMarker AccessibilityUIElement::textMarkerForPoint(int x, int y)
    840 {
    841     return 0;
    842 }
    843 
    844 #endif
    845 
    846 // Destruction
    847 
    848 static void finalize(JSObjectRef thisObject)
    849 {
    850     delete toAXElement(thisObject);
    851 }
    852 
    853 // Object Creation
    854 
    855 JSObjectRef AccessibilityUIElement::makeJSAccessibilityUIElement(JSContextRef context, const AccessibilityUIElement& element)
    856 {
    857     return JSObjectMake(context, AccessibilityUIElement::getJSClass(), new AccessibilityUIElement(element));
    858 }
    859 
    860 JSClassRef AccessibilityUIElement::getJSClass()
    861 {
    862     static JSStaticValue staticValues[] = {
    863         { "accessibilityValue", getAccessibilityValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    864         { "role", getRoleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    865         { "subrole", getSubroleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    866         { "roleDescription", getRoleDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    867         { "title", getTitleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    868         { "description", getDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    869         { "language", getLanguageCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    870         { "helpText", getHelpTextCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    871         { "stringValue", getStringValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    872         { "x", getXCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    873         { "y", getYCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    874         { "width", getWidthCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    875         { "height", getHeightCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    876         { "clickPointX", getClickPointXCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    877         { "clickPointY", getClickPointYCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    878         { "intValue", getIntValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    879         { "minValue", getMinValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    880         { "maxValue", getMaxValueCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    881         { "childrenCount", getChildrenCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    882         { "rowCount", rowCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    883         { "columnCount", columnCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    884         { "insertionPointLineNumber", getInsertionPointLineNumberCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    885         { "selectedTextRange", getSelectedTextRangeCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    886         { "isEnabled", getIsEnabledCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    887         { "isRequired", getIsRequiredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    888         { "isFocused", getIsFocusedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    889         { "isFocusable", getIsFocusableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    890         { "isSelected", getIsSelectedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    891         { "isSelectable", getIsSelectableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    892         { "isMultiSelectable", getIsMultiSelectableCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    893         { "isExpanded", getIsExpandedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    894         { "isChecked", getIsCheckedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    895         { "isVisible", getIsVisibleCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    896         { "isOffScreen", getIsOffScreenCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    897         { "isCollapsed", getIsCollapsedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    898         { "hasPopup", getHasPopupCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    899         { "valueDescription", getValueDescriptionCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    900         { "hierarchicalLevel", hierarchicalLevelCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    901         { "documentEncoding", getDocumentEncodingCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    902         { "documentURI", getDocumentURICallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    903         { "url", getURLCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    904         { "isValid", getIsValidCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    905         { "orientation", getOrientationCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    906         { "ariaIsGrabbed", getARIAIsGrabbedCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    907         { "ariaDropEffects", getARIADropEffectsCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    908         { "isIgnored", isIgnoredCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    909         { "speak", speakCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    910         { "selectedChildrenCount", selectedChildrenCountCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    911         { 0, 0, 0, 0 }
    912     };
    913 
    914     static JSStaticFunction staticFunctions[] = {
    915         { "allAttributes", allAttributesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    916         { "attributesOfLinkedUIElements", attributesOfLinkedUIElementsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    917         { "attributesOfDocumentLinks", attributesOfDocumentLinksCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    918         { "attributesOfChildren", attributesOfChildrenCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    919         { "parameterizedAttributeNames", parameterizedAttributeNamesCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    920         { "lineForIndex", lineForIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    921         { "rangeForLine", rangeForLineCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    922         { "boundsForRange", boundsForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    923         { "stringForRange", stringForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    924         { "attributedStringForRange", attributedStringForRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    925         { "attributedStringRangeIsMisspelled", attributedStringRangeIsMisspelledCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    926         { "childAtIndex", childAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    927         { "linkedUIElementAtIndex", linkedUIElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    928         { "indexOfChild", indexOfChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    929         { "elementAtPoint", elementAtPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    930         { "attributesOfColumnHeaders", attributesOfColumnHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    931         { "attributesOfRowHeaders", attributesOfRowHeadersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    932         { "attributesOfColumns", attributesOfColumnsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    933         { "attributesOfRows", attributesOfRowsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    934         { "attributesOfVisibleCells", attributesOfVisibleCellsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    935         { "attributesOfHeader", attributesOfHeaderCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    936         { "indexInTable", indexInTableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    937         { "rowIndexRange", rowIndexRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    938         { "columnIndexRange", columnIndexRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    939         { "cellForColumnAndRow", cellForColumnAndRowCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    940         { "titleUIElement", titleUIElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    941         { "setSelectedTextRange", setSelectedTextRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    942         { "stringAttributeValue", stringAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    943         { "boolAttributeValue", boolAttributeValueCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    944         { "isAttributeSupported", isAttributeSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    945         { "isAttributeSettable", isAttributeSettableCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    946         { "isActionSupported", isActionSupportedCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    947         { "parentElement", parentElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    948         { "disclosedByRow", disclosedByRowCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    949         { "increment", incrementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    950         { "decrement", decrementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    951         { "showMenu", showMenuCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    952         { "press", pressCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    953         { "disclosedRowAtIndex", disclosedRowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    954         { "ariaOwnsElementAtIndex", ariaOwnsElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    955         { "ariaFlowToElementAtIndex", ariaFlowToElementAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    956         { "selectedRowAtIndex", selectedRowAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    957         { "isEqual", isEqualCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    958         { "addNotificationListener", addNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    959         { "removeNotificationListener", removeNotificationListenerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    960         { "takeFocus", takeFocusCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    961         { "takeSelection", takeSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    962         { "addSelection", addSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    963         { "removeSelection", removeSelectionCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    964         { "textMarkerRangeForElement", textMarkerRangeForElementCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    965         { "textMarkerRangeForMarkers", textMarkerRangeForMarkersCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    966         { "startTextMarkerForTextMarkerRange", startTextMarkerForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    967         { "endTextMarkerForTextMarkerRange", endTextMarkerForTextMarkerRangeCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    968         { "accessibilityElementForTextMarker", accessibilityElementForTextMarkerCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    969         { "textMarkerRangeLength", textMarkerRangeLengthCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    970         { "textMarkerForPoint", textMarkerForPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    971         { "setSelectedChild", setSelectedChildCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    972         { "selectedChildAtIndex", selectedChildAtIndexCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    973         { 0, 0, 0 }
    974     };
    975 
    976     static JSClassDefinition classDefinition = {
    977         0, kJSClassAttributeNone, "AccessibilityUIElement", 0, staticValues, staticFunctions,
    978         0, finalize, 0, 0, 0, 0, 0, 0, 0, 0, 0
    979     };
    980 
    981     static JSClassRef accessibilityUIElementClass = JSClassCreate(&classDefinition);
    982     return accessibilityUIElementClass;
    983 }
    984