8035147: [macosx] Drag and Drop tests are failing with -Xchech:jni
Reviewed-by: serb, azvegint
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CDragSourceContextPeer.java Tue Feb 18 09:49:36 2014 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CDragSourceContextPeer.java Tue Feb 18 16:30:57 2014 +0400
@@ -141,7 +141,7 @@
// Create native dragging source:
final long nativeDragSource = createNativeDragSource(component, nativeViewPtr, transferable, triggerEvent,
(int) (dragOrigin.getX()), (int) (dragOrigin.getY()), extModifiers,
- clickCount, timestamp, fDragCImage, dragImageOffset.x, dragImageOffset.y,
+ clickCount, timestamp, fDragCImage != null ? fDragCImage.ptr : 0L, dragImageOffset.x, dragImageOffset.y,
getDragSourceContext().getSourceActions(), formats, formatMap);
if (nativeDragSource == 0)
@@ -484,7 +484,7 @@
// Native support:
private native long createNativeDragSource(Component component, long nativePeer, Transferable transferable,
InputEvent triggerEvent, int dragPosX, int dragPosY, int extModifiers, int clickCount, long timestamp,
- CImage nsDragImage, int dragImageOffsetX, int dragImageOffsetY,
+ long nsDragImagePtr, int dragImageOffsetX, int dragImageOffsetY,
int sourceActions, long[] formats, Map formatMap);
private native void doDragging(long nativeDragSource);
--- a/jdk/src/macosx/native/sun/awt/CDragSource.h Tue Feb 18 09:49:36 2014 +0400
+++ b/jdk/src/macosx/native/sun/awt/CDragSource.h Tue Feb 18 16:30:57 2014 +0400
@@ -70,7 +70,7 @@
modifiers:(jint)extModifiers
clickCount:(jint)clickCount
timeStamp:(jlong)timeStamp
- dragImage:(jobject)jDragImage
+ dragImage:(jlong)nsDragImagePtr
dragImageOffsetX:(jint)jDragImageOffsetX
dragImageOffsetY:(jint)jDragImageOffsetY
sourceActions:(jint)jSourceActions
--- a/jdk/src/macosx/native/sun/awt/CDragSource.m Tue Feb 18 09:49:36 2014 +0400
+++ b/jdk/src/macosx/native/sun/awt/CDragSource.m Tue Feb 18 16:30:57 2014 +0400
@@ -97,7 +97,7 @@
modifiers:(jint)extModifiers
clickCount:(jint)clickCount
timeStamp:(jlong)timeStamp
- dragImage:(jobject)jDragImage
+ dragImage:(jlong)nsDragImagePtr
dragImageOffsetX:(jint)jDragImageOffsetX
dragImageOffsetY:(jint)jDragImageOffsetY
sourceActions:(jint)jSourceActions
@@ -112,26 +112,21 @@
// Construct the object if we have a valid model for it:
if (control != nil) {
- JNIEnv *env = [ThreadUtilities getJNIEnv];
- fComponent = JNFNewGlobalRef(env, jComponent);
- fDragSourceContextPeer = JNFNewGlobalRef(env, jDragSourceContextPeer);
+ fComponent = jComponent;
+ fDragSourceContextPeer = jDragSourceContextPeer;
+ fTransferable = jTransferable;
+ fTriggerEvent = jTrigger;
- fTransferable = JNFNewGlobalRef(env, jTransferable);
- fTriggerEvent = JNFNewGlobalRef(env, jTrigger);
-
- if (jDragImage) {
- JNF_MEMBER_CACHE(nsImagePtr, CImageClass, "ptr", "J");
- jlong imgPtr = JNFGetLongField(env, jDragImage, nsImagePtr);
- fDragImage = (NSImage*) jlong_to_ptr(imgPtr); // Double-casting prevents compiler 'd$|//
-
+ if (nsDragImagePtr) {
+ fDragImage = (NSImage*) jlong_to_ptr(nsDragImagePtr);
[fDragImage retain];
}
fDragImageOffset = NSMakePoint(jDragImageOffsetX, jDragImageOffsetY);
fSourceActions = jSourceActions;
- fFormats = JNFNewGlobalRef(env, jFormats);
- fFormatMap = JNFNewGlobalRef(env, jFormatMap);
+ fFormats = jFormats;
+ fFormatMap = jFormatMap;
fTriggerEventTimeStamp = timeStamp;
fDragPos = NSMakePoint(dragPosX, dragPosY);
--- a/jdk/src/macosx/native/sun/awt/CDragSourceContextPeer.m Tue Feb 18 09:49:36 2014 +0400
+++ b/jdk/src/macosx/native/sun/awt/CDragSourceContextPeer.m Tue Feb 18 16:30:57 2014 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2014, 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
@@ -40,30 +40,39 @@
JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CDragSourceContextPeer_createNativeDragSource
(JNIEnv *env, jobject jthis, jobject jcomponent, jlong jnativepeer, jobject jtransferable,
jobject jtrigger, jint jdragposx, jint jdragposy, jint jextmodifiers, jint jclickcount, jlong jtimestamp,
- jobject jnsdragimage, jint jdragimageoffsetx, jint jdragimageoffsety,
+ jlong nsdragimageptr, jint jdragimageoffsetx, jint jdragimageoffsety,
jint jsourceactions, jlongArray jformats, jobject jformatmap)
{
id controlObj = (id) jlong_to_ptr(jnativepeer);
__block CDragSource* dragSource = nil;
JNF_COCOA_ENTER(env);
+
+ // Global references are disposed when the DragSource is removed
+ jobject gComponent = JNFNewGlobalRef(env, jcomponent);
+ jobject gDragSourceContextPeer = JNFNewGlobalRef(env, jthis);
+ jobject gTransferable = JNFNewGlobalRef(env, jtransferable);
+ jobject gTriggerEvent = JNFNewGlobalRef(env, jtrigger);
+ jlongArray gFormats = JNFNewGlobalRef(env, jformats);
+ jobject gFormatMap = JNFNewGlobalRef(env, jformatmap);
+
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
- dragSource = [[CDragSource alloc] init:jthis
- component:jcomponent
+ dragSource = [[CDragSource alloc] init:gDragSourceContextPeer
+ component:gComponent
control:controlObj
- transferable:jtransferable
- triggerEvent:jtrigger
+ transferable:gTransferable
+ triggerEvent:gTriggerEvent
dragPosX:jdragposx
dragPosY:jdragposy
modifiers:jextmodifiers
clickCount:jclickcount
timeStamp:jtimestamp
- dragImage:jnsdragimage
+ dragImage:nsdragimageptr
dragImageOffsetX:jdragimageoffsetx
dragImageOffsetY:jdragimageoffsety
sourceActions:jsourceactions
- formats:jformats
- formatMap:jformatmap];
+ formats:gFormats
+ formatMap:gFormatMap];
}];
JNF_COCOA_EXIT(env);