From 24fd6f27ac88e7d1cba0fa9d22650617bd958c27 Mon Sep 17 00:00:00 2001 From: Grant Gayed Date: Thu, 29 Mar 2012 11:01:11 -0400 Subject: Bug 373253 - BrowserFunction not working with XULRunner 10 --- .../common/org/eclipse/swt/browser/External.java | 1081 ++++++++------------ .../common/org/eclipse/swt/browser/Mozilla.java | 44 +- 2 files changed, 483 insertions(+), 642 deletions(-) (limited to 'bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser') diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/External.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/External.java index 1a85443bc0..54e3385f50 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/External.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/External.java @@ -11,8 +11,6 @@ package org.eclipse.swt.browser; -import java.io.UnsupportedEncodingException; - import org.eclipse.swt.*; import org.eclipse.swt.internal.*; import org.eclipse.swt.internal.mozilla.*; @@ -29,13 +27,11 @@ class External { XPCOMObject classInfo; XPCOMObject securityCheckedComponent; XPCOMObject scriptObjectOwner; - XPCOMObject xpcScriptable; int refCount = 0; static Callback CallJavaProc; - static { - CallJavaProc = new Callback (External.class, "CallJava", 3); //$NON-NLS-1$ + CallJavaProc = new Callback (External.class, "callJava", 3); //$NON-NLS-1$ if (CallJavaProc.getAddress () == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); } @@ -43,12 +39,18 @@ External () { createCOMInterfaces (); } -int AddRef () { - refCount++; - return refCount; -} +/* external */ + +/* + * This is the BrowserFunction entry point for XULRunner releases >= 4 because + * QueryInterface answers an nsIScriptObjectOwner implementation (which points + * at this function) iff the detected XULRunner version is >= 4. + */ +static int /*long*/ callJava (int /*long*/ cx, int /*long*/ argc, int /*long*/ vp) { + int jsval_sizeof = 8; + int /*long*/ argsPtr = vp + 2 * jsval_sizeof; + nsIVariant resultVariant = null; -static int /*long*/ CallJava (int /*long*/ cx, int /*long*/ argc, int /*long*/ vp) { int /*long*/[] result = new int /*long*/[1]; int rc = XPCOM.NS_GetServiceManager (result); if (rc != XPCOM.NS_OK) Mozilla.error (rc); @@ -56,182 +58,146 @@ static int /*long*/ CallJava (int /*long*/ cx, int /*long*/ argc, int /*long*/ v nsIServiceManager serviceManager = new nsIServiceManager (result[0]); result[0] = 0; - //byte[] aContractID = MozillaDelegate.wcsToMbcs (null, "@mozilla.org/js/xpc/XPConnect;1", true); - nsID NS_IXPCONNECT_CID = new nsID ("CB6593E0-F9B2-11d2-BDD6-000064657374"); - nsID NS_IXPCONNECT_IID = new nsID ("a995b541-d514-43f1-ac0e-f49746c0b063"); - rc = serviceManager.GetService(NS_IXPCONNECT_CID, NS_IXPCONNECT_IID, result); - nsIXPConnect connect = new nsIXPConnect(result[0]); - result[0] = 0; - - - //int /*long*/[] result = new int /*long*/[1]; - XPCOM.memmove(result, vp + 2 * C.PTR_SIZEOF, C.PTR_SIZEOF); - int /*long*/ arrayPtr = result[0]; - result[0] = 0; - - XPCOM.memmove(result, arrayPtr, C.PTR_SIZEOF); - int /*long*/ args = result[0]; - result[0] = 0; + rc = serviceManager.GetService (XPCOM.NS_IXPCONNECT_CID, nsIXPConnect.NS_IXPCONNECT_IID, result); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); - int /*long*/ asdf4 = XPCOM.JSVAL_TO_IMPL2(Mozilla.jsLibPathBytes, arrayPtr); - System.out.println(asdf4); - asdf4 = XPCOM.JSVAL_TO_IMPL2(Mozilla.jsLibPathBytes, args); - System.out.println(asdf4); + nsIXPConnect connect = new nsIXPConnect (result[0]); + result[0] = 0; - int /*long*/ type2 = XPCOM.JS_TypeOfValue(Mozilla.jsLibPathBytes, cx, args); - System.out.println(type2); - int /*long*/ stringPtr = XPCOM.JS_ValueToString(Mozilla.jsLibPathBytes, cx, args); - int length = (int)XPCOM.JS_GetStringLength(Mozilla.jsLibPathBytes, stringPtr); - int /*long*/ nativePtr = XPCOM.JS_GetStringCharsZ(Mozilla.jsLibPathBytes, cx, stringPtr); - char[] dest = new char[length]; - XPCOM.memmove (dest, nativePtr, length * 2); - System.out.println(new String (dest)); - - - args += C.PTR_SIZEOF; - type2 = XPCOM.JS_TypeOfValue(Mozilla.jsLibPathBytes, cx, args); - System.out.println(type2); - stringPtr = XPCOM.JS_ValueToString(Mozilla.jsLibPathBytes, cx, args); - length = (int)XPCOM.JS_GetStringLength(Mozilla.jsLibPathBytes, stringPtr); - nativePtr = XPCOM.JS_GetStringCharsZ(Mozilla.jsLibPathBytes, cx, stringPtr); - dest = new char[length]; - XPCOM.memmove (dest, nativePtr, length * 2); - System.out.println(new String (dest)); - - args += C.PTR_SIZEOF; - type2 = XPCOM.JS_TypeOfValue(Mozilla.jsLibPathBytes, cx, args); - System.out.println(type2); - stringPtr = XPCOM.JS_ValueToString(Mozilla.jsLibPathBytes, cx, args); - length = (int)XPCOM.JS_GetStringLength(Mozilla.jsLibPathBytes, stringPtr); - nativePtr = XPCOM.JS_GetStringCharsZ(Mozilla.jsLibPathBytes, cx, stringPtr); - dest = new char[length]; - XPCOM.memmove (dest, nativePtr, length * 2); - System.out.println(new String (dest)); - - rc = connect.JSValToVariant(cx, args, result); - nsIVariant variant = new nsIVariant(result[0]); - short[] type = new short[1]; - rc = variant.GetDataType(type); - Object asdf = convertToJava(variant, type[0]); - System.out.println(asdf); - - Object functionId = convertToJava(args); - args += C.PTR_SIZEOF; - Object token = convertToJava(args); - - for (int i = 0; i < argc; i++) { - - } + /* extract the first argument value (the function id) */ + rc = connect.JSValToVariant (cx, argsPtr, result); + if (rc == XPCOM.NS_OK && result[0] != 0) { + nsIVariant idVariant = new nsIVariant (result[0]); + result[0] = 0; + short[] dataType = new short[1]; + rc = idVariant.GetDataType (dataType); + if (rc == XPCOM.NS_OK && dataType[0] == nsIDataType.VTYPE_INT32) { + int[] intResult = new int[1]; + rc = idVariant.GetAsInt32 (intResult); /* PRInt32 */ + if (rc == XPCOM.NS_OK) { + int functionId = (int)intResult[0]; + + /* get the second argument variant (the token string) */ + argsPtr += jsval_sizeof; + rc = connect.JSValToVariant (cx, argsPtr, result); + if (rc == XPCOM.NS_OK && result[0] != 0) { + int /*long*/ tokenVariant = result[0]; + result[0] = 0; - return 0; -} + /* get the third argument variant (the invocation args) */ + argsPtr += jsval_sizeof; + rc = connect.JSValToVariant (cx, argsPtr, result); + if (rc == XPCOM.NS_OK && result[0] != 0) { + int /*long*/ argsVariant = result[0]; + result[0] = 0; -static Object convertToJava(int /*long*/ jsVal) { - /* -typedef uint8 JSValueType; -#define JSVAL_TYPE_DOUBLE ((uint8)0x00) -#define JSVAL_TYPE_INT32 ((uint8)0x01) -#define JSVAL_TYPE_UNDEFINED ((uint8)0x02) -#define JSVAL_TYPE_BOOLEAN ((uint8)0x03) -#define JSVAL_TYPE_MAGIC ((uint8)0x04) -#define JSVAL_TYPE_STRING ((uint8)0x05) -#define JSVAL_TYPE_NULL ((uint8)0x06) -#define JSVAL_TYPE_OBJECT ((uint8)0x07) -#define JSVAL_TYPE_UNKNOWN ((uint8)0x20) -#define JSVAL_TYPE_NONFUNOBJ ((uint8)0x57) -#define JSVAL_TYPE_FUNOBJ ((uint8)0x67) -#define JSVAL_TYPE_STRORNULL ((uint8)0x77) -#define JSVAL_TYPE_OBJORNULL ((uint8)0x78) -#define JSVAL_TYPE_BOXED ((uint8)0x79) -#define JSVAL_TYPE_UNINITIALIZED ((uint8)0x7d) - -jsval_layout PRIVATE_PTR_TO_JSVAL_IMPL(void *ptr) - - */ - return null; - -} + /* invoke the BrowserFunction */ + resultVariant = new nsIVariant (invokeFunction (functionId, tokenVariant, argsVariant)); + new nsISupports (argsVariant).Release (); + } + new nsISupports (tokenVariant).Release (); + } + } + } + idVariant.Release (); + } + result[0] = 0; -void createCOMInterfaces () { - /* Create each of the interfaces that this object implements */ - supports = new XPCOMObject (new int[] {2, 0, 0}) { - public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} - public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} - public int /*long*/ method2 (int /*long*/[] args) {return Release ();} - }; + /* if the BrowserFunction could not be invoked for some reason then return null to JS */ + if (resultVariant == null) { + rc = XPCOM.NS_GetComponentManager (result); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); + nsIComponentManager componentManager = new nsIComponentManager (result[0]); + result[0] = 0; + resultVariant = convertToJS (null, componentManager); + componentManager.Release (); + } - classInfo = new XPCOMObject (new int[] {2, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1}) { - public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} - public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} - public int /*long*/ method2 (int /*long*/[] args) {return Release ();} - public int /*long*/ method3 (int /*long*/[] args) {return getInterfaces (args[0], args[1]);} - public int /*long*/ method4 (int /*long*/[] args) {return getHelperForLanguage ((int)/*64*/args[0], args[1]);} - public int /*long*/ method5 (int /*long*/[] args) {return getContractID (args[0]);} - public int /*long*/ method6 (int /*long*/[] args) {return getClassDescription (args[0]);} - public int /*long*/ method7 (int /*long*/[] args) {return getClassID (args[0]);} - public int /*long*/ method8 (int /*long*/[] args) {return getImplementationLanguage (args[0]);} - public int /*long*/ method9 (int /*long*/[] args) {return getFlags (args[0]);} - public int /*long*/ method10 (int /*long*/[] args) {return getClassIDNoAlloc (args[0]);} - }; + /* convert the resulting variant to a jsval */ + byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true); + rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); + serviceManager.Release(); - securityCheckedComponent = new XPCOMObject (new int[] {2, 0, 0, 2, 3, 3, 3}) { - public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} - public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} - public int /*long*/ method2 (int /*long*/[] args) {return Release ();} - public int /*long*/ method3 (int /*long*/[] args) {return canCreateWrapper (args[0], args[1]);} - public int /*long*/ method4 (int /*long*/[] args) {return canCallMethod (args[0], args[1], args[2]);} - public int /*long*/ method5 (int /*long*/[] args) {return canGetProperty (args[0], args[1], args[2]);} - public int /*long*/ method6 (int /*long*/[] args) {return canSetProperty (args[0], args[1], args[2]);} - }; + nsIMemory memory = new nsIMemory (result[0]); + result[0] = 0; + int /*long*/ jsVal = memory.Alloc (jsval_sizeof); + C.memset (jsVal, 0, jsval_sizeof); + int /*long*/ globalObject = XPCOM.JS_GetGlobalObject (Mozilla.getJSLibPathBytes (), cx); + rc = connect.VariantToJS (cx, globalObject, resultVariant.getAddress (), jsVal); + resultVariant.Release (); + connect.Release (); + + int /*long*/ returnValue = XPCOM.JS_FALSE; + if (rc == XPCOM.NS_OK) { + /* write the jsval to the return value slot */ + C.memmove (vp, jsVal, jsval_sizeof); + returnValue = XPCOM.JS_TRUE; + } + memory.Free (jsVal); + memory.Release (); + return returnValue; +} - external = new XPCOMObject (new int[] {2, 0, 0, 4}) { - public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} - public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} - public int /*long*/ method2 (int /*long*/[] args) {return Release ();} - public int /*long*/ method3 (int /*long*/[] args) {return callJava ((int)/*64*/args[0], args[1], args[2], args[3]);} - }; +/* this is the BrowserFunction entry point when the detected XULRunner version is < 4 */ +static int callJava (int functionId, int /*long*/ tokenVariant, int /*long*/ argsVariant, int /*long*/ returnPtr) { + int /*long*/ resultVariant = invokeFunction (functionId, tokenVariant, argsVariant); + C.memmove (returnPtr, new int /*long*/[] {resultVariant}, C.PTR_SIZEOF); + return XPCOM.NS_OK; +} - scriptObjectOwner = new XPCOMObject (new int[] {2, 0, 0, 2, 1}) { - public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} - public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} - public int /*long*/ method2 (int /*long*/[] args) {return Release ();} - public int /*long*/ method3 (int /*long*/[] args) { - // int /*long*/ globalObject = XPCOM.nsIScriptContext_GetGlobalObject(args[0]); - int /*long*/ nativeContext = XPCOM.nsIScriptContext_GetNativeContext (args[0]); - if (Mozilla.jsLibPathBytes == null) { - String mozillaPath = Mozilla.getMozillaPath () + MozillaDelegate.getJSLibraryName() + '\0'; - try { - Mozilla.jsLibPathBytes = mozillaPath.getBytes ("UTF-8"); //$NON-NLS-1$ - } catch (UnsupportedEncodingException e) { - Mozilla.jsLibPathBytes = mozillaPath.getBytes (); - } - } - int /*long*/ globalJSObject = XPCOM.JS_GetGlobalObject (Mozilla.jsLibPathBytes, nativeContext); - int /*long*/ globalJSObject1 = XPCOM.JS_GetGlobalObject (Mozilla.jsLibPathBytes, args[0]); - int /*long*/ globalJSObject2 = XPCOM.JS_GetGlobalForScopeChain (Mozilla.jsLibPathBytes, nativeContext); -// int /*long*/ globalJSObject3 = XPCOM.JS_GetGlobalForScopeChain (Mozilla.jsLibPathBytes, args[0]); - int /*long*/ newObject = XPCOM.JS_NewObject(Mozilla.jsLibPathBytes, nativeContext, 0, 0, globalJSObject); - - byte[] functionName = MozillaDelegate.wcsToMbcs(null, "callJava", true); - int /*long*/ newFunction = XPCOM.JS_DefineFunction(Mozilla.jsLibPathBytes, nativeContext, newObject, functionName, CallJavaProc.getAddress(), 3, /*JSPROP_ENUMERATE*/ 0x1 | /*JSPROP_READONLY*/ 0x2 | /*JSPROP_PERMANENT*/ 0x4); - System.out.println(newFunction); - - XPCOM.memmove(args[1], new int /*long*/[] {newObject}, C.PTR_SIZEOF); - return XPCOM.NS_OK; - } - public int /*long*/ method4 (int /*long*/[] args) { - return XPCOM.NS_OK; - // return SetScriptObject (args[0]);} - } - }; +static Object convertToJava (nsIVariant variant, short type) { + switch (type) { + case nsIDataType.VTYPE_EMPTY: + case nsIDataType.VTYPE_VOID: + return null; + case nsIDataType.VTYPE_EMPTY_ARRAY: + return new Object[0]; + case nsIDataType.VTYPE_BOOL: + int[] boolResult = new int[1]; /*PRInt32*/ + int rc = variant.GetAsBool (boolResult); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + return new Boolean (boolResult[0] != 0); + case nsIDataType.VTYPE_INT32: + int[] intResult = new int[1]; /*PRInt32*/ + rc = variant.GetAsInt32 (intResult); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + return new Double (intResult[0]); + case nsIDataType.VTYPE_DOUBLE: + int /*long*/ doubleReturn = C.malloc (8); + rc = variant.GetAsDouble (doubleReturn); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + double[] doubleResult = new double[1]; + C.memmove (doubleResult, doubleReturn, 8); + C.free (doubleReturn); + return new Double (doubleResult[0]); + case nsIDataType.VTYPE_WSTRING_SIZE_IS: + int[] size = new int[1]; /* PRInt32 */ + int /*long*/[] wString = new int /*long*/[1]; + rc = variant.GetAsWStringWithSize (size, wString); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + char[] chars = new char[size[0]]; + C.memmove (chars, wString[0], size[0] * 2); + return new String (chars); + case nsIDataType.VTYPE_ARRAY: + Object[] arrayReturn = new Object[0]; + int /*long*/ iid = C.malloc (nsID.sizeof); + C.memset (iid, 0, nsID.sizeof); + int[] count = new int[1]; /* PRUint32 */ + short[] currentType = new short[1]; + int /*long*/[] ptr = new int /*long*/[1]; + rc = variant.GetAsArray (currentType, iid, count, ptr); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + if (ptr[0] == 0) Mozilla.error (XPCOM.NS_ERROR_NULL_POINTER); + nsID id = new nsID (); + XPCOM.memmove (id, iid, nsID.sizeof); + C.free (iid); - xpcScriptable = new XPCOMObject (new int[] {2, 0, 0, 1, 1, 4, 3, 3, 6, 6, 6, 6, 4, 7, 7, 6, 3, 7, 7, 7, 6, 3, 5, 4, 2}) { - public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} - public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} - public int /*long*/ method2 (int /*long*/[] args) {return Release ();} - public int /*long*/ method3 (int /*long*/[] args) { int /*long*/[] result = new int /*long*/[1]; - int rc = XPCOM.NS_GetServiceManager (result); + rc = XPCOM.NS_GetServiceManager (result); if (rc != XPCOM.NS_OK) Mozilla.error (rc); if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); @@ -245,196 +211,320 @@ void createCOMInterfaces () { nsIMemory memory = new nsIMemory (result[0]); result[0] = 0; - byte[] bytes = MozillaDelegate.wcsToMbcs (null, "External", true); //$NON-NLS-1$ - int /*long*/ ptr = memory.Alloc (bytes.length); - C.memmove (ptr, bytes, bytes.length); - C.memmove(args[0], new int /*long*/[] {ptr}, C.PTR_SIZEOF); - return XPCOM.NS_OK;} - public int /*long*/ method4 (int /*long*/[] args) { - System.out.println("Get scriptable flags"); - XPCOM.memmove(args[0], new int[] {/*WANT_NEWRESOLVE 512 |*/ /* WANT_GETPROPERTY */ 32 | /* WANT_CALL */ 8192}, 4); - // XPCOM.memmove(args[0], new int[] {0xFFFF}, 4); - return XPCOM.NS_OK;} - public int /*long*/ method5 (int /*long*/[] args) { - System.out.println("pre-create"); - return XPCOM.NS_OK;} - public int /*long*/ method6 (int /*long*/[] args) { - System.out.println("create"); - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method7 (int /*long*/[] args) { - System.out.println("post-create"); - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method8 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method9 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method10 (int /*long*/[] args) { - System.out.println("Get property"); -// int /*long*/ nativeContext = XPCOM.nsIScriptContext_GetNativeContext (args[0]); - if (Mozilla.jsLibPathBytes == null) { - String mozillaPath = Mozilla.getMozillaPath () + MozillaDelegate.getJSLibraryName() + '\0'; - try { - Mozilla.jsLibPathBytes = mozillaPath.getBytes ("UTF-8"); //$NON-NLS-1$ - } catch (UnsupportedEncodingException e) { - Mozilla.jsLibPathBytes = mozillaPath.getBytes (); + + if (id.Equals (nsIVariant.NS_IVARIANT_IID) || id.Equals (nsIVariant.NS_IVARIANT_10_IID)) { + arrayReturn = new Object[count[0]]; + for (int i = 0; i < count[0]; i++) { + int /*long*/[] arrayPtr = new int /*long*/[1]; + C.memmove (arrayPtr, ptr[0] + i * C.PTR_SIZEOF, C.PTR_SIZEOF); + nsISupports supports = new nsISupports (arrayPtr[0]); + rc = supports.QueryInterface (id, result); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); + + nsIVariant currentVariant = new nsIVariant (result[0]); + result[0] = 0; + currentType[0] = 0; + rc = currentVariant.GetDataType (currentType); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + try { + arrayReturn[i] = convertToJava (currentVariant, currentType[0]); + currentVariant.Release (); + } catch (IllegalArgumentException e) { + /* invalid argument value type */ + currentVariant.Release (); + memory.Free (ptr[0]); + memory.Release (); + throw e; + } } - } -// int /*long*/ globalJSObject = XPCOM.JS_GetGlobalObject (Mozilla.jsLibPathBytes, nativeContext); -// int /*long*/ newObject = XPCOM.JS_NewObject(Mozilla.jsLibPathBytes, nativeContext, 0, 0, globalJSObject); - - int /*long*/ stringPtr = XPCOM.JS_ValueToString(Mozilla.jsLibPathBytes, args[1], args[3]); - int /*long*/ stringLength = XPCOM.JS_GetStringLength(Mozilla.jsLibPathBytes, stringPtr); - int /*long*/ nativePtr = XPCOM.JS_GetStringCharsZ(Mozilla.jsLibPathBytes, args[1], stringPtr); - - int length = XPCOM.strlen_PRUnichar (nativePtr); - char[] dest = new char[length]; - XPCOM.memmove (dest, nativePtr, length * 2); - System.out.println(new String (dest)); - - - - byte[] functionName = MozillaDelegate.wcsToMbcs(null, "callJava", true); - int /*long*/ newFunction = XPCOM.JS_DefineFunction(Mozilla.jsLibPathBytes, /*nativeContext*/args[1], /*newObject*/args[2], functionName, CallJavaProc.getAddress(), 3, /*JSPROP_ENUMERATE*/ 0x1 | /*JSPROP_READONLY*/ 0x2 | /*JSPROP_PERMANENT*/ 0x4); - System.out.println(newFunction); - - return /* PR_TRUE */ 1;} - - public int /*long*/ method11 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method12 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method13 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method14 (int /*long*/[] args) { - System.out.println("New Resolve"); - - int /*long*/ nativeContext = XPCOM.nsIScriptContext_GetNativeContext (args[0]); - if (Mozilla.jsLibPathBytes == null) { - String mozillaPath = Mozilla.getMozillaPath () + MozillaDelegate.getJSLibraryName() + '\0'; - try { - Mozilla.jsLibPathBytes = mozillaPath.getBytes ("UTF-8"); //$NON-NLS-1$ - } catch (UnsupportedEncodingException e) { - Mozilla.jsLibPathBytes = mozillaPath.getBytes (); + } else { + switch (currentType[0]) { + case nsIDataType.VTYPE_DOUBLE: + arrayReturn = new Object[count[0]]; + for (int i = 0; i < count[0]; i++) { + double[] doubleValue = new double[1]; + C.memmove (doubleValue, ptr[0] + i * 8, 8); + arrayReturn[i] = new Double (doubleValue[0]); + } + break; + case nsIDataType.VTYPE_BOOL: + arrayReturn = new Object[count[0]]; + for (int i = 0; i < count[0]; i++) { + int[] boolValue = new int[1]; /* PRUInt32 */ + C.memmove (boolValue, ptr[0] + i * 4, 4); + arrayReturn[i] = new Boolean (boolValue[0] != 0); + } + break; + case nsIDataType.VTYPE_INT32: + arrayReturn = new Object[count[0]]; + for (int i = 0; i < count[0]; i++) { + int[] intValue = new int[1]; /* PRInt32 */ + C.memmove (intValue, ptr[0] + i * 4, 4); + arrayReturn[i] = new Double (intValue[0]); + } + break; + case nsIDataType.VTYPE_WCHAR_STR: + arrayReturn = new Object[count[0]]; + for (int i = 0; i < count[0]; i++) { + int /*long*/ currentPtr = ptr[0] + i * C.PTR_SIZEOF; + int /*long*/[] stringPtr = new int /*long*/[1]; + C.memmove (stringPtr, currentPtr, C.PTR_SIZEOF); + int length = XPCOM.strlen_PRUnichar (stringPtr[0]); + char[] dest = new char[length]; + XPCOM.memmove (dest, stringPtr[0], length * 2); + arrayReturn[i] = new String (dest); + } + break; + default: + memory.Free (ptr[0]); + memory.Release (); + SWT.error (SWT.ERROR_INVALID_ARGUMENT); } } - - int /*long*/ stringPtr = XPCOM.JS_ValueToString(Mozilla.jsLibPathBytes, /*args[1]*/nativeContext, args[3]); - int /*long*/ stringLength = XPCOM.JS_GetStringLength(Mozilla.jsLibPathBytes, stringPtr); - int /*long*/ nativePtr = XPCOM.JS_GetStringCharsZ(Mozilla.jsLibPathBytes, /*args[1]*/nativeContext, stringPtr); - - int length = XPCOM.strlen_PRUnichar (nativePtr); - char[] dest = new char[length]; - XPCOM.memmove (dest, nativePtr, length /** 2*/); - System.out.println(new String (dest)); - -// int /*long*/ globalJSObject = XPCOM.JS_GetGlobalObject (Mozilla.jsLibPathBytes, nativeContext); -// int /*long*/ newObject = XPCOM.JS_NewObject(Mozilla.jsLibPathBytes, nativeContext, 0, 0, globalJSObject); - - byte[] functionName = MozillaDelegate.wcsToMbcs(null, "callJava", true); - int /*long*/ newFunction = XPCOM.JS_DefineFunction(Mozilla.jsLibPathBytes, /*nativeContext*/args[1], /*newObject*/args[2], functionName, CallJavaProc.getAddress(), 3, /*JSPROP_ENUMERATE*/ 0x1 | /*JSPROP_READONLY*/ 0x2 | /*JSPROP_PERMANENT*/ 0x4); - System.out.println(newFunction); - - XPCOM.memmove(args[5], new int /*long*/[] {args[2]}, C.PTR_SIZEOF); - return /* PR_TRUE */ 1;} - public int /*long*/ method15 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method16 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method17 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method18 (int /*long*/[] args) { - System.out.println("Call"); - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method19 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method20 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method21 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method22 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method23 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - public int /*long*/ method24 (int /*long*/[] args) { - return XPCOM.NS_ERROR_NOT_IMPLEMENTED;} - }; - -} - -void disposeCOMInterfaces () { - if (supports != null) { - supports.dispose (); - supports = null; - } - if (external != null) { - external.dispose (); - external = null; + memory.Free (ptr[0]); + memory.Release (); + return arrayReturn; } + SWT.error (SWT.ERROR_INVALID_ARGUMENT); + return null; } -int /*long*/ getAddress () { - return external.getAddress (); -} - -int QueryInterface (int /*long*/ riid, int /*long*/ ppvObject) { - if (riid == 0 || ppvObject == 0) return XPCOM.NS_ERROR_NO_INTERFACE; - nsID guid = new nsID (); - XPCOM.memmove (guid, riid, nsID.sizeof); +static nsIVariant convertToJS (Object value, nsIComponentManager componentManager) { + int /*long*/[] result = new int /*long*/[1]; + byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_VARIANT_CONTRACTID, true); + int rc = componentManager.CreateInstanceByContractID (aContractID, 0, nsIWritableVariant.NS_IWRITABLEVARIANT_IID, result); + nsIWritableVariant variant = new nsIWritableVariant (result[0]); + result[0] = 0; - if (guid.Equals (nsISupports.NS_ISUPPORTS_IID)) { - System.out.println("QI'd for nsISupports"); - XPCOM.memmove (ppvObject, new int /*long*/[] {supports.getAddress ()}, C.PTR_SIZEOF); - AddRef(); - return XPCOM.NS_OK; - } - if (guid.Equals (nsIClassInfo.NS_ICLASSINFO_IID)) { - System.out.println("QI'd for nsIClassInfo"); - XPCOM.memmove (ppvObject, new int /*long*/[] {classInfo.getAddress ()}, C.PTR_SIZEOF); - AddRef(); - return XPCOM.NS_OK; + if (value == null) { + rc = variant.SetAsEmpty (); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + return variant; } - if (guid.Equals (nsISecurityCheckedComponent.NS_ISECURITYCHECKEDCOMPONENT_IID)) { - System.out.println("QI'd for nsISecurityCheckedComponent"); - XPCOM.memmove (ppvObject, new int /*long*/[] {securityCheckedComponent.getAddress ()}, C.PTR_SIZEOF); + if (value instanceof String) { + String stringValue = (String)value; + int length = stringValue.length (); + char[] chars = new char[length]; + stringValue.getChars (0, length, chars, 0); + rc = variant.SetAsWStringWithSize (length, chars); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + return variant; + } + if (value instanceof Boolean) { + Boolean booleanValue = (Boolean)value; + rc = variant.SetAsBool (booleanValue.booleanValue () ? 1 : 0); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + return variant; + } + if (value instanceof Number) { + Number numberValue = (Number)value; + rc = variant.SetAsDouble (numberValue.doubleValue ()); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + return variant; + } + if (value instanceof Object[]) { + Object[] arrayValue = (Object[])value; + int length = arrayValue.length; + if (length == 0) { + rc = variant.SetAsEmptyArray (); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + } else { + int /*long*/ arrayPtr = C.malloc (C.PTR_SIZEOF * length); + for (int i = 0; i < length; i++) { + Object currentObject = arrayValue[i]; + try { + nsIVariant currentVariant = convertToJS (currentObject, componentManager); + C.memmove (arrayPtr + C.PTR_SIZEOF * i, new int /*long*/[] {currentVariant.getAddress ()}, C.PTR_SIZEOF); + } catch (SWTException e) { + /* invalid return value type */ + C.free (arrayPtr); + variant.Release (); + /* release the variants that had previously been added to the array */ + for (int j = 0; j < i; j++) { + int /*long*/[] ptr = new int /*long*/[1]; + C.memmove (ptr, arrayPtr + C.PTR_SIZEOF * j, C.PTR_SIZEOF); + new nsISupports (ptr[0]).Release (); + } + throw e; + } + } + int /*long*/ idPtr = C.malloc (nsID.sizeof); + XPCOM.memmove (idPtr, Mozilla.IsPre_4 ? nsIVariant.NS_IVARIANT_IID : nsIVariant.NS_IVARIANT_10_IID, nsID.sizeof); + rc = variant.SetAsArray (nsIDataType.VTYPE_INTERFACE_IS, idPtr, length, arrayPtr); + C.free (idPtr); + C.free (arrayPtr); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + } + return variant; + } + + variant.Release (); + SWT.error (SWT.ERROR_INVALID_RETURN_VALUE); + return null; +} + +static int /*long*/ invokeFunction (int functionId, int /*long*/ tokenVariant, int /*long*/ args) { + Object key = new Integer (functionId); + BrowserFunction function = (BrowserFunction)Mozilla.AllFunctions.get (key); + Object returnValue = null; + + if (function != null) { + try { + short[] type = new short[1]; /* PRUint16 */ + nsIVariant variant = new nsIVariant (tokenVariant); + int rc = variant.GetDataType (type); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + Object temp = convertToJava (variant, type[0]); + type[0] = 0; + if (temp instanceof String) { + String token = (String)temp; + if (token.equals (function.token)) { + variant = new nsIVariant (args); + rc = variant.GetDataType (type); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + temp = convertToJava (variant, type[0]); + if (temp instanceof Object[]) { + Object[] arguments = (Object[])temp; + try { + returnValue = function.function (arguments); + } catch (Exception e) { + /* exception during function invocation */ + returnValue = WebBrowser.CreateErrorString (e.getLocalizedMessage ()); + } + } + } + } + } catch (IllegalArgumentException e) { + /* invalid argument value type */ + if (function.isEvaluate) { + /* notify the evaluate function so that a java exception can be thrown */ + function.function (new String[] {WebBrowser.CreateErrorString (new SWTException (SWT.ERROR_INVALID_RETURN_VALUE).getLocalizedMessage ())}); + } + returnValue = WebBrowser.CreateErrorString (e.getLocalizedMessage ()); + } + } + + int /*long*/[] result = new int /*long*/[1]; + int rc = XPCOM.NS_GetComponentManager (result); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); + nsIComponentManager componentManager = new nsIComponentManager (result[0]); + result[0] = 0; + nsIVariant variant; + try { + variant = convertToJS (returnValue, componentManager); + } catch (SWTException e) { + /* invalid return value type */ + variant = convertToJS (WebBrowser.CreateErrorString (e.getLocalizedMessage ()), componentManager); + } + componentManager.Release (); + + return variant.getAddress (); +} + +int AddRef () { + refCount++; + return refCount; +} + +void createCOMInterfaces () { + /* Create each of the interfaces that this object implements */ + supports = new XPCOMObject (new int[] {2, 0, 0}) { + public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} + public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} + public int /*long*/ method2 (int /*long*/[] args) {return Release ();} + }; + + classInfo = new XPCOMObject (new int[] {2, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1}) { + public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} + public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} + public int /*long*/ method2 (int /*long*/[] args) {return Release ();} + public int /*long*/ method3 (int /*long*/[] args) {return getInterfaces (args[0], args[1]);} + public int /*long*/ method4 (int /*long*/[] args) {return getHelperForLanguage ((int)/*64*/args[0], args[1]);} + public int /*long*/ method5 (int /*long*/[] args) {return getContractID (args[0]);} + public int /*long*/ method6 (int /*long*/[] args) {return getClassDescription (args[0]);} + public int /*long*/ method7 (int /*long*/[] args) {return getClassID (args[0]);} + public int /*long*/ method8 (int /*long*/[] args) {return getImplementationLanguage (args[0]);} + public int /*long*/ method9 (int /*long*/[] args) {return getFlags (args[0]);} + public int /*long*/ method10 (int /*long*/[] args) {return getClassIDNoAlloc (args[0]);} + }; + + securityCheckedComponent = new XPCOMObject (new int[] {2, 0, 0, 2, 3, 3, 3}) { + public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} + public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} + public int /*long*/ method2 (int /*long*/[] args) {return Release ();} + public int /*long*/ method3 (int /*long*/[] args) {return canCreateWrapper (args[0], args[1]);} + public int /*long*/ method4 (int /*long*/[] args) {return canCallMethod (args[0], args[1], args[2]);} + public int /*long*/ method5 (int /*long*/[] args) {return canGetProperty (args[0], args[1], args[2]);} + public int /*long*/ method6 (int /*long*/[] args) {return canSetProperty (args[0], args[1], args[2]);} + }; + + external = new XPCOMObject (new int[] {2, 0, 0, 4}) { + public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} + public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} + public int /*long*/ method2 (int /*long*/[] args) {return Release ();} + public int /*long*/ method3 (int /*long*/[] args) {return callJava ((int)/*64*/args[0], args[1], args[2], args[3]);} + }; + + scriptObjectOwner = new XPCOMObject (new int[] {2, 0, 0, 2, 1}) { + public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);} + public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();} + public int /*long*/ method2 (int /*long*/[] args) {return Release ();} + public int /*long*/ method3 (int /*long*/[] args) {return getScriptObject (args[0], args[1]);} + public int /*long*/ method4 (int /*long*/[] args) {return setScriptObject (args[0]);} + }; +} + +void disposeCOMInterfaces () { + if (supports != null) { + supports.dispose (); + supports = null; + } + if (external != null) { + external.dispose (); + external = null; + } +} + +int /*long*/ getAddress () { + return external.getAddress (); +} + +int QueryInterface (int /*long*/ riid, int /*long*/ ppvObject) { + if (riid == 0 || ppvObject == 0) return XPCOM.NS_ERROR_NO_INTERFACE; + nsID guid = new nsID (); + XPCOM.memmove (guid, riid, nsID.sizeof); + + if (guid.Equals (nsISupports.NS_ISUPPORTS_IID)) { + XPCOM.memmove (ppvObject, new int /*long*/[] {supports.getAddress ()}, C.PTR_SIZEOF); + AddRef(); + return XPCOM.NS_OK; + } + if (guid.Equals (nsIClassInfo.NS_ICLASSINFO_IID)) { + XPCOM.memmove (ppvObject, new int /*long*/[] {classInfo.getAddress ()}, C.PTR_SIZEOF); + AddRef(); + return XPCOM.NS_OK; + } + if (guid.Equals (XPCOM.NS_ISECURITYCHECKEDCOMPONENT_IID)) { + XPCOM.memmove (ppvObject, new int /*long*/[] {securityCheckedComponent.getAddress ()}, C.PTR_SIZEOF); AddRef(); return XPCOM.NS_OK; } if (guid.Equals (EXTERNAL_IID)) { - System.out.println("QI'd for EXTERNAL_IID"); XPCOM.memmove (ppvObject, new int /*long*/[] {external.getAddress ()}, C.PTR_SIZEOF); AddRef(); return XPCOM.NS_OK; } if (!Mozilla.IsPre_4) { - nsID NS_ISCRIPT_OBJECT_OWNER_IID = new nsID("8f6bca7e-ce42-11d1-b724-00600891d8c9"); - if (guid.Equals(NS_ISCRIPT_OBJECT_OWNER_IID)) { - System.out.println("QI'd for NS_ISCRIPT_OBJECT_OWNER"); + if (guid.Equals(XPCOM.NS_ISCRIPTOBJECTOWNER_IID)) { XPCOM.memmove (ppvObject, new int /*long*/[] {scriptObjectOwner.getAddress ()}, C.PTR_SIZEOF); AddRef(); return XPCOM.NS_OK; } } - -// nsID NS_ASDF_IID = new nsID("3eedba38-8d22-41e1-817a-0e43e165b664"); -// if (guid.Equals (NS_ASDF_IID)) { -// System.out.println("QI'd for nsIScriptObjectPrincipal"); -// XPCOM.memmove (ppvObject, new int /*long*/[] {external.getAddress ()}, C.PTR_SIZEOF); -// AddRef(); -// return XPCOM.NS_OK; -// } - -// if (!Mozilla.IsPre_4) { -// nsID nsIXPCScriptable_IID = new nsID("a40ce52e-2d8c-400f-9af2-f8784a656070"); -// if (guid.Equals (nsIXPCScriptable_IID)) { -// System.out.println("QI'd for nsIXPCScriptable_IID"); -// XPCOM.memmove (ppvObject, new int /*long*/[] {xpcScriptable.getAddress ()}, C.PTR_SIZEOF); -// AddRef(); -// return XPCOM.NS_OK; -// } -// } - - System.out.println("no answer for: " + guid.toString()); + XPCOM.memmove (ppvObject, new int /*long*/[] {0}, C.PTR_SIZEOF); return XPCOM.NS_ERROR_NO_INTERFACE; } @@ -485,7 +575,7 @@ int getContractID (int /*long*/ _retValue) { } int getFlags (int /*long*/ flags) { - C.memmove (flags, new int[] {nsIClassInfo.THREADSAFE/*MAIN_THREAD_ONLY*/}, 4); /* PRUint32 */ + C.memmove (flags, new int[] {nsIClassInfo.MAIN_THREAD_ONLY}, 4); /* PRUint32 */ return XPCOM.NS_OK; } @@ -495,14 +585,11 @@ int getHelperForLanguage (int language, int /*long*/ _retValue) { } int getImplementationLanguage (int /*long*/ _retValue) { - C.memmove (_retValue, new int[] {5}, 4); /* nsIProgrammingLanguage.JAVA */ /* PRUint */ // nsIProgrammingLanguage::CPLUSPLUS + C.memmove (_retValue, new int[] {5}, 4); /* nsIProgrammingLanguage.JAVA */ /* PRUint */ return XPCOM.NS_OK; } - int getInterfaces (int /*long*/ count, int /*long*/ array) { - //C.memset(6, 6, 6); - System.out.println("---------------------------"); int /*long*/[] result = new int /*long*/[1]; int rc = XPCOM.NS_GetServiceManager (result); if (rc != XPCOM.NS_OK) Mozilla.error (rc); @@ -519,7 +606,7 @@ int getInterfaces (int /*long*/ count, int /*long*/ array) { nsIMemory memory = new nsIMemory (result[0]); result[0] = 0; int /*long*/ securityCheckedComponentIID = memory.Alloc (nsID.sizeof); - XPCOM.memmove (securityCheckedComponentIID, nsISecurityCheckedComponent.NS_ISECURITYCHECKEDCOMPONENT_IID, nsID.sizeof); + XPCOM.memmove (securityCheckedComponentIID, XPCOM.NS_ISECURITYCHECKEDCOMPONENT_IID, nsID.sizeof); int /*long*/ externalIID = memory.Alloc (nsID.sizeof); XPCOM.memmove (externalIID, EXTERNAL_IID, nsID.sizeof); int /*long*/ ptrArray = memory.Alloc (3 * C.PTR_SIZEOF); @@ -530,8 +617,7 @@ int getInterfaces (int /*long*/ count, int /*long*/ array) { int /*long*/ asdfIID = memory.Alloc (nsID.sizeof); XPCOM.memmove (asdfIID, NS_ASDF_IID, nsID.sizeof); C.memmove (ptrArray + 2 * C.PTR_SIZEOF, new int /*long*/[] {asdfIID}, C.PTR_SIZEOF); - - + C.memmove (array, new int /*long*/[] {ptrArray}, C.PTR_SIZEOF); memory.Release (); @@ -539,6 +625,25 @@ int getInterfaces (int /*long*/ count, int /*long*/ array) { return XPCOM.NS_OK; } +/* nsIScriptObjectOwner */ + +int getScriptObject (int /*long*/ aContext, int /*long*/ aScriptObject) { + byte[] jsLibPath = Mozilla.getJSLibPathBytes (); + int /*long*/ nativeContext = XPCOM.nsIScriptContext_GetNativeContext (aContext); + int /*long*/ globalJSObject = XPCOM.JS_GetGlobalObject (jsLibPath, nativeContext); + int /*long*/ newObject = XPCOM.JS_NewObject (jsLibPath, nativeContext, 0, 0, globalJSObject); + + byte[] functionName = MozillaDelegate.wcsToMbcs (null, "callJava", true); //$NON-NLS-1$ + int flags = XPCOM.JSPROP_ENUMERATE | XPCOM.JSPROP_READONLY | XPCOM.JSPROP_PERMANENT; + XPCOM.JS_DefineFunction (jsLibPath, nativeContext, newObject, functionName, XPCOM.CALLBACK_JSNative (CallJavaProc.getAddress ()), 3, flags); + XPCOM.memmove (aScriptObject, new int /*long*/[] {newObject}, C.PTR_SIZEOF); + return XPCOM.NS_OK; +} + +int setScriptObject (int /*long*/ aScriptObject) { + return XPCOM.NS_COMFALSE; +} + /* nsISecurityCheckedComponent */ int canCreateWrapper (int /*long*/ iid, int /*long*/ _retVal) { @@ -650,280 +755,4 @@ int canSetProperty (int /*long*/ iid, int /*long*/ propertyName, int /*long*/ _r return XPCOM.NS_OK; } -/* external */ - -static Object convertToJava (nsIVariant variant, short type) { - switch (type) { - case nsIDataType.VTYPE_EMPTY: - case nsIDataType.VTYPE_VOID: - return null; - case nsIDataType.VTYPE_EMPTY_ARRAY: - return new Object[0]; - case nsIDataType.VTYPE_BOOL: - int[] boolResult = new int[1]; /*PRInt32*/ - int rc = variant.GetAsBool (boolResult); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - return new Boolean (boolResult[0] != 0); - case nsIDataType.VTYPE_INT32: - int[] intResult = new int[1]; /*PRInt32*/ - rc = variant.GetAsInt32 (intResult); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - return new Double (intResult[0]); - case nsIDataType.VTYPE_DOUBLE: - int /*long*/ doubleReturn = C.malloc (8); - rc = variant.GetAsDouble (doubleReturn); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - double[] doubleResult = new double[1]; - C.memmove (doubleResult, doubleReturn, 8); - C.free (doubleReturn); - return new Double (doubleResult[0]); - case nsIDataType.VTYPE_WSTRING_SIZE_IS: - int[] size = new int[1]; /* PRInt32 */ - int /*long*/[] wString = new int /*long*/[1]; - rc = variant.GetAsWStringWithSize (size, wString); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - char[] chars = new char[size[0]]; - C.memmove (chars, wString[0], size[0] * 2); - return new String (chars); - case nsIDataType.VTYPE_ARRAY: - Object[] arrayReturn = new Object[0]; - int /*long*/ iid = C.malloc (nsID.sizeof); - C.memset (iid, 0, nsID.sizeof); - int[] count = new int[1]; /* PRUint32 */ - short[] currentType = new short[1]; - int /*long*/[] ptr = new int /*long*/[1]; - rc = variant.GetAsArray (currentType, iid, count, ptr); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - if (ptr[0] == 0) Mozilla.error (XPCOM.NS_ERROR_NULL_POINTER); - nsID id = new nsID (); - XPCOM.memmove (id, iid, nsID.sizeof); - C.free (iid); - - int /*long*/[] result = new int /*long*/[1]; - rc = XPCOM.NS_GetServiceManager (result); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); - - nsIServiceManager serviceManager = new nsIServiceManager (result[0]); - result[0] = 0; - byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true); - rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); - serviceManager.Release (); - - nsIMemory memory = new nsIMemory (result[0]); - result[0] = 0; - - if (id.Equals (nsIVariant.NS_IVARIANT_IID)) { - arrayReturn = new Object[count[0]]; - for (int i = 0; i < count[0]; i++) { - int /*long*/[] arrayPtr = new int /*long*/[1]; - C.memmove (arrayPtr, ptr[0] + i * C.PTR_SIZEOF, C.PTR_SIZEOF); - nsISupports supports = new nsISupports (arrayPtr[0]); - rc = supports.QueryInterface (nsIVariant.NS_IVARIANT_IID, result); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); - - nsIVariant currentVariant = new nsIVariant (result[0]); - result[0] = 0; - currentType[0] = 0; - rc = currentVariant.GetDataType (currentType); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - try { - arrayReturn[i] = convertToJava (currentVariant, currentType[0]); - currentVariant.Release (); - } catch (IllegalArgumentException e) { - /* invalid argument value type */ - currentVariant.Release (); - memory.Free (ptr[0]); - memory.Release (); - throw e; - } - } - } else { - switch (currentType[0]) { - case nsIDataType.VTYPE_DOUBLE: - arrayReturn = new Object[count[0]]; - for (int i = 0; i < count[0]; i++) { - double[] doubleValue = new double[1]; - C.memmove (doubleValue, ptr[0] + i * 8, 8); - arrayReturn[i] = new Double (doubleValue[0]); - } - break; - case nsIDataType.VTYPE_BOOL: - arrayReturn = new Object[count[0]]; - for (int i = 0; i < count[0]; i++) { - int[] boolValue = new int[1]; /* PRUInt32 */ - C.memmove (boolValue, ptr[0] + i * 4, 4); - arrayReturn[i] = new Boolean (boolValue[0] != 0); - } - break; - case nsIDataType.VTYPE_INT32: - arrayReturn = new Object[count[0]]; - for (int i = 0; i < count[0]; i++) { - int[] intValue = new int[1]; /* PRInt32 */ - C.memmove (intValue, ptr[0] + i * 4, 4); - arrayReturn[i] = new Double (intValue[0]); - } - break; - case nsIDataType.VTYPE_WCHAR_STR: - arrayReturn = new Object[count[0]]; - for (int i = 0; i < count[0]; i++) { - int /*long*/ currentPtr = ptr[0] + i * C.PTR_SIZEOF; - int /*long*/[] stringPtr = new int /*long*/[1]; - C.memmove (stringPtr, currentPtr, C.PTR_SIZEOF); - int length = XPCOM.strlen_PRUnichar (stringPtr[0]); - char[] dest = new char[length]; - XPCOM.memmove (dest, stringPtr[0], length * 2); - arrayReturn[i] = new String (dest); - } - break; - default: - memory.Free (ptr[0]); - memory.Release (); - SWT.error (SWT.ERROR_INVALID_ARGUMENT); - } - } - memory.Free (ptr[0]); - memory.Release (); - return arrayReturn; - } - SWT.error (SWT.ERROR_INVALID_ARGUMENT); - return null; -} - -nsIVariant convertToJS (Object value, nsIComponentManager componentManager) { - int /*long*/[] result = new int /*long*/[1]; - byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_VARIANT_CONTRACTID, true); - int rc = componentManager.CreateInstanceByContractID (aContractID, 0, nsIWritableVariant.NS_IWRITABLEVARIANT_IID, result); - nsIWritableVariant variant = new nsIWritableVariant (result[0]); - result[0] = 0; - - if (value == null) { - rc = variant.SetAsEmpty (); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - return variant; - } - if (value instanceof String) { - String stringValue = (String)value; - int length = stringValue.length (); - char[] chars = new char[length]; - stringValue.getChars (0, length, chars, 0); - rc = variant.SetAsWStringWithSize (length, chars); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - return variant; - } - if (value instanceof Boolean) { - Boolean booleanValue = (Boolean)value; - rc = variant.SetAsBool (booleanValue.booleanValue () ? 1 : 0); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - return variant; - } - if (value instanceof Number) { - Number numberValue = (Number)value; - rc = variant.SetAsDouble (numberValue.doubleValue ()); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - return variant; - } - if (value instanceof Object[]) { - Object[] arrayValue = (Object[])value; - int length = arrayValue.length; - if (length == 0) { - rc = variant.SetAsEmptyArray (); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - } else { - int /*long*/ arrayPtr = C.malloc (C.PTR_SIZEOF * length); - for (int i = 0; i < length; i++) { - Object currentObject = arrayValue[i]; - try { - nsIVariant currentVariant = convertToJS (currentObject, componentManager); - C.memmove (arrayPtr + C.PTR_SIZEOF * i, new int /*long*/[] {currentVariant.getAddress ()}, C.PTR_SIZEOF); - } catch (SWTException e) { - /* invalid return value type */ - C.free (arrayPtr); - variant.Release (); - /* release the variants that had previously been added to the array */ - for (int j = 0; j < i; j++) { - int /*long*/[] ptr = new int /*long*/[1]; - C.memmove (ptr, arrayPtr + C.PTR_SIZEOF * j, C.PTR_SIZEOF); - new nsISupports (ptr[0]).Release (); - } - throw e; - } - } - int /*long*/ idPtr = C.malloc (nsID.sizeof); - XPCOM.memmove (idPtr, nsIVariant.NS_IVARIANT_IID, nsID.sizeof); - rc = variant.SetAsArray (nsIDataType.VTYPE_INTERFACE_IS, idPtr, length, arrayPtr); - C.free (idPtr); - C.free (arrayPtr); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - } - return variant; - } - - variant.Release (); - SWT.error (SWT.ERROR_INVALID_RETURN_VALUE); - return null; -} - -int callJava (int functionId, int /*long*/ tokenVariant, int /*long*/ args, int /*long*/ returnPtr) { - Object key = new Integer (functionId); - BrowserFunction function = (BrowserFunction)Mozilla.AllFunctions.get (key); - Object returnValue = null; - - if (function != null) { - try { - short[] type = new short[1]; /* PRUint16 */ - nsIVariant variant = new nsIVariant (tokenVariant); - int rc = variant.GetDataType (type); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - Object temp = convertToJava (variant, type[0]); - type[0] = 0; - if (temp instanceof String) { - String token = (String)temp; - if (token.equals (function.token)) { - variant = new nsIVariant (args); - rc = variant.GetDataType (type); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - temp = convertToJava (variant, type[0]); - if (temp instanceof Object[]) { - Object[] arguments = (Object[])temp; - try { - returnValue = function.function (arguments); - } catch (Exception e) { - /* exception during function invocation */ - returnValue = WebBrowser.CreateErrorString (e.getLocalizedMessage ()); - } - } - } - } - } catch (IllegalArgumentException e) { - /* invalid argument value type */ - if (function.isEvaluate) { - /* notify the evaluate function so that a java exception can be thrown */ - function.function (new String[] {WebBrowser.CreateErrorString (new SWTException (SWT.ERROR_INVALID_RETURN_VALUE).getLocalizedMessage ())}); - } - returnValue = WebBrowser.CreateErrorString (e.getLocalizedMessage ()); - } - } - - int /*long*/[] result = new int /*long*/[1]; - int rc = XPCOM.NS_GetComponentManager (result); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); - nsIComponentManager componentManager = new nsIComponentManager (result[0]); - result[0] = 0; - nsIVariant variant; - try { - variant = convertToJS (returnValue, componentManager); - } catch (SWTException e) { - /* invalid return value type */ - variant = convertToJS (WebBrowser.CreateErrorString (e.getLocalizedMessage ()), componentManager); - } - componentManager.Release (); - C.memmove (returnPtr, new int /*long*/[] {variant.getAddress ()}, C.PTR_SIZEOF); - - return XPCOM.NS_OK; -} } diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java index 51917394a7..74c33cbe47 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/Mozilla.java @@ -694,9 +694,6 @@ public void create (Composite parent, int style) { LocationProvider = new AppFileLocProvider (MozillaPath, profilePath, cacheParentPath, IsXULRunner); LocationProvider.AddRef (); - /* write external.xpt to the file system if needed */ - initExternal (profilePath); - /* invoke appropriate Init function (based on mozilla version) */ initXPCOM (MozillaPath, IsXULRunner); } @@ -896,6 +893,9 @@ public void create (Composite parent, int style) { interfaceRequestor.Release (); componentRegistrar.Release (); + /* write external.xpt to the file system if needed */ + initExternal (LocationProvider.profilePath); + if (!factoriesRegistered) { HelperAppLauncherDialogFactory dialogFactory = new HelperAppLauncherDialogFactory (); dialogFactory.AddRef (); @@ -1359,17 +1359,9 @@ public boolean execute (String script) { if (rc == XPCOM.NS_OK && result[0] != 0) { int /*long*/ principals = result[0]; result[0] = 0; - String jsLibraryName = IsPre_4 ? MozillaDelegate.getJSLibraryName_Pre4() : MozillaDelegate.getJSLibraryName(); - if (jsLibPathBytes == null) { - String mozillaPath = getMozillaPath () + jsLibraryName + '\0'; - try { - jsLibPathBytes = mozillaPath.getBytes ("UTF-8"); //$NON-NLS-1$ - } catch (UnsupportedEncodingException e) { - jsLibPathBytes = mozillaPath.getBytes (); - } - } - int /*long*/ globalJSObject = XPCOM.JS_GetGlobalObject (jsLibPathBytes, nativeContext); + byte[] jsLibPath = getJSLibPathBytes (); + int /*long*/ globalJSObject = XPCOM.JS_GetGlobalObject (jsLibPath, nativeContext); if (globalJSObject != 0) { aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_CONTEXTSTACK_CONTRACTID, true); rc = serviceManager.GetServiceByContractID (aContractID, nsIJSContextStack.NS_IJSCONTEXTSTACK_IID, result); @@ -1380,7 +1372,7 @@ public boolean execute (String script) { if (rc != XPCOM.NS_OK) { stack.Release (); } else { - boolean success = XPCOM.JS_EvaluateUCScriptForPrincipals (jsLibPathBytes, nativeContext, globalJSObject, principals, scriptChars, length, urlbytes, 0, result) != 0; + boolean success = XPCOM.JS_EvaluateUCScriptForPrincipals (jsLibPath, nativeContext, globalJSObject, principals, scriptChars, length, urlbytes, 0, result) != 0; result[0] = 0; rc = stack.Pop (result); stack.Release (); @@ -1488,6 +1480,19 @@ public String getBrowserType () { return "mozilla"; //$NON-NLS-1$ } +static byte[] getJSLibPathBytes () { + if (jsLibPathBytes == null) { + String jsLibraryName = IsPre_4 ? MozillaDelegate.getJSLibraryName_Pre4 () : MozillaDelegate.getJSLibraryName (); + String mozillaPath = getMozillaPath () + jsLibraryName + '\0'; + try { + jsLibPathBytes = mozillaPath.getBytes ("UTF-8"); //$NON-NLS-1$ + } catch (UnsupportedEncodingException e) { + jsLibPathBytes = mozillaPath.getBytes (); + } + } + return jsLibPathBytes; +} + static String getMozillaPath () { if (LocationProvider != null) return LocationProvider.mozillaPath; if (!Initialized) return ""; @@ -1738,6 +1743,13 @@ static String InitDiscoverXULRunner () { } void initExternal (String profilePath) { + /* + * external.xpt does not need to be written to the file system if the + * XULRunner version is >= 4 since External.java handles this case + * differently than for earlier XULRunner releases. + */ + if (!IsPre_4) return; + File componentsDir = new File (profilePath, AppFileLocProvider.COMPONENTS_DIR); java.io.InputStream is = Library.class.getResourceAsStream ("/external.xpt"); //$NON-NLS-1$ if (is != null) { @@ -1825,12 +1837,12 @@ void initFactories (nsIServiceManager serviceManager, nsIComponentManager compon /* register for mozilla versions <= 3.6.x */ byte[] category = MozillaDelegate.wcsToMbcs (null, "JavaScript global property", true); //$NON-NLS-1$ - rc = categoryManager.AddCategoryEntry(category, entry, aContractID, 0, 1, result); + rc = categoryManager.AddCategoryEntry (category, entry, aContractID, 0, 1, result); result[0] = 0; /* register for mozilla versions >= 3.6.x */ category = MozillaDelegate.wcsToMbcs (null, "JavaScript-global-property", true); //$NON-NLS-1$ - rc = categoryManager.AddCategoryEntry(category, entry, aContractID, 0, 1, result); + rc = categoryManager.AddCategoryEntry (category, entry, aContractID, 0, 1, result); result[0] = 0; categoryManager.Release (); -- cgit