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 34static 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 40static 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 48void 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 59static 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 66static 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 73static 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 80static 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 87static 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 100JSClassRef 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 125void AccessibilityController::resetToConsistentState() 126{ 127 setLogFocusEvents(false); 128 setLogValueChangeEvents(false); 129 setLogScrollingStartEvents(false); 130 setLogAccessibilityEvents(false); 131} 132