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 JSClassRef AccessibilityController::getJSClass() 81 { 82 static JSStaticFunction staticFunctions[] = { 83 { "logFocusEvents", logFocusEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 84 { "logValueChangeEvents", logValueChangeEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 85 { "logScrollingStartEvents", logScrollingStartEventsCallback, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 86 { 0, 0, 0 } 87 }; 88 89 static JSStaticValue staticValues[] = { 90 { "focusedElement", getFocusedElementCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 91 { "rootElement", getRootElementCallback, 0, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete }, 92 { 0, 0, 0, 0 } 93 }; 94 95 static JSClassDefinition classDefinition = { 96 0, kJSClassAttributeNone, "AccessibilityController", 0, staticValues, staticFunctions, 97 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 98 }; 99 100 return JSClassCreate(&classDefinition); 101 } 102 103 void AccessibilityController::resetToConsistentState() 104 { 105 setLogFocusEvents(false); 106 setLogValueChangeEvents(false); 107 setLogScrollingStartEvents(false); 108 } 109