Bug 311240 - XPCOMJavaProxy 'equals()' method doesn't check actual XPCOM object ptr. r=bsmedberg.
Original committer: pedemont%us.ibm.com Original revision: 1.39 Original date: 2006/01/05 19:56:51 git-svn-id: svn://10.0.0.236/trunk@212701 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -1519,9 +1519,17 @@ JAVAPROXY_NATIVE(callXPCOMMethod) (JNIEnv *env, jclass that, jobject aJavaProxy,
|
||||
}
|
||||
|
||||
// Call the XPCOM method
|
||||
nsresult invokeResult;
|
||||
invokeResult = XPTC_InvokeByIndex(inst->GetInstance(), methodIndex,
|
||||
paramCount, params);
|
||||
const nsIID* iid;
|
||||
iinfo->GetIIDShared(&iid);
|
||||
nsISupports* realObject;
|
||||
rv = inst->GetInstance()->QueryInterface(*iid, (void**) &realObject);
|
||||
if (NS_FAILED(rv)) {
|
||||
ThrowException(env, rv, "Failed to get real XPCOM object");
|
||||
return nsnull;
|
||||
}
|
||||
nsresult invokeResult = XPTC_InvokeByIndex(realObject, methodIndex,
|
||||
paramCount, params);
|
||||
NS_RELEASE(realObject);
|
||||
|
||||
// Clean up params
|
||||
jobject result = nsnull;
|
||||
@@ -1756,3 +1764,26 @@ JAVAPROXY_NATIVE(finalizeProxy) (JNIEnv *env, jclass that, jobject aJavaProxy)
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* org.mozilla.xpcom.XPCOMJavaProxy.isSameXPCOMObject
|
||||
*/
|
||||
extern "C" NS_EXPORT jboolean
|
||||
JAVAPROXY_NATIVE(isSameXPCOMObject) (JNIEnv *env, jclass that,
|
||||
jobject aProxy1, jobject aProxy2)
|
||||
{
|
||||
void* xpcom_obj1;
|
||||
nsresult rv = GetXPCOMInstFromProxy(env, aProxy1, &xpcom_obj1);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
void* xpcom_obj2;
|
||||
rv = GetXPCOMInstFromProxy(env, aProxy2, &xpcom_obj2);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
JavaXPCOMInstance* inst1 = NS_STATIC_CAST(JavaXPCOMInstance*, xpcom_obj1);
|
||||
JavaXPCOMInstance* inst2 = NS_STATIC_CAST(JavaXPCOMInstance*, xpcom_obj2);
|
||||
if (inst1->GetInstance() == inst2->GetInstance()) {
|
||||
return JNI_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -721,24 +721,27 @@ GetNewOrUsedJavaObject(JNIEnv* env, nsISupports* aXPCOMObject,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Get the root nsISupports of the xpcom object
|
||||
nsCOMPtr<nsISupports> rootObject = do_QueryInterface(aXPCOMObject, &rv);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// Get associated Java object from hash table
|
||||
rv = gNativeToJavaProxyMap->Find(env, aXPCOMObject, aIID, aResult);
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
rv = gNativeToJavaProxyMap->Find(env, rootObject, aIID, aResult);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (*aResult)
|
||||
return NS_OK;
|
||||
|
||||
// No Java object is associated with the given XPCOM object, so we
|
||||
// create a Java proxy.
|
||||
return CreateJavaProxy(env, aXPCOMObject, aIID, aResult);
|
||||
return CreateJavaProxy(env, rootObject, aIID, aResult);
|
||||
}
|
||||
|
||||
nsresult
|
||||
GetNewOrUsedXPCOMObject(JNIEnv* env, jobject aJavaObject, const nsIID& aIID,
|
||||
nsISupports** aResult, PRBool* aIsXPTCStub)
|
||||
{
|
||||
NS_PRECONDITION(aResult != nsnull && aIsXPTCStub != nsnull, "null ptr");
|
||||
if (!aResult || !aIsXPTCStub)
|
||||
NS_PRECONDITION(aResult != nsnull, "null ptr");
|
||||
if (!aResult)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
nsresult rv;
|
||||
@@ -757,23 +760,28 @@ GetNewOrUsedXPCOMObject(JNIEnv* env, jobject aJavaObject, const nsIID& aIID,
|
||||
if (isProxy) {
|
||||
void* inst;
|
||||
rv = GetXPCOMInstFromProxy(env, aJavaObject, &inst);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
*aResult = NS_STATIC_CAST(JavaXPCOMInstance*, inst)->GetInstance();
|
||||
NS_ADDREF(*aResult);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsISupports* rootObject =
|
||||
NS_STATIC_CAST(JavaXPCOMInstance*, inst)->GetInstance();
|
||||
rv = rootObject->QueryInterface(aIID, (void**) aResult);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
if (aIsXPTCStub) {
|
||||
*aIsXPTCStub = PR_FALSE;
|
||||
return NS_OK;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
*aIsXPTCStub = PR_TRUE;
|
||||
if (aIsXPTCStub) {
|
||||
*aIsXPTCStub = PR_TRUE;
|
||||
}
|
||||
|
||||
nsJavaXPTCStub* stub;
|
||||
rv = gJavaToXPTCStubMap->Find(env, aJavaObject, aIID, &stub);
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (stub) {
|
||||
// stub is already AddRef'd
|
||||
// stub is already AddRef'd and QI'd
|
||||
*aResult = NS_STATIC_CAST(nsISupports*,
|
||||
NS_STATIC_CAST(nsXPTCStubBase*, stub));
|
||||
return NS_OK;
|
||||
@@ -791,8 +799,7 @@ GetNewOrUsedXPCOMObject(JNIEnv* env, jobject aJavaObject, const nsIID& aIID,
|
||||
|
||||
nsCOMPtr<nsIInterfaceInfo> iinfo;
|
||||
rv = iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo));
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// Create XPCOM stub
|
||||
stub = new nsJavaXPTCStub(aJavaObject, iinfo);
|
||||
|
||||
Reference in New Issue
Block a user