1 /* 2 * Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #import "JavaAccessibilityAction.h" 27 #import "JavaAccessibilityUtilities.h" 28 29 #import "ThreadUtilities.h" 30 #import "JNIUtilities.h" 31 32 33 @implementation JavaAxAction 34 35 - (id)initWithEnv:(JNIEnv *)env withAccessibleAction:(jobject)accessibleAction withIndex:(jint)index withComponent:(jobject)component 36 { 37 self = [super init]; 38 if (self) { 39 fAccessibleAction = (*env)->NewWeakGlobalRef(env, accessibleAction); 40 CHECK_EXCEPTION(); 41 fIndex = index; 42 fComponent = (*env)->NewWeakGlobalRef(env, component); 43 CHECK_EXCEPTION(); 44 } 45 return self; 46 } 47 48 - (void)dealloc 49 { 50 JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; 51 52 (*env)->DeleteWeakGlobalRef(env, fAccessibleAction); 53 fAccessibleAction = NULL; 54 55 (*env)->DeleteWeakGlobalRef(env, fComponent); 56 fComponent = NULL; 57 58 [super dealloc]; 59 } 60 61 - (NSString *)getDescription 62 { 63 JNIEnv* env = [ThreadUtilities getJNIEnv]; 64 DECLARE_CLASS_RETURN(sjc_CAccessibility, "sun/lwawt/macosx/CAccessibility", nil); 65 DECLARE_STATIC_METHOD_RETURN(jm_getAccessibleActionDescription, sjc_CAccessibility, 66 "getAccessibleActionDescription", 67 "(Ljavax/accessibility/AccessibleAction;ILjava/awt/Component;)Ljava/lang/String;", nil); 68 69 /* WeakGlobalRefs can be cleared at any time, so first get strong local refs and use those */ 70 jobject fCompLocal = (*env)->NewLocalRef(env, fComponent); 71 if ((*env)->IsSameObject(env, fCompLocal, NULL)) { 72 return nil; 73 } 74 jobject fAccessibleActionLocal = (*env)->NewLocalRef(env, fAccessibleAction); 75 if ((*env)->IsSameObject(env, fAccessibleActionLocal, NULL)) { 76 (*env)->DeleteLocalRef(env, fCompLocal); 77 return nil; 78 } 79 NSString *str = nil; 80 jstring jstr = (*env)->CallStaticObjectMethod(env, sjc_CAccessibility, 81 jm_getAccessibleActionDescription, 82 fAccessibleActionLocal, 83 fIndex, 84 fCompLocal ); 85 CHECK_EXCEPTION(); 86 if (jstr != NULL) { 87 str = JavaStringToNSString(env, jstr); 88 (*env)->DeleteLocalRef(env, jstr); 89 } 90 (*env)->DeleteLocalRef(env, fCompLocal); 91 (*env)->DeleteLocalRef(env, fAccessibleActionLocal); 92 return str; 93 } 94 95 - (void)perform 96 { 97 JNIEnv* env = [ThreadUtilities getJNIEnv]; 98 DECLARE_CLASS(sjc_CAccessibility, "sun/lwawt/macosx/CAccessibility"); 99 DECLARE_STATIC_METHOD(jm_doAccessibleAction, sjc_CAccessibility, "doAccessibleAction", 100 "(Ljavax/accessibility/AccessibleAction;ILjava/awt/Component;)V"); 101 102 (*env)->CallStaticVoidMethod(env, sjc_CAccessibility, jm_doAccessibleAction, 103 fAccessibleAction, fIndex, fComponent); 104 CHECK_EXCEPTION(); 105 } 106 107 @end 108 109 110 @implementation TabGroupAction 111 112 - (id)initWithEnv:(JNIEnv *)env withTabGroup:(jobject)tabGroup withIndex:(jint)index withComponent:(jobject)component 113 { 114 self = [super init]; 115 if (self) { 116 fTabGroup = (*env)->NewWeakGlobalRef(env, tabGroup); 117 CHECK_EXCEPTION(); 118 fIndex = index; 119 fComponent = (*env)->NewWeakGlobalRef(env, component); 120 CHECK_EXCEPTION(); 121 } 122 return self; 123 } 124 125 - (void)dealloc 126 { 127 JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; 128 129 (*env)->DeleteWeakGlobalRef(env, fTabGroup); 130 fTabGroup = NULL; 131 132 (*env)->DeleteWeakGlobalRef(env, fComponent); 133 fComponent = NULL; 134 135 [super dealloc]; 136 } 137 138 - (NSString *)getDescription 139 { 140 return @"click"; 141 } 142 143 - (void)perform 144 { 145 JNIEnv* env = [ThreadUtilities getJNIEnv]; 146 147 setAxContextSelection(env, fTabGroup, fIndex, fComponent); 148 } 149 150 @end