Home | History | Annotate | Download | only in DumpRenderTree
      1 /*
      2  * Copyright (C) 2008, 2009, 2010 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 "AccessibilityController.h"
     28 
     29 #include "AccessibilityUIElement.h"
     30 #include <JavaScriptCore/JSRetainPtr.h>
     31 
     32 // Static Value Getters
     33 
     34 static JSValueRef getFocusedElementCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
     35 {
     36     AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject));
     37     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, controller->focusedElement());
     38 }
     39 
     40 static JSValueRef getRootElementCallback(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
     41 {
     42     AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject));
     43     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, controller->rootElement());
     44 }
     45 
     46 // Object Creation
     47 
     48 void AccessibilityController::makeWindowObject(JSContextRef context, JSObjectRef windowObject, JSValueRef* exception)
     49 {
     50     JSRetainPtr<JSStringRef> accessibilityControllerStr(Adopt, JSStringCreateWithUTF8CString("accessibilityController"));
     51 
     52     JSClassRef classRef = getJSClass();
     53     JSValueRef accessibilityControllerObject = JSObjectMake(context, classRef, this);
     54     JSClassRelease(classRef);
     55 
     56     JSObjectSetProperty(context, windowObject, accessibilityControllerStr.get(), accessibilityControllerObject, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete, exception);
     57 }
     58 
     59 static JSValueRef logFocusEventsCallback(JSContextRef ctx, JSObjectRef, JSObjectRef thisObject, size_t, const JSValueRef[], JSValueRef*)
     60 {
     61     AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject));
     62     controller->setLogFocusEvents(true);
     63     return JSValueMakeUndefined(ctx);
     64 }
     65 
     66 static JSValueRef logValueChangeEventsCallback(JSContextRef ctx, JSObjectRef, JSObjectRef thisObject, size_t, const JSValueRef[], JSValueRef*)
     67 {
     68     AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject));
     69     controller->setLogValueChangeEvents(true);
     70     return JSValueMakeUndefined(ctx);
     71 }
     72 
     73 static JSValueRef logScrollingStartEventsCallback(JSContextRef ctx, JSObjectRef, JSObjectRef thisObject, size_t, const JSValueRef[], JSValueRef*)
     74 {
     75     AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject));
     76     controller->setLogScrollingStartEvents(true);
     77     return JSValueMakeUndefined(ctx);
     78 }
     79 
     80 static JSValueRef logAccessibilityEventsCallback(JSContextRef ctx, JSObjectRef, JSObjectRef thisObject, size_t, const JSValueRef[], JSValueRef*)
     81 {
     82     AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject));
     83     controller->setLogAccessibilityEvents(true);
     84     return JSValueMakeUndefined(ctx);
     85 }
     86 
     87 static JSValueRef getElementAtPointCallback(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
     88 {
     89     int x = 0;
     90     int y = 0;
     91     if (argumentCount == 2) {
     92         x = JSValueToNumber(context, arguments[0], exception);
     93         y = JSValueToNumber(context, arguments[1], exception);
     94     }
     95 
     96     AccessibilityController* controller = static_cast<AccessibilityController*>(JSObjectGetPrivate(thisObject));
     97     return AccessibilityUIElement::makeJSAccessibilityUIElement(context, controller->elementAtPoint(x, y));
     98 }
     99 
    100 JSClassRef AccessibilityController::getJSClass()
    101 {
    102     static JSStaticFunction staticFunctions[] = {
    103         { "logFocusEvents", logFocusEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    104         { "logValueChangeEvents", logValueChangeEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    105         { "logScrollingStartEvents", logScrollingStartEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    106         { "logAccessibilityEvents", logAccessibilityEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    107         { "elementAtPoint", getElementAtPointCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    108         { 0, 0, 0 }
    109     };
    110 
    111     static JSStaticValue staticValues[] = {
    112         { "focusedElement", getFocusedElementCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    113         { "rootElement", getRootElementCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
    114         { 0, 0, 0, 0 }
    115     };
    116 
    117     static JSClassDefinition classDefinition = {
    118         0, kJSClassAttributeNone, "AccessibilityController", 0, staticValues, staticFunctions,
    119         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    120     };
    121 
    122     return JSClassCreate(&classDefinition);
    123 }
    124 
    125 void AccessibilityController::resetToConsistentState()
    126 {
    127     setLogFocusEvents(false);
    128     setLogValueChangeEvents(false);
    129     setLogScrollingStartEvents(false);
    130     setLogAccessibilityEvents(false);
    131 }
    132