diff --git a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java index 3bf3cf8f44e..652875738b7 100644 --- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java +++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibility.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,15 @@ package sun.lwawt.macosx; +import sun.lwawt.LWWindowPeer; + import java.awt.*; import java.beans.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.concurrent.Callable; +import sun.awt.AWTAccessor; import javax.accessibility.*; import javax.swing.*; @@ -421,6 +424,8 @@ class CAccessibility implements PropertyChangeListener { } public static AccessibleAction getAccessibleAction(final Accessible a, final Component c) { + if (a == null) return null; + return invokeAndWait(new Callable() { public AccessibleAction call() throws Exception { final AccessibleContext ac = a.getAccessibleContext(); @@ -667,4 +672,28 @@ class CAccessibility implements PropertyChangeListener { } }, c); } + + /** + * @return AWTView ptr, a peer of the CPlatformView associated with the toplevel container of the Accessible, if any + */ + private static long getAWTView(Accessible a) { + Accessible ax = CAccessible.getSwingAccessible(a); + if (!(ax instanceof Component)) return 0; + + return invokeAndWait(new Callable() { + public Long call() throws Exception { + Component cont = (Component) ax; + while (cont != null && !(cont instanceof Window)) { + cont = cont.getParent(); + } + if (cont != null) { + LWWindowPeer peer = (LWWindowPeer) AWTAccessor.getComponentAccessor().getPeer(cont); + if (peer != null) { + return ((CPlatformWindow) peer.getPlatformWindow()).getContentView().getAWTView(); + } + } + return 0L; + } + }, (Component)ax); + } } diff --git a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibleText.java b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibleText.java index 0237ef92d66..6abf06ecd08 100644 --- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibleText.java +++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessibleText.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -264,6 +264,8 @@ class CAccessibleText { final double localY = boundsUnion.getY(); final Point componentLocation = ac.getAccessibleComponent().getLocationOnScreen(); + if (componentLocation == null) return ret; + final double screenX = componentLocation.getX() + localX; final double screenY = componentLocation.getY() + localY; diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.h b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.h index 0344aebfe44..9f64001212c 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.h +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,6 +62,8 @@ - (void) deliverJavaMouseEvent: (NSEvent *) event; - (jobject) awtComponent:(JNIEnv *)env; ++ (AWTView *) awtView:(JNIEnv *)env ofAccessible:(jobject)jaccessible; + // Input method-related events - (void)setInputMethod:(jobject)inputMethod; - (void)abandonInput; diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m index 67115418d38..119056ed562 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTView.m @@ -29,6 +29,7 @@ #import "AWTWindow.h" #import "JavaComponentAccessibility.h" #import "JavaTextAccessibility.h" +#import "JavaAccessibilityUtilities.h" #import "GeomUtilities.h" #import "OSVersion.h" #import "ThreadUtilities.h" @@ -129,7 +130,7 @@ static BOOL shouldUsePressAndHold() { self.cglLayer = nil; JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; - (*env)->DeleteGlobalRef(env, m_cPlatformView); + (*env)->DeleteWeakGlobalRef(env, m_cPlatformView); m_cPlatformView = NULL; if (fInputMethodLOCKABLE != NULL) @@ -396,7 +397,11 @@ static BOOL shouldUsePressAndHold() { static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); static JNF_MEMBER_CACHE(jm_deliverMouseEvent, jc_PlatformView, "deliverMouseEvent", "(Lsun/lwawt/macosx/NSEvent;)V"); - JNFCallVoidMethod(env, m_cPlatformView, jm_deliverMouseEvent, jEvent); + jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView); + if (!(*env)->IsSameObject(env, jlocal, NULL)) { + JNFCallVoidMethod(env, jlocal, jm_deliverMouseEvent, jEvent); + (*env)->DeleteLocalRef(env, jlocal); + } (*env)->DeleteLocalRef(env, jEvent); } @@ -459,8 +464,11 @@ static BOOL shouldUsePressAndHold() { static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); static JNF_MEMBER_CACHE(jm_deliverKeyEvent, jc_PlatformView, "deliverKeyEvent", "(Lsun/lwawt/macosx/NSEvent;)V"); - JNFCallVoidMethod(env, m_cPlatformView, jm_deliverKeyEvent, jEvent); - + jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView); + if (!(*env)->IsSameObject(env, jlocal, NULL)) { + JNFCallVoidMethod(env, jlocal, jm_deliverKeyEvent, jEvent); + (*env)->DeleteLocalRef(env, jlocal); + } if (characters != NULL) { (*env)->DeleteLocalRef(env, characters); } @@ -475,7 +483,12 @@ static BOOL shouldUsePressAndHold() { JNIEnv *env = [ThreadUtilities getJNIEnv]; static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); static JNF_MEMBER_CACHE(jm_deliverResize, jc_PlatformView, "deliverResize", "(IIII)V"); - JNFCallVoidMethod(env, m_cPlatformView, jm_deliverResize, x,y,w,h); + + jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView); + if (!(*env)->IsSameObject(env, jlocal, NULL)) { + JNFCallVoidMethod(env, jlocal, jm_deliverResize, x,y,w,h); + (*env)->DeleteLocalRef(env, jlocal); + } } @@ -504,7 +517,11 @@ static BOOL shouldUsePressAndHold() { */ static JNF_CLASS_CACHE(jc_CPlatformView, "sun/lwawt/macosx/CPlatformView"); static JNF_MEMBER_CACHE(jm_deliverWindowDidExposeEvent, jc_CPlatformView, "deliverWindowDidExposeEvent", "()V"); - JNFCallVoidMethod(env, m_cPlatformView, jm_deliverWindowDidExposeEvent); + jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView); + if (!(*env)->IsSameObject(env, jlocal, NULL)) { + JNFCallVoidMethod(env, jlocal, jm_deliverWindowDidExposeEvent); + (*env)->DeleteLocalRef(env, jlocal); + } /* } */ @@ -541,7 +558,13 @@ static BOOL shouldUsePressAndHold() { } return NULL; } - jobject peer = JNFGetObjectField(env, m_cPlatformView, jf_Peer); + + jobject peer = NULL; + jobject jlocal = (*env)->NewLocalRef(env, m_cPlatformView); + if (!(*env)->IsSameObject(env, jlocal, NULL)) { + peer = JNFGetObjectField(env, jlocal, jf_Peer); + (*env)->DeleteLocalRef(env, jlocal); + } static JNF_CLASS_CACHE(jc_LWWindowPeer, "sun/lwawt/LWWindowPeer"); static JNF_MEMBER_CACHE(jf_Target, jc_LWWindowPeer, "target", "Ljava/awt/Component;"); if (peer == NULL) { @@ -549,12 +572,27 @@ static BOOL shouldUsePressAndHold() { JNFDumpJavaStack(env); return NULL; } - return JNFGetObjectField(env, peer, jf_Target); + jobject comp = JNFGetObjectField(env, peer, jf_Target); + (*env)->DeleteLocalRef(env, peer); + return comp; +} + ++ (AWTView *) awtView:(JNIEnv*)env ofAccessible:(jobject)jaccessible +{ + static JNF_STATIC_MEMBER_CACHE(jm_getAWTView, sjc_CAccessibility, "getAWTView", "(Ljavax/accessibility/Accessible;)J"); + + jlong jptr = JNFCallStaticLongMethod(env, jm_getAWTView, jaccessible); + if (jptr == 0) return nil; + + return (AWTView *)jlong_to_ptr(jptr); } - (id)getAxData:(JNIEnv*)env { - return [[[JavaComponentAccessibility alloc] initWithParent:self withEnv:env withAccessible:[self awtComponent:env] withIndex:-1 withView:self withJavaRole:nil] autorelease]; + jobject jcomponent = [self awtComponent:env]; + id ax = [[[JavaComponentAccessibility alloc] initWithParent:self withEnv:env withAccessible:jcomponent withIndex:-1 withView:self withJavaRole:nil] autorelease]; + (*env)->DeleteLocalRef(env, jcomponent); + return ax; } - (NSArray *)accessibilityAttributeNames @@ -1299,7 +1337,7 @@ Java_sun_lwawt_macosx_CPlatformView_nativeCreateView JNF_COCOA_ENTER(env); NSRect rect = NSMakeRect(originX, originY, width, height); - jobject cPlatformView = (*env)->NewGlobalRef(env, obj); + jobject cPlatformView = (*env)->NewWeakGlobalRef(env, obj); [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityAction.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityAction.m index d0f8b871004..523000c76b4 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityAction.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityAction.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,9 +35,9 @@ { self = [super init]; if (self) { - fAccessibleAction = JNFNewGlobalRef(env, accessibleAction); + fAccessibleAction = JNFNewWeakGlobalRef(env, accessibleAction); fIndex = index; - fComponent = JNFNewGlobalRef(env, component); + fComponent = JNFNewWeakGlobalRef(env, component); } return self; } @@ -46,10 +46,10 @@ { JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; - JNFDeleteGlobalRef(env, fAccessibleAction); + JNFDeleteWeakGlobalRef(env, fAccessibleAction); fAccessibleAction = NULL; - JNFDeleteGlobalRef(env, fComponent); + JNFDeleteWeakGlobalRef(env, fComponent); fComponent = NULL; [super dealloc]; @@ -61,7 +61,18 @@ JNIEnv* env = [ThreadUtilities getJNIEnv]; - return JNFJavaToNSString(env, JNFCallStaticObjectMethod(env, jm_getAccessibleActionDescription, fAccessibleAction, fIndex, fComponent)); // AWT_THREADING Safe (AWTRunLoopMode) + jobject fCompLocal = (*env)->NewLocalRef(env, fComponent); + if ((*env)->IsSameObject(env, fCompLocal, NULL)) { + return @"unknown"; + } + NSString *str = nil; + jobject jstr = JNFCallStaticObjectMethod(env, jm_getAccessibleActionDescription, fAccessibleAction, fIndex, fCompLocal); + if (jstr != NULL) { + NSString *str = JNFJavaToNSString(env, jstr); // AWT_THREADING Safe (AWTRunLoopMode) + (*env)->DeleteLocalRef(env, jstr); + } + (*env)->DeleteLocalRef(env, fCompLocal); + return str == nil ? @"unknown" : str; } - (void)perform @@ -82,9 +93,9 @@ { self = [super init]; if (self) { - fTabGroup = JNFNewGlobalRef(env, tabGroup); + fTabGroup = JNFNewWeakGlobalRef(env, tabGroup); fIndex = index; - fComponent = JNFNewGlobalRef(env, component); + fComponent = JNFNewWeakGlobalRef(env, component); } return self; } @@ -93,10 +104,10 @@ { JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; - JNFDeleteGlobalRef(env, fTabGroup); + JNFDeleteWeakGlobalRef(env, fTabGroup); fTabGroup = NULL; - JNFDeleteGlobalRef(env, fComponent); + JNFDeleteWeakGlobalRef(env, fComponent); fComponent = NULL; [super dealloc]; diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m index 081c7f7b431..2b999368cb1 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaAccessibilityUtilities.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -77,7 +77,9 @@ NSString *getJavaRole(JNIEnv *env, jobject axComponent, jobject component) jobject axRole = JNFCallStaticObjectMethod(env, sjm_getAccessibleRole, axComponent, component); // AWT_THREADING Safe (AWTRunLoopMode) if (axRole == NULL) return @"unknown"; - return JNFJavaToNSString(env, axRole); + NSString* str = JNFJavaToNSString(env, axRole); + (*env)->DeleteLocalRef(env, axRole); + return str; } jobject getAxSelection(JNIEnv *env, jobject axContext, jobject component) @@ -126,21 +128,27 @@ BOOL isVertical(JNIEnv *env, jobject axContext, jobject component) { static JNF_STATIC_MEMBER_CACHE(jm_VERTICAL, sjc_AccessibleState, "VERTICAL", "Ljavax/accessibility/AccessibleState;"); jobject axVertState = JNFGetStaticObjectField(env, jm_VERTICAL); - return containsAxState(env, axContext, axVertState, component); + BOOL vertical = containsAxState(env, axContext, axVertState, component); + (*env)->DeleteLocalRef(env, axVertState); + return vertical; } BOOL isHorizontal(JNIEnv *env, jobject axContext, jobject component) { static JNF_STATIC_MEMBER_CACHE(jm_HORIZONTAL, sjc_AccessibleState, "HORIZONTAL", "Ljavax/accessibility/AccessibleState;"); jobject axHorizState = JNFGetStaticObjectField(env, jm_HORIZONTAL); - return containsAxState(env, axContext, axHorizState, component); + BOOL horizontal = containsAxState(env, axContext, axHorizState, component); + (*env)->DeleteLocalRef(env, axHorizState); + return horizontal; } BOOL isShowing(JNIEnv *env, jobject axContext, jobject component) { static JNF_STATIC_MEMBER_CACHE(jm_SHOWING, sjc_AccessibleState, "SHOWING", "Ljavax/accessibility/AccessibleState;"); jobject axVisibleState = JNFGetStaticObjectField(env, jm_SHOWING); - return containsAxState(env, axContext, axVisibleState, component); + BOOL showing = containsAxState(env, axContext, axVisibleState, component); + (*env)->DeleteLocalRef(env, axVisibleState); + return showing; } NSPoint getAxComponentLocationOnScreen(JNIEnv *env, jobject axComponent, jobject component) diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m index 1b3ec43a9fe..b740d05895c 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaComponentAccessibility.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -75,7 +75,6 @@ static jobject sAccessibilityClass = NULL; static NSMutableDictionary *sAttributeNamesForRoleCache = nil; static NSObject *sAttributeNamesLOCK = nil; - @interface TabGroupAccessibility : JavaComponentAccessibility { NSInteger _numTabs; } @@ -137,8 +136,11 @@ static NSObject *sAttributeNamesLOCK = nil; fView = [view retain]; fJavaRole = [javaRole retain]; - fAccessible = JNFNewGlobalRef(env, accessible); - fComponent = JNFNewGlobalRef(env, [(AWTView *)fView awtComponent:env]); + fAccessible = (*env)->NewWeakGlobalRef(env, accessible); + + jobject jcomponent = [(AWTView *)fView awtComponent:env]; + fComponent = (*env)->NewWeakGlobalRef(env, jcomponent); + (*env)->DeleteLocalRef(env, jcomponent); fIndex = index; @@ -166,10 +168,10 @@ static NSObject *sAttributeNamesLOCK = nil; JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; - JNFDeleteGlobalRef(env, fAccessible); + (*env)->DeleteWeakGlobalRef(env, fAccessible); fAccessible = NULL; - JNFDeleteGlobalRef(env, fComponent); + (*env)->DeleteWeakGlobalRef(env, fComponent); fComponent = NULL; [fParent release]; @@ -279,7 +281,7 @@ static NSObject *sAttributeNamesLOCK = nil; + (NSArray *)childrenOfParent:(JavaComponentAccessibility *)parent withEnv:(JNIEnv *)env withChildrenCode:(NSInteger)whichChildren allowIgnored:(BOOL)allowIgnored { - jobjectArray jchildrenAndRoles = JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, parent->fAccessible, parent->fComponent, whichChildren, allowIgnored); // AWT_THREADING Safe (AWTRunLoop) + jobjectArray jchildrenAndRoles = (jobjectArray)JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, parent->fAccessible, parent->fComponent, whichChildren, allowIgnored); // AWT_THREADING Safe (AWTRunLoop) if (jchildrenAndRoles == NULL) return nil; jsize arrayLen = (*env)->GetArrayLength(env, jchildrenAndRoles); @@ -294,14 +296,21 @@ static NSObject *sAttributeNamesLOCK = nil; NSString *childJavaRole = nil; if (jchildJavaRole != NULL) { - childJavaRole = JNFJavaToNSString(env, JNFGetObjectField(env, jchildJavaRole, sjf_key)); + jobject jkey = JNFGetObjectField(env, jchildJavaRole, sjf_key); + childJavaRole = JNFJavaToNSString(env, jkey); + (*env)->DeleteLocalRef(env, jkey); } JavaComponentAccessibility *child = [self createWithParent:parent accessible:jchild role:childJavaRole index:childIndex withEnv:env withView:parent->fView]; + + (*env)->DeleteLocalRef(env, jchild); + (*env)->DeleteLocalRef(env, jchildJavaRole); + [children addObject:child]; childIndex++; } - + (*env)->DeleteLocalRef(env, jchildrenAndRoles); + return children; } @@ -310,7 +319,7 @@ static NSObject *sAttributeNamesLOCK = nil; jobject jcomponent = [(AWTView *)view awtComponent:env]; jint index = JNFCallStaticIntMethod(env, sjm_getAccessibleIndexInParent, jaccessible, jcomponent); NSString *javaRole = getJavaRole(env, jaccessible, jcomponent); - + (*env)->DeleteLocalRef(env, jcomponent); return [self createWithAccessible:jaccessible role:javaRole index:index withEnv:env withView:view]; } @@ -325,7 +334,10 @@ static NSObject *sAttributeNamesLOCK = nil; jobject jCAX = [JavaComponentAccessibility getCAccessible:jaccessible withEnv:env]; if (jCAX == NULL) return nil; JavaComponentAccessibility *value = (JavaComponentAccessibility *) jlong_to_ptr(JNFGetLongField(env, jCAX, jf_ptr)); - if (value != nil) return [[value retain] autorelease]; + if (value != nil) { + (*env)->DeleteLocalRef(env, jCAX); + return [[value retain] autorelease]; + } // otherwise, create a new instance JavaComponentAccessibility *newChild = nil; @@ -348,6 +360,7 @@ static NSObject *sAttributeNamesLOCK = nil; // must hard retain pointer poked into Java object [newChild retain]; JNFSetLongField(env, jCAX, jf_ptr, ptr_to_jlong(newChild)); + (*env)->DeleteLocalRef(env, jCAX); // return autoreleased instance return [newChild autorelease]; @@ -380,7 +393,7 @@ static NSObject *sAttributeNamesLOCK = nil; // Get all the other accessibility attributes states we need in one swell foop. // javaRole isn't pulled in because we need protected access to AccessibleRole.key - jbooleanArray attributeStates = JNFCallStaticObjectMethod(env, jm_getInitialAttributeStates, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) + jbooleanArray attributeStates = (jbooleanArray)JNFCallStaticObjectMethod(env, jm_getInitialAttributeStates, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) if (attributeStates == NULL) return nil; jboolean *attributeStatesArray = (*env)->GetBooleanArrayElements(env, attributeStates, 0); if (attributeStatesArray == NULL) { @@ -475,6 +488,7 @@ static NSObject *sAttributeNamesLOCK = nil; JavaAxAction *action = [[JavaAxAction alloc] initWithEnv:env withAccessibleAction:axAction withIndex:0 withComponent:fComponent]; [fActions setObject:action forKey:[self isMenu] ? NSAccessibilityPickAction : NSAccessibilityPressAction]; [action release]; + (*env)->DeleteLocalRef(env, axAction); } } @@ -485,7 +499,9 @@ static NSObject *sAttributeNamesLOCK = nil; - (id)parent { + static JNF_CLASS_CACHE(sjc_Window, "java/awt/Window"); static JNF_STATIC_MEMBER_CACHE(sjm_getAccessibleParent, sjc_CAccessibility, "getAccessibleParent", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;)Ljavax/accessibility/Accessible;"); + static JNF_STATIC_MEMBER_CACHE(sjm_getSwingAccessible, sjc_CAccessible, "getSwingAccessible", "(Ljavax/accessibility/Accessible;)Ljavax/accessibility/Accessible;"); if(fParent == nil) { JNIEnv* env = [ThreadUtilities getJNIEnv]; @@ -495,10 +511,21 @@ static NSObject *sAttributeNamesLOCK = nil; if (jparent == NULL) { fParent = fView; } else { - fParent = [JavaComponentAccessibility createWithAccessible:jparent withEnv:env withView:fView]; + AWTView *view = fView; + jobject jax = JNFCallStaticObjectMethod(env, sjm_getSwingAccessible, fAccessible); + + if (JNFIsInstanceOf(env, jax, &sjc_Window)) { + // In this case jparent is an owner toplevel and we should retrieve its own view + view = [AWTView awtView:env ofAccessible:jparent]; + } + if (view != nil) { + fParent = [JavaComponentAccessibility createWithAccessible:jparent withEnv:env withView:view]; + } if (fParent == nil) { fParent = fView; } + (*env)->DeleteLocalRef(env, jparent); + (*env)->DeleteLocalRef(env, jax ); } [fParent retain]; } @@ -546,7 +573,10 @@ static NSObject *sAttributeNamesLOCK = nil; return NO; } - return isShowing(env, [self axContextWithEnv:env], fComponent); + jobject axContext = [self axContextWithEnv:env]; + BOOL showing = isShowing(env, axContext, fComponent); + (*env)->DeleteLocalRef(env, axContext); + return showing; } // the array of names for each role is cached in the sAttributeNamesForRoleCache @@ -723,7 +753,12 @@ static NSObject *sAttributeNamesLOCK = nil; JNIEnv* env = [ThreadUtilities getJNIEnv]; jobject val = JNFCallStaticObjectMethod(env, sjm_getAccessibleDescription, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) - return JNFJavaToNSString(env, val); + if (val == NULL) { + return @"unknown"; + } + NSString* str = JNFJavaToNSString(env, val); + (*env)->DeleteLocalRef(env, val); + return str; } - (BOOL)accessibilityIsHelpAttributeSettable @@ -739,7 +774,12 @@ static NSObject *sAttributeNamesLOCK = nil; JNIEnv* env = [ThreadUtilities getJNIEnv]; jobject axValue = JNFCallStaticObjectMethod(env, jm_getMaximumAccessibleValue, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) - return JNFJavaToNSNumber(env, axValue); + if (axValue == NULL) { + return [NSNumber numberWithInt:0]; + } + NSNumber* num = JNFJavaToNSNumber(env, axValue); + (*env)->DeleteLocalRef(env, axValue); + return num; } - (BOOL)accessibilityIsMaxValueAttributeSettable @@ -755,7 +795,12 @@ static NSObject *sAttributeNamesLOCK = nil; JNIEnv* env = [ThreadUtilities getJNIEnv]; jobject axValue = JNFCallStaticObjectMethod(env, jm_getMinimumAccessibleValue, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) - return JNFJavaToNSNumber(env, axValue); + if (axValue == NULL) { + return [NSNumber numberWithInt:0]; + } + NSNumber* num = JNFJavaToNSNumber(env, axValue); + (*env)->DeleteLocalRef(env, axValue); + return num; } - (BOOL)accessibilityIsMinValueAttributeSettable @@ -770,13 +815,16 @@ static NSObject *sAttributeNamesLOCK = nil; // cmcnote - should batch these two calls into one that returns an array of two bools, one for vertical and one for horiz if (isVertical(env, axContext, fComponent)) { + (*env)->DeleteLocalRef(env, axContext); return NSAccessibilityVerticalOrientationValue; } if (isHorizontal(env, axContext, fComponent)) { + (*env)->DeleteLocalRef(env, axContext); return NSAccessibilityHorizontalOrientationValue; } + (*env)->DeleteLocalRef(env, axContext); return nil; } @@ -808,6 +856,7 @@ static NSObject *sAttributeNamesLOCK = nil; // Get the java screen coords, and make a NSPoint of the bottom left of the AxComponent. NSSize size = getAxComponentSize(env, axComponent, fComponent); NSPoint point = getAxComponentLocationOnScreen(env, axComponent, fComponent); + (*env)->DeleteLocalRef(env, axComponent); point.y += size.height; @@ -857,8 +906,9 @@ static NSObject *sAttributeNamesLOCK = nil; JNIEnv* env = [ThreadUtilities getJNIEnv]; jobject axRole = JNFCallStaticObjectMethod(env, jm_getAccessibleRoleDisplayString, fAccessible, fComponent); - if(axRole != NULL) { + if (axRole != NULL) { value = JNFJavaToNSString(env, axRole); + (*env)->DeleteLocalRef(env, axRole); } else { value = @"unknown"; } @@ -893,7 +943,9 @@ static NSObject *sAttributeNamesLOCK = nil; - (NSValue *)accessibilitySizeAttribute { JNIEnv* env = [ThreadUtilities getJNIEnv]; jobject axComponent = JNFCallStaticObjectMethod(env, sjm_getAccessibleComponent, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) - return [NSValue valueWithSize:getAxComponentSize(env, axComponent, fComponent)]; + NSValue* size = [NSValue valueWithSize:getAxComponentSize(env, axComponent, fComponent)]; + (*env)->DeleteLocalRef(env, axComponent); + return size; } - (BOOL)accessibilityIsSizeAttributeSettable @@ -952,7 +1004,12 @@ static NSObject *sAttributeNamesLOCK = nil; JNIEnv* env = [ThreadUtilities getJNIEnv]; jobject val = JNFCallStaticObjectMethod(env, sjm_getAccessibleName, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) - return JNFJavaToNSString(env, val); + if (val == NULL) { + return @"unknown"; + } + NSString* str = JNFJavaToNSString(env, val); + (*env)->DeleteLocalRef(env, val); + return str; } - (BOOL)accessibilityIsTitleAttributeSettable @@ -984,8 +1041,20 @@ static NSObject *sAttributeNamesLOCK = nil; // a text value is taken care of in JavaTextAccessibility // cmcnote should coalesce these calls into one java call + NSNumber *num = nil; jobject axValue = JNFCallStaticObjectMethod(env, sjm_getAccessibleValue, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) - return JNFJavaToNSNumber(env, JNFCallStaticObjectMethod(env, jm_getCurrentAccessibleValue, axValue, fComponent)); // AWT_THREADING Safe (AWTRunLoop) + if (axValue != NULL) { + jobject str = JNFCallStaticObjectMethod(env, jm_getCurrentAccessibleValue, axValue, fComponent); + if (str != NULL) { + num = JNFJavaToNSNumber(env, str); // AWT_THREADING Safe (AWTRunLoop) + (*env)->DeleteLocalRef(env, str); + } + (*env)->DeleteLocalRef(env, axValue); + } + if (num == nil) { + num = [NSNumber numberWithInt:0]; + } + return num; } - (BOOL)accessibilityIsValueAttributeSettable @@ -1084,7 +1153,10 @@ static NSObject *sAttributeNamesLOCK = nil; id value = nil; if (JNFIsInstanceOf(env, jparent, &jc_Container)) { jobject jaccessible = JNFCallStaticObjectMethod(env, jm_accessibilityHitTest, jparent, (jfloat)point.x, (jfloat)point.y); // AWT_THREADING Safe (AWTRunLoop) - value = [JavaComponentAccessibility createWithAccessible:jaccessible withEnv:env withView:fView]; + if (jaccessible != NULL) { + value = [JavaComponentAccessibility createWithAccessible:jaccessible withEnv:env withView:fView]; + (*env)->DeleteLocalRef(env, jaccessible); + } } if (value == nil) { @@ -1116,6 +1188,7 @@ static NSObject *sAttributeNamesLOCK = nil; if (JNFIsInstanceOf(env, focused, &sjc_Accessible)) { value = [JavaComponentAccessibility createWithAccessible:focused withEnv:env withView:fView]; } + (*env)->DeleteLocalRef(env, focused); } if (value == nil) { @@ -1222,38 +1295,46 @@ JNF_COCOA_EXIT(env); for (i = 0; i < _numTabs; i++) { aTab = (JavaComponentAccessibility *)[tabs objectAtIndex:i]; if ([aTab isAccessibleWithEnv:env forAccessible:selAccessible]) { + (*env)->DeleteLocalRef(env, selAccessible); return aTab; } } - + (*env)->DeleteLocalRef(env, selAccessible); return nil; } - (NSArray *)tabControlsWithEnv:(JNIEnv *)env withTabGroupAxContext:(jobject)axContext withTabCode:(NSInteger)whichTabs allowIgnored:(BOOL)allowIgnored { - jobjectArray jtabsAndRoles = JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, fAccessible, fComponent, whichTabs, allowIgnored); // AWT_THREADING Safe (AWTRunLoop) + jobjectArray jtabsAndRoles = (jobjectArray)JNFCallStaticObjectMethod(env, jm_getChildrenAndRoles, fAccessible, fComponent, whichTabs, allowIgnored); // AWT_THREADING Safe (AWTRunLoop) if(jtabsAndRoles == NULL) return nil; jsize arrayLen = (*env)->GetArrayLength(env, jtabsAndRoles); - if (arrayLen == 0) return nil; - + if (arrayLen == 0) { + (*env)->DeleteLocalRef(env, jtabsAndRoles); + return nil; + } NSMutableArray *tabs = [NSMutableArray arrayWithCapacity:(arrayLen/2)]; // all of the tabs have the same role, so we can just find out what that is here and use it for all the tabs jobject jtabJavaRole = (*env)->GetObjectArrayElement(env, jtabsAndRoles, 1); // the array entries alternate between tab/role, starting with tab. so the first role is entry 1. - if (jtabJavaRole == NULL) return nil; - - NSString *tabJavaRole = JNFJavaToNSString(env, JNFGetObjectField(env, jtabJavaRole, sjf_key)); + if (jtabJavaRole == NULL) { + (*env)->DeleteLocalRef(env, jtabsAndRoles); + return nil; + } + jobject jkey = JNFGetObjectField(env, jtabJavaRole, sjf_key); + NSString *tabJavaRole = JNFJavaToNSString(env, jkey); + (*env)->DeleteLocalRef(env, jkey); NSInteger i; NSUInteger tabIndex = (whichTabs >= 0) ? whichTabs : 0; // if we're getting one particular child, make sure to set its index correctly for(i = 0; i < arrayLen; i+=2) { jobject jtab = (*env)->GetObjectArrayElement(env, jtabsAndRoles, i); JavaComponentAccessibility *tab = [[[TabGroupControlAccessibility alloc] initWithParent:self withEnv:env withAccessible:jtab withIndex:tabIndex withTabGroup:axContext withView:[self view] withJavaRole:tabJavaRole] autorelease]; + (*env)->DeleteLocalRef(env, jtab); [tabs addObject:tab]; tabIndex++; } - + (*env)->DeleteLocalRef(env, jtabsAndRoles); return tabs; } @@ -1272,7 +1353,9 @@ JNF_COCOA_EXIT(env); { JNIEnv *env = [ThreadUtilities getJNIEnv]; jobject axContext = [self axContextWithEnv:env]; - return [self tabControlsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO]; + id tabs = [self tabControlsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO]; + (*env)->DeleteLocalRef(env, axContext); + return tabs; } - (BOOL)accessibilityIsTabsAttributeSettable @@ -1292,7 +1375,9 @@ JNF_COCOA_EXIT(env); { JNIEnv *env = [ThreadUtilities getJNIEnv]; jobject axContext = [self axContextWithEnv:env]; - return [self contentsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO]; + NSArray* cont = [self contentsWithEnv:env withTabGroupAxContext:axContext withTabCode:JAVA_AX_ALL_CHILDREN allowIgnored:NO]; + (*env)->DeleteLocalRef(env, axContext); + return cont; } - (BOOL)accessibilityIsContentsAttributeSettable @@ -1305,7 +1390,9 @@ JNF_COCOA_EXIT(env); { JNIEnv *env = [ThreadUtilities getJNIEnv]; jobject axContext = [self axContextWithEnv:env]; - return [self currentTabWithEnv:env withAxContext:axContext]; + id val = [self currentTabWithEnv:env withAxContext:axContext]; + (*env)->DeleteLocalRef(env, axContext); + return val; } - (BOOL)accessibilityIsValueAttributeSettable @@ -1322,6 +1409,7 @@ JNF_COCOA_EXIT(env); JNIEnv *env = [ThreadUtilities getJNIEnv]; jobject axContext = [self axContextWithEnv:env]; setAxContextSelection(env, axContext, fIndex, fComponent); + (*env)->DeleteLocalRef(env, axContext); } - (NSArray *)accessibilityChildrenAttribute @@ -1357,6 +1445,7 @@ JNF_COCOA_EXIT(env); result = children; } } + (*env)->DeleteLocalRef(env, axContext); } else { result = [super accessibilityArrayAttributeValues:attribute index:index maxCount:maxCount]; } @@ -1375,7 +1464,7 @@ static BOOL ObjectEquals(JNIEnv *env, jobject a, jobject b, jobject component); self = [super initWithParent:parent withEnv:env withAccessible:accessible withIndex:index withView:view withJavaRole:javaRole]; if (self) { if (tabGroup != NULL) { - fTabGroupAxContext = JNFNewGlobalRef(env, tabGroup); + fTabGroupAxContext = JNFNewWeakGlobalRef(env, tabGroup); } else { fTabGroupAxContext = NULL; } @@ -1388,7 +1477,7 @@ static BOOL ObjectEquals(JNIEnv *env, jobject a, jobject b, jobject component); JNIEnv *env = [ThreadUtilities getJNIEnvUncached]; if (fTabGroupAxContext != NULL) { - JNFDeleteGlobalRef(env, fTabGroupAxContext); + JNFDeleteWeakGlobalRef(env, fTabGroupAxContext); fTabGroupAxContext = NULL; } @@ -1399,9 +1488,14 @@ static BOOL ObjectEquals(JNIEnv *env, jobject a, jobject b, jobject component); { JNIEnv *env = [ThreadUtilities getJNIEnv]; jobject axContext = [self axContextWithEnv:env]; + jobject selAccessible = getAxContextSelection(env, [self tabGroup], fIndex, fComponent); // Returns the current selection of the page tab list - return [NSNumber numberWithBool:ObjectEquals(env, axContext, getAxContextSelection(env, [self tabGroup], fIndex, fComponent), fComponent)]; + id val = [NSNumber numberWithBool:ObjectEquals(env, axContext, selAccessible, fComponent)]; + + (*env)->DeleteLocalRef(env, selAccessible); + (*env)->DeleteLocalRef(env, axContext); + return val; } - (void)getActionsWithEnv:(JNIEnv *)env @@ -1416,7 +1510,8 @@ static BOOL ObjectEquals(JNIEnv *env, jobject a, jobject b, jobject component); if (fTabGroupAxContext == NULL) { JNIEnv* env = [ThreadUtilities getJNIEnv]; jobject tabGroupAxContext = [(JavaComponentAccessibility *)[self parent] axContextWithEnv:env]; - fTabGroupAxContext = JNFNewGlobalRef(env, tabGroupAxContext); + fTabGroupAxContext = JNFNewWeakGlobalRef(env, tabGroupAxContext); + (*env)->DeleteLocalRef(env, tabGroupAxContext); } return fTabGroupAxContext; } @@ -1451,8 +1546,10 @@ static BOOL ObjectEquals(JNIEnv *env, jobject a, jobject b, jobject component); if ([[aElement accessibilityRoleAttribute] isEqualToString:NSAccessibilityScrollBarRole]) { jobject elementAxContext = [aElement axContextWithEnv:env]; if (isHorizontal(env, elementAxContext, fComponent)) { + (*env)->DeleteLocalRef(env, elementAxContext); return aElement; } + (*env)->DeleteLocalRef(env, elementAxContext); } } @@ -1478,8 +1575,10 @@ static BOOL ObjectEquals(JNIEnv *env, jobject a, jobject b, jobject component); if ([[aElement accessibilityRoleAttribute] isEqualToString:NSAccessibilityScrollBarRole]) { jobject elementAxContext = [aElement axContextWithEnv:env]; if (isVertical(env, elementAxContext, fComponent)) { + (*env)->DeleteLocalRef(env, elementAxContext); return aElement; } + (*env)->DeleteLocalRef(env, elementAxContext); } } diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaTextAccessibility.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaTextAccessibility.m index 2809d8bcbf5..f7e17b0e96f 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaTextAccessibility.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/JavaTextAccessibility.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -112,7 +112,9 @@ NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { // if it's static text, the AppKit AXValue is the java accessibleName jobject axName = JNFCallStaticObjectMethod(env, sjm_getAccessibleName, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) if (axName != NULL) { - return JNFJavaToNSString(env, axName); + NSString* str = JNFJavaToNSString(env, axName); + (*env)->DeleteLocalRef(env, axName); + return str; } // value is still nil if no accessibleName for static text. Below, try to get the accessibleText. } @@ -120,12 +122,18 @@ NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { // cmcnote: inefficient to make three distinct JNI calls. Coalesce. radr://3951923 jobject axText = JNFCallStaticObjectMethod(env, sjm_getAccessibleText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) if (axText == NULL) return nil; - + (*env)->DeleteLocalRef(env, axText); + jobject axEditableText = JNFCallStaticObjectMethod(env, sjm_getAccessibleEditableText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) if (axEditableText == NULL) return nil; static JNF_STATIC_MEMBER_CACHE(jm_getTextRange, sjc_CAccessibleText, "getTextRange", "(Ljavax/accessibility/AccessibleEditableText;IILjava/awt/Component;)Ljava/lang/String;"); - NSString *string = JNFJavaToNSString(env, JNFCallStaticObjectMethod(env, jm_getTextRange, axEditableText, 0, getAxTextCharCount(env, axEditableText, fComponent), fComponent)); // AWT_THREADING Safe (AWTRunLoop) + jobject jrange = JNFCallStaticObjectMethod(env, jm_getTextRange, axEditableText, 0, getAxTextCharCount(env, axEditableText, fComponent), fComponent); + NSString *string = JNFJavaToNSString(env, jrange); // AWT_THREADING Safe (AWTRunLoop) + + (*env)->DeleteLocalRef(env, jrange); + (*env)->DeleteLocalRef(env, axEditableText); + if (string == nil) string = @""; return string; } @@ -139,6 +147,7 @@ NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { JNIEnv* env = [ThreadUtilities getJNIEnv]; jobject axEditableText = JNFCallStaticObjectMethod(env, sjm_getAccessibleEditableText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) if (axEditableText == NULL) return NO; + (*env)->DeleteLocalRef(env, axEditableText); return YES; } @@ -157,7 +166,9 @@ NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { static JNF_STATIC_MEMBER_CACHE(jm_getSelectedText, sjc_CAccessibleText, "getSelectedText", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;)Ljava/lang/String;"); jobject axText = JNFCallStaticObjectMethod(env, jm_getSelectedText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) if (axText == NULL) return @""; - return JNFJavaToNSString(env, axText); + NSString* str = JNFJavaToNSString(env, axText); + (*env)->DeleteLocalRef(env, axText); + return str; } - (BOOL)accessibilityIsSelectedTextAttributeSettable @@ -220,7 +231,9 @@ NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { // also, static text doesn't always have accessibleText. if axText is null, should get the charcount of the accessibleName instead JNIEnv *env = [ThreadUtilities getJNIEnv]; jobject axText = JNFCallStaticObjectMethod(env, sjm_getAccessibleText, fAccessible, fComponent); // AWT_THREADING Safe (AWTRunLoop) - return [NSNumber numberWithInt:getAxTextCharCount(env, axText, fComponent)]; + NSNumber* num = [NSNumber numberWithInt:getAxTextCharCount(env, axText, fComponent)]; + (*env)->DeleteLocalRef(env, axText); + return num; } - (BOOL)accessibilityIsNumberOfCharactersAttributeSettable @@ -285,7 +298,7 @@ NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { JNIEnv *env = [ThreadUtilities getJNIEnv]; static JNF_STATIC_MEMBER_CACHE(jm_getBoundsForRange, sjc_CAccessibleText, "getBoundsForRange", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;II)[D"); - jdoubleArray axBounds = JNFCallStaticObjectMethod(env, jm_getBoundsForRange, fAccessible, fComponent, range.location, range.length); // AWT_THREADING Safe (AWTRunLoop) + jdoubleArray axBounds = (jdoubleArray)JNFCallStaticObjectMethod(env, jm_getBoundsForRange, fAccessible, fComponent, range.location, range.length); // AWT_THREADING Safe (AWTRunLoop) if (axBounds == NULL) return nil; // We cheat because we know that the array is 4 elements long (x, y, width, height) @@ -324,7 +337,7 @@ NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { JNIEnv *env = [ThreadUtilities getJNIEnv]; static JNF_STATIC_MEMBER_CACHE(jm_getRangeForLine, sjc_CAccessibleText, "getRangeForLine", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;I)[I"); - jintArray axTextRange = JNFCallStaticObjectMethod(env, jm_getRangeForLine, fAccessible, fComponent, [line intValue]); // AWT_THREADING Safe (AWTRunLoop) + jintArray axTextRange = (jintArray)JNFCallStaticObjectMethod(env, jm_getRangeForLine, fAccessible, fComponent, [line intValue]); // AWT_THREADING Safe (AWTRunLoop) if (axTextRange == NULL) return nil; return javaIntArrayToNSRangeValue(env,axTextRange); @@ -350,10 +363,12 @@ NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { JNIEnv *env = [ThreadUtilities getJNIEnv]; static JNF_STATIC_MEMBER_CACHE(jm_getStringForRange, sjc_CAccessibleText, "getStringForRange", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;II)Ljava/lang/String;"); - jstring jstringForRange = JNFCallStaticObjectMethod(env, jm_getStringForRange, fAccessible, fComponent, range.location, range.length); // AWT_THREADING Safe (AWTRunLoop) + jstring jstringForRange = (jstring)JNFCallStaticObjectMethod(env, jm_getStringForRange, fAccessible, fComponent, range.location, range.length); // AWT_THREADING Safe (AWTRunLoop) if (jstringForRange == NULL) return @""; - return JNFJavaToNSString(env, jstringForRange); + NSString* str = JNFJavaToNSString(env, jstringForRange); + (*env)->DeleteLocalRef(env, jstringForRange); + return str; } // @@ -406,7 +421,7 @@ NSValue *javaIntArrayToNSRangeValue(JNIEnv* env, jintArray array) { JNIEnv *env = [ThreadUtilities getJNIEnv]; static JNF_STATIC_MEMBER_CACHE(jm_getRangeForIndex, sjc_CAccessibleText, "getRangeForIndex", "(Ljavax/accessibility/Accessible;Ljava/awt/Component;I)[I"); - jintArray axTextRange = JNFCallStaticObjectMethod(env, jm_getRangeForIndex, fAccessible, fComponent, index); // AWT_THREADING Safe (AWTRunLoop) + jintArray axTextRange = (jintArray)JNFCallStaticObjectMethod(env, jm_getRangeForIndex, fAccessible, fComponent, index); // AWT_THREADING Safe (AWTRunLoop) if (axTextRange == NULL) return nil; return javaIntArrayToNSRangeValue(env, axTextRange); diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.h b/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.h index 4a34dda953c..843de484813 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.h +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ @interface CGLLayer : CAOpenGLLayer { @private - JNFJObjectWrapper *javaLayer; + JNFWeakJObjectWrapper *javaLayer; // intermediate buffer, used the RQ lock to synchronize GLuint textureID; @@ -45,7 +45,7 @@ #endif /* REMOTELAYER */ } -@property (nonatomic, retain) JNFJObjectWrapper *javaLayer; +@property (nonatomic, retain) JNFWeakJObjectWrapper *javaLayer; @property (readwrite, assign) GLuint textureID; @property (readwrite, assign) GLenum target; @property (readwrite, assign) float textureWidth; @@ -57,7 +57,7 @@ @property (nonatomic, retain) NSObject *jrsRemoteLayer; #endif -- (id) initWithJavaLayer:(JNFJObjectWrapper *)javaLayer; +- (id) initWithJavaLayer:(JNFWeakJObjectWrapper *)javaLayer; - (void) blitTexture; @end diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.m index f300ea404c4..87dcf1d351c 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLLayer.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,7 @@ extern NSOpenGLContext *sharedContext; @synthesize jrsRemoteLayer; #endif -- (id) initWithJavaLayer:(JNFJObjectWrapper *)layer; +- (id) initWithJavaLayer:(JNFWeakJObjectWrapper *)layer; { AWT_ASSERT_APPKIT_THREAD; // Initialize ourselves @@ -133,6 +133,15 @@ AWT_ASSERT_APPKIT_THREAD; { AWT_ASSERT_APPKIT_THREAD; + JNIEnv *env = [ThreadUtilities getJNIEnv]; + static JNF_CLASS_CACHE(jc_JavaLayer, "sun/java2d/opengl/CGLLayer"); + static JNF_MEMBER_CACHE(jm_drawInCGLContext, jc_JavaLayer, "drawInCGLContext", "()V"); + + jobject javaLayerLocalRef = [self.javaLayer jObjectWithEnv:env]; + if ((*env)->IsSameObject(env, javaLayerLocalRef, NULL)) { + return; + } + // Set the current context to the one given to us. CGLSetCurrentContext(glContext); @@ -141,12 +150,7 @@ AWT_ASSERT_APPKIT_THREAD; glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, textureWidth, textureHeight); - - JNIEnv *env = [ThreadUtilities getJNIEnv]; - static JNF_CLASS_CACHE(jc_JavaLayer, "sun/java2d/opengl/CGLLayer"); - static JNF_MEMBER_CACHE(jm_drawInCGLContext, jc_JavaLayer, "drawInCGLContext", "()V"); - jobject javaLayerLocalRef = [self.javaLayer jObjectWithEnv:env]; JNFCallVoidMethod(env, javaLayerLocalRef, jm_drawInCGLContext); (*env)->DeleteLocalRef(env, javaLayerLocalRef); @@ -171,7 +175,7 @@ Java_sun_java2d_opengl_CGLLayer_nativeCreateLayer JNF_COCOA_ENTER(env); - JNFJObjectWrapper *javaLayer = [JNFJObjectWrapper wrapperWithJObject:obj withEnv:env]; + JNFWeakJObjectWrapper *javaLayer = [JNFWeakJObjectWrapper wrapperWithJObject:obj withEnv:env]; [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ AWT_ASSERT_APPKIT_THREAD;