diff options
| author | mjgp2 | 2015-03-16 10:33:22 +0000 |
|---|---|---|
| committer | Sravan Kumar Lakkimsetti | 2015-03-16 11:44:37 +0000 |
| commit | a84c4f3464a5f713e18d5891323717c2051b011d (patch) | |
| tree | e296774f6666da84b171a9e6df9e758ac985fe52 | |
| parent | 3fa10aec500a4081c70ceb9a57998af702891944 (diff) | |
| download | eclipse.platform.swt-a84c4f3464a5f713e18d5891323717c2051b011d.tar.gz eclipse.platform.swt-a84c4f3464a5f713e18d5891323717c2051b011d.tar.xz eclipse.platform.swt-a84c4f3464a5f713e18d5891323717c2051b011d.zip | |
Bug 429739 - Permission denied to access property ''I20150316-0800
Rather than directly accessing the JavaScript engine this seeks to use
XPConnect to communicate with JavaScript. The idea was actually based on
an earlier version of SWT but the relevant component was never used.
* Revert to using the previous mozilla / profile paths for XUL < 24
* Remove with() from evalAsChrome as alters security context
Change-Id: I63a2b085a96193904c0d67d960e158233464ca56
Signed-off-by: mjgp2 <matthew.painter@import.io>
13 files changed, 284 insertions, 588 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/library/xpcom_stats.cpp b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/library/xpcom_stats.cpp index fb544ad2ba..520826cbce 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/library/xpcom_stats.cpp +++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/library/xpcom_stats.cpp @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2014 IBM Corporation and others. + * Copyright (c) 2000, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -37,14 +37,9 @@ char * XPCOM_nativeFunctionNames[] = { #else "_1Call__JJJ_3BII_3I", #endif - "_1JS_1DefineFunction", - "_1JS_1DefineFunction24", "_1JS_1EvaluateUCScriptForPrincipals", "_1JS_1EvaluateUCScriptForPrincipals191", - "_1JS_1EvaluateUCScriptForPrincipals24", - "_1JS_1GetGlobalForScopeChain24", "_1JS_1GetGlobalObject", - "_1JS_1NewObject", "_1NS_1Free", "_1NS_1GetComponentManager", "_1NS_1GetServiceManager", @@ -1128,11 +1123,7 @@ char * XPCOM_nativeFunctionNames[] = { "_1nsID_1new", "_1nsIMemory_1Alloc", "_1nsIMemory_1Realloc", - "_1nsIScriptContext24_1GetNativeContext", "_1nsIScriptContext_1GetNativeContext", - "_1nsIScriptGlobalObject24_1EnsureScriptEnvironment", - "_1nsIScriptGlobalObject24_1GetGlobalJSObject", - "_1nsIScriptGlobalObject24_1GetScriptContext", "_1nsIScriptGlobalObject_1EnsureScriptEnvironment", "_1nsIScriptGlobalObject_1GetScriptContext", #ifndef JNI64 diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/library/xpcom_stats.h b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/library/xpcom_stats.h index 8de90abbd4..07690abd33 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/library/xpcom_stats.h +++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/library/xpcom_stats.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2014 IBM Corporation and others. + * Copyright (c) 2000, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -47,14 +47,9 @@ typedef enum { #else _1Call__JJJ_3BII_3I_FUNC, #endif - _1JS_1DefineFunction_FUNC, - _1JS_1DefineFunction24_FUNC, _1JS_1EvaluateUCScriptForPrincipals_FUNC, _1JS_1EvaluateUCScriptForPrincipals191_FUNC, - _1JS_1EvaluateUCScriptForPrincipals24_FUNC, - _1JS_1GetGlobalForScopeChain24_FUNC, _1JS_1GetGlobalObject_FUNC, - _1JS_1NewObject_FUNC, _1NS_1Free_FUNC, _1NS_1GetComponentManager_FUNC, _1NS_1GetServiceManager_FUNC, @@ -1138,11 +1133,7 @@ typedef enum { _1nsID_1new_FUNC, _1nsIMemory_1Alloc_FUNC, _1nsIMemory_1Realloc_FUNC, - _1nsIScriptContext24_1GetNativeContext_FUNC, _1nsIScriptContext_1GetNativeContext_FUNC, - _1nsIScriptGlobalObject24_1EnsureScriptEnvironment_FUNC, - _1nsIScriptGlobalObject24_1GetGlobalJSObject_FUNC, - _1nsIScriptGlobalObject24_1GetScriptContext_FUNC, _1nsIScriptGlobalObject_1EnsureScriptEnvironment_FUNC, _1nsIScriptGlobalObject_1GetScriptContext_FUNC, #ifndef JNI64 diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/AppFileLocProvider.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/AppFileLocProvider.java index c40c5319ee..1d0061942a 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/AppFileLocProvider.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/AppFileLocProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2013 IBM Corporation and others. + * Copyright (c) 2003, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -294,15 +294,27 @@ int getFile(long /*int*/ prop, long /*int*/ persistent, long /*int*/ _retval) { } else if (propertyName.equals (XPCOM.NS_GRE_DIR)) { propertyValue = mozillaPath; } else if (propertyName.equals (XPCOM.NS_GRE_COMPONENT_DIR)) { - propertyValue = profilePath + COMPONENTS_DIR; + if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24, false)) { + propertyValue = mozillaPath + COMPONENTS_DIR; + } else { + propertyValue = profilePath + COMPONENTS_DIR; + } } else if (propertyName.equals (XPCOM.NS_XPCOM_INIT_CURRENT_PROCESS_DIR)) { propertyValue = mozillaPath; } else if (propertyName.equals (XPCOM.NS_OS_CURRENT_PROCESS_DIR)) { propertyValue = mozillaPath; } else if (propertyName.equals (XPCOM.NS_XPCOM_COMPONENT_DIR)) { - propertyValue = mozillaPath + COMPONENTS_DIR; + if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24, false)) { + propertyValue = profilePath + COMPONENTS_DIR; + } else { + propertyValue = mozillaPath + COMPONENTS_DIR; + } } else if (propertyName.equals (XPCOM.NS_XPCOM_CURRENT_PROCESS_DIR)) { - propertyValue = mozillaPath; + if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24, false)) { + propertyValue = profilePath; + } else { + propertyValue = mozillaPath; + } } else if (propertyName.equals (XPCOM.NS_APP_PREF_DEFAULTS_50_DIR)) { /* * Answering a value for this property causes problems in Mozilla versions 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 8bb636be1f..ce015dfb5f 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2015 IBM Corporation and others. + * Copyright (c) 2008, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,8 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Neil Rashbrook <neil@parkwaycc.co.uk> - Bug 429739 + * Matthew Painter <matthew.painter@import.io> * Red Hat Inc. - generification *******************************************************************************/ package org.eclipse.swt.browser; @@ -26,27 +28,7 @@ class External { XPCOMObject supports; XPCOMObject external; XPCOMObject classInfo; - XPCOMObject securityCheckedComponent; - XPCOMObject scriptObjectOwner; - XPCOMObject xpcScriptable; int refCount = 0; - - static final String CALLJAVA = "callJava"; //$NON-NLS-1$ - - static Callback CallJavaProc, GetScriptableFlags24Proc = null; - static { - CallJavaProc = new Callback (External.class, CALLJAVA, 3); - if (CallJavaProc.getAddress () == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); - - /* - * On win32 a substitute callback is provided for nsIXPCScriptable.getScriptableFlags() - * because it does not use the standard XPCOM calling convention. - */ - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24) && SWT.getPlatform ().equals ("win32")) { //$NON-NLS-1$ - GetScriptableFlags24Proc = new Callback (External.class, "getScriptableFlags", 0); //$NON-NLS-1$ - if (GetScriptableFlags24Proc.getAddress () == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); - } - } External () { createCOMInterfaces (); @@ -54,121 +36,17 @@ External () { /* 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 long /*int*/ callJava (long /*int*/ cx, long /*int*/ argc, long /*int*/ vp) { - int jsval_sizeof = 8; - long /*int*/ argsPtr = vp + 2 * jsval_sizeof; - nsIVariant resultVariant = null; - - long /*int*/[] result = new long /*int*/[1]; - int 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; - rc = serviceManager.GetService (XPCOM.NS_IXPCONNECT_CID, IIDStore.GetIID (nsIXPConnect.class), result); - if (rc != XPCOM.NS_OK) Mozilla.error (rc); - if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE); - - nsIXPConnect connect = new nsIXPConnect (result[0]); - result[0] = 0; - - /* 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 = 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) { - long /*int*/ tokenVariant = result[0]; - result[0] = 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) { - long /*int*/ argsVariant = result[0]; - result[0] = 0; - - /* invoke the BrowserFunction */ - resultVariant = new nsIVariant (invokeFunction (functionId, tokenVariant, argsVariant)); - new nsISupports (argsVariant).Release (); - } - new nsISupports (tokenVariant).Release (); - } - } - } - idVariant.Release (); - } - result[0] = 0; - - /* 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 (); - } - - /* convert the resulting variant to a jsval */ - byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true); - rc = serviceManager.GetServiceByContractID (aContractID, IIDStore.GetIID (nsIMemory.class), 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; - long /*int*/ jsVal = memory.Alloc (jsval_sizeof); - C.memset (jsVal, 0, jsval_sizeof); - long /*int*/ globalObject = 0; - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24)) { - globalObject = XPCOM.JS_GetGlobalForScopeChain24 (cx); - } else { - globalObject = XPCOM.JS_GetGlobalObject (Mozilla.getJSLibPathBytes (), cx); - } - rc = connect.VariantToJS (cx, globalObject, resultVariant.getAddress (), jsVal); - resultVariant.Release (); - connect.Release (); - - long /*int*/ 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; -} - -/* this is the BrowserFunction entry point when the detected XULRunner version is < 4 */ static int callJava (int functionId, long /*int*/ tokenVariant, long /*int*/ argsVariant, long /*int*/ returnPtr) { long /*int*/ resultVariant = invokeFunction (functionId, tokenVariant, argsVariant); C.memmove (returnPtr, new long /*int*/[] {resultVariant}, C.PTR_SIZEOF); return XPCOM.NS_OK; } -static Object convertToJava (nsIVariant variant, short type) { - switch (type) { +static Object convertToJava (nsIVariant variant) { + short[] dataType = new short[1]; + int rc = variant.GetDataType (dataType); + if (rc != XPCOM.NS_OK) Mozilla.error (rc); + switch (dataType[0]) { case nsIDataType.VTYPE_EMPTY: case nsIDataType.VTYPE_VOID: return null; @@ -176,7 +54,7 @@ static Object convertToJava (nsIVariant variant, short type) { return new Object[0]; case nsIDataType.VTYPE_BOOL: int[] boolResult = new int[1]; /*PRInt32*/ - int rc = variant.GetAsBool (boolResult); + rc = variant.GetAsBool (boolResult); if (rc != XPCOM.NS_OK) Mozilla.error (rc); return new Boolean (boolResult[0] != 0); case nsIDataType.VTYPE_INT32: @@ -242,11 +120,9 @@ static Object convertToJava (nsIVariant variant, short type) { 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]); + arrayReturn[i] = convertToJava (currentVariant); currentVariant.Release (); } catch (IllegalArgumentException e) { /* invalid argument value type */ @@ -396,19 +272,13 @@ static long /*int*/ invokeFunction (int functionId, long /*int*/ tokenVariant, l 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; + Object temp = convertToJava (variant); 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]); + temp = convertToJava (variant); if (temp instanceof Object[]) { Object[] arguments = (Object[])temp; try { @@ -489,23 +359,6 @@ void createCOMInterfaces () { public long /*int*/ method10 (long /*int*/[] args) {return getClassIDNoAlloc (args[0]);} }; - securityCheckedComponent = new XPCOMObject (new int[] {2, 0, 0, 2, 3, 3, 3}) { - @Override - public long /*int*/ method0 (long /*int*/[] args) {return QueryInterface (args[0], args[1]);} - @Override - public long /*int*/ method1 (long /*int*/[] args) {return AddRef ();} - @Override - public long /*int*/ method2 (long /*int*/[] args) {return Release ();} - @Override - public long /*int*/ method3 (long /*int*/[] args) {return canCreateWrapper (args[0], args[1]);} - @Override - public long /*int*/ method4 (long /*int*/[] args) {return canCallMethod (args[0], args[1], args[2]);} - @Override - public long /*int*/ method5 (long /*int*/[] args) {return canGetProperty (args[0], args[1], args[2]);} - @Override - public long /*int*/ method6 (long /*int*/[] args) {return canSetProperty (args[0], args[1], args[2]);} - }; - external = new XPCOMObject (new int[] {2, 0, 0, 4}) { @Override public long /*int*/ method0 (long /*int*/[] args) {return QueryInterface (args[0], args[1]);} @@ -516,44 +369,6 @@ void createCOMInterfaces () { @Override public long /*int*/ method3 (long /*int*/[] args) {return callJava ((int)/*64*/args[0], args[1], args[2], args[3]);} }; - - scriptObjectOwner = new XPCOMObject (new int[] {2, 0, 0, 2, 1}) { - @Override - public long /*int*/ method0 (long /*int*/[] args) {return QueryInterface (args[0], args[1]);} - @Override - public long /*int*/ method1 (long /*int*/[] args) {return AddRef ();} - @Override - public long /*int*/ method2 (long /*int*/[] args) {return Release ();} - @Override - public long /*int*/ method3 (long /*int*/[] args) {return getScriptObject (args[0], args[1]);} - @Override - public long /*int*/ method4 (long /*int*/[] args) {return setScriptObject (args[0]);} - }; - - xpcScriptable = new XPCOMObject (new int[] {2, 0, 0, 1, 0, 4, 3, 3, 3, 6, 5, 6, 6, 4, 7, 7, 6, 3, 7, 5, 5, 6, 4, 2}) { - @Override - public long /*int*/ method0 (long /*int*/[] args) {return QueryInterface (args[0], args[1]);} - @Override - public long /*int*/ method1 (long /*int*/[] args) {return AddRef ();} - @Override - public long /*int*/ method2 (long /*int*/[] args) {return Release ();} - @Override - public long /*int*/ method3 (long /*int*/[] args) {return getClassName (args[0]);} - @Override - public long /*int*/ method4 (long /*int*/[] args) {return getScriptableFlags ();} - @Override - public long /*int*/ method7 (long /*int*/[] args) {return postCreate (args[0], args[1], args[2]);} - }; - - if (GetScriptableFlags24Proc != null) { - long /*int*/ ppVtable = xpcScriptable.getVtable (); - long /*int*/[] pVtable = new long /*int*/[1]; - C.memmove (pVtable, ppVtable, C.PTR_SIZEOF); - long /*int*/[] funcs = new long /*int*/[24]; - C.memmove (funcs, pVtable[0], C.PTR_SIZEOF * funcs.length); - funcs[4] = XPCOM.CALLBACK_GetScriptableFlags24 (GetScriptableFlags24Proc.getAddress ()); - C.memmove (pVtable[0], funcs, C.PTR_SIZEOF * funcs.length); - } } void disposeCOMInterfaces () { @@ -565,22 +380,10 @@ void disposeCOMInterfaces () { classInfo.dispose (); classInfo = null; } - if (securityCheckedComponent != null) { - securityCheckedComponent.dispose (); - securityCheckedComponent = null; - } if (external != null) { external.dispose (); external = null; } - if (scriptObjectOwner != null) { - scriptObjectOwner.dispose (); - scriptObjectOwner = null; - } - if (xpcScriptable != null) { - xpcScriptable.dispose (); - xpcScriptable = null; - } } long /*int*/ getAddress () { @@ -602,32 +405,12 @@ int QueryInterface (long /*int*/ riid, long /*int*/ ppvObject) { AddRef(); return XPCOM.NS_OK; } - if (guid.Equals (XPCOM.NS_ISECURITYCHECKEDCOMPONENT_IID)) { - XPCOM.memmove (ppvObject, new long /*int*/[] {securityCheckedComponent.getAddress ()}, C.PTR_SIZEOF); - AddRef(); - return XPCOM.NS_OK; - } if (guid.Equals (EXTERNAL_IID)) { XPCOM.memmove (ppvObject, new long /*int*/[] {external.getAddress ()}, C.PTR_SIZEOF); AddRef(); return XPCOM.NS_OK; } - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR10)) { - if (guid.Equals (XPCOM.NS_ISCRIPTOBJECTOWNER_IID)) { - XPCOM.memmove (ppvObject, new long /*int*/[] {scriptObjectOwner.getAddress ()}, C.PTR_SIZEOF); - AddRef(); - return XPCOM.NS_OK; - } - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24)) { - if (guid.Equals (XPCOM.NS_IXPCSCRIPTABLE_IID)) { - XPCOM.memmove (ppvObject, new long /*int*/[] {xpcScriptable.getAddress ()}, C.PTR_SIZEOF); - AddRef(); - return XPCOM.NS_OK; - } - } - } - XPCOM.memmove (ppvObject, new long /*int*/[] {0}, C.PTR_SIZEOF); return XPCOM.NS_ERROR_NO_INTERFACE; } @@ -678,7 +461,7 @@ int getContractID (long /*int*/ _retValue) { } int getFlags (long /*int*/ flags) { - C.memmove (flags, new int[] {nsIClassInfo.MAIN_THREAD_ONLY}, 4); /* PRUint32 */ + C.memmove (flags, new int[] {nsIClassInfo.DOM_OBJECT}, 4); /* PRUint32 */ return XPCOM.NS_OK; } @@ -708,187 +491,16 @@ int getInterfaces (long /*int*/ count, long /*int*/ array) { nsIMemory memory = new nsIMemory (result[0]); result[0] = 0; - long /*int*/ securityCheckedComponentIID = memory.Alloc (nsID.sizeof); - XPCOM.memmove (securityCheckedComponentIID, XPCOM.NS_ISECURITYCHECKEDCOMPONENT_IID, nsID.sizeof); long /*int*/ externalIID = memory.Alloc (nsID.sizeof); XPCOM.memmove (externalIID, EXTERNAL_IID, nsID.sizeof); - long /*int*/ ptrArray = memory.Alloc (3 * C.PTR_SIZEOF); - C.memmove (ptrArray, new long /*int*/[] {securityCheckedComponentIID}, C.PTR_SIZEOF); - C.memmove (ptrArray + C.PTR_SIZEOF, new long /*int*/[] {externalIID}, C.PTR_SIZEOF); + long /*int*/ ptrArray = memory.Alloc (C.PTR_SIZEOF); + C.memmove (ptrArray, new long /*int*/[] {externalIID}, C.PTR_SIZEOF); C.memmove (array, new long /*int*/[] {ptrArray}, C.PTR_SIZEOF); memory.Release (); - C.memmove (count, new int[] {2}, 4); /* PRUint */ - return XPCOM.NS_OK; -} - -/* nsIScriptObjectOwner */ - -int getScriptObject (long /*int*/ aContext, long /*int*/ aScriptObject) { - byte[] jsLibPath = Mozilla.getJSLibPathBytes (); - long /*int*/ nativeContext = XPCOM.nsIScriptContext_GetNativeContext (aContext); - long /*int*/ globalJSObject = XPCOM.JS_GetGlobalObject (jsLibPath, nativeContext); - long /*int*/ newObject = XPCOM.JS_NewObject (jsLibPath, nativeContext, 0, 0, globalJSObject); - - byte[] functionName = MozillaDelegate.wcsToMbcs (null, CALLJAVA, true); - 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 long /*int*/[] {newObject}, C.PTR_SIZEOF); + C.memmove (count, new int[] {1}, 4); /* PRUint */ return XPCOM.NS_OK; } -int setScriptObject (long /*int*/ aScriptObject) { - return XPCOM.NS_COMFALSE; -} - -/* nsISecurityCheckedComponent */ - -int canCreateWrapper (long /*int*/ iid, long /*int*/ _retVal) { - long /*int*/[] result = new long /*int*/[1]; - int 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, IIDStore.GetIID (nsIMemory.class), 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; - byte[] bytes = MozillaDelegate.wcsToMbcs (null, "allAccess", true); //$NON-NLS-1$ - long /*int*/ ptr = memory.Alloc (bytes.length); - C.memmove (ptr, bytes, bytes.length); - C.memmove (_retVal, new long /*int*/[] {ptr}, C.PTR_SIZEOF); - memory.Release (); - - return XPCOM.NS_OK; -} - -int canCallMethod (long /*int*/ iid, long /*int*/ methodName, long /*int*/ _retVal) { - long /*int*/[] result = new long /*int*/[1]; - int 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, IIDStore.GetIID (nsIMemory.class), 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; - int length = XPCOM.strlen_PRUnichar (methodName); - char[] dest = new char[length]; - XPCOM.memmove (dest, methodName, length * 2); - String string = new String (dest); - byte[] bytes; - if (string.equals (CALLJAVA)) { - bytes = MozillaDelegate.wcsToMbcs (null, "allAccess", true); //$NON-NLS-1$ - } else { - bytes = MozillaDelegate.wcsToMbcs (null, "noAccess", true); //$NON-NLS-1$ - } - long /*int*/ ptr = memory.Alloc (bytes.length); - C.memmove (ptr, bytes, bytes.length); - C.memmove (_retVal, new long /*int*/[] {ptr}, C.PTR_SIZEOF); - memory.Release (); - - return XPCOM.NS_OK; -} - -int canGetProperty (long /*int*/ iid, long /*int*/ propertyName, long /*int*/ _retVal) { - long /*int*/[] result = new long /*int*/[1]; - int 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, IIDStore.GetIID (nsIMemory.class), 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; - byte[] bytes = MozillaDelegate.wcsToMbcs (null, "noAccess", true); //$NON-NLS-1$ - long /*int*/ ptr = memory.Alloc (bytes.length); - C.memmove (ptr, bytes, bytes.length); - C.memmove (_retVal, new long /*int*/[] {ptr}, C.PTR_SIZEOF); - memory.Release (); - - return XPCOM.NS_OK; -} - -int canSetProperty (long /*int*/ iid, long /*int*/ propertyName, long /*int*/ _retVal) { - long /*int*/[] result = new long /*int*/[1]; - int 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, IIDStore.GetIID (nsIMemory.class), 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; - byte[] bytes = MozillaDelegate.wcsToMbcs (null, "noAccess", true); //$NON-NLS-1$ - long /*int*/ ptr = memory.Alloc (bytes.length); - C.memmove (ptr, bytes, bytes.length); - C.memmove (_retVal, new long /*int*/[] {ptr}, C.PTR_SIZEOF); - memory.Release (); - - return XPCOM.NS_OK; -} - -/* nsIXPCScriptable */ - -long /*int*/ getClassName (long /*int*/ aClassName) { - long /*int*/[] result = new long /*int*/[1]; - int 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, IIDStore.GetIID (nsIMemory.class), 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; - byte[] bytes = MozillaDelegate.wcsToMbcs (null, "external", true); //$NON-NLS-1$ - long /*int*/ ptr = memory.Alloc (bytes.length); - C.memmove (ptr, bytes, bytes.length); - C.memmove (aClassName, new long /*int*/[] {ptr}, C.PTR_SIZEOF); - memory.Release (); - - return 0; -} - -static long /*int*/ getScriptableFlags () { - return XPCOM.WANT_POSTCREATE | XPCOM.USE_JSSTUB_FOR_ADDPROPERTY; -} - -int postCreate (long /*int*/ wrapper, long /*int*/ cx, long /*int*/ obj) { - byte[] functionName = MozillaDelegate.wcsToMbcs (null, CALLJAVA, true); - int flags = XPCOM.JSPROP_ENUMERATE | XPCOM.JSPROP_READONLY | XPCOM.JSPROP_PERMANENT; - XPCOM.JS_DefineFunction24 (cx, obj, functionName, XPCOM.CALLBACK_JSNative (CallJavaProc.getAddress ()), 3, flags); - return 0; -} - } 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 b4c7d111e1..101b09a967 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2013 IBM Corporation and others. + * Copyright (c) 2003, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,6 +7,8 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Neil Rashbrook <neil@parkwaycc.co.uk> - Bug 429739 + * Matthew Painter <matthew.painter@import.io> *******************************************************************************/ package org.eclipse.swt.browser; @@ -702,7 +704,7 @@ 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 */ + /* write swt.xpt to the file system if needed */ initExternal (LocationProvider.profilePath); /* invoke appropriate Init function (based on mozilla version) */ @@ -1392,6 +1394,51 @@ void disposeCOMInterfaces () { } @Override +public Object evaluate (String script) throws SWTException { + if (!MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24)) + return super.evaluate (script); + + delegate.removeWindowSubclass (); + + long /*int*/[] result = new long /*int*/[1]; + int rc = webBrowser.QueryInterface(IIDStore.GetIID (nsIInterfaceRequestor.class), result); + if (rc != XPCOM.NS_OK) error (rc); + if (result[0] == 0) error (XPCOM.NS_NOINTERFACE); + nsIInterfaceRequestor interfaceRequestor = new nsIInterfaceRequestor (result[0]); + result[0] = 0; + rc = XPCOM.NS_GetServiceManager (result); + if (rc != XPCOM.NS_OK) error (rc); + if (result[0] == 0) error (XPCOM.NS_NOINTERFACE); + + nsIServiceManager serviceManager = new nsIServiceManager (result[0]); + result[0] = 0; + rc = interfaceRequestor.GetInterface (IIDStore.GetIID (nsIDOMWindow.class), result); + interfaceRequestor.Release (); + if (rc != XPCOM.NS_OK) error (rc); + if (result[0] == 0) error (XPCOM.NS_NOINTERFACE); + + nsIDOMWindow window = new nsIDOMWindow (result[0]); + result[0] = 0; + byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.EXECUTE_CONTRACTID, true); + rc = serviceManager.GetServiceByContractID (aContractID, IIDStore.GetIID (Execute.class), result); + if (rc != XPCOM.NS_OK) error (rc); + if (result[0] == 0) error (XPCOM.NS_NOINTERFACE); + + Execute execute = new Execute (result[0]); + result[0] = 0; + nsEmbedString data = new nsEmbedString ("(function(){" + script + "}())"); + execute.EvalInWindow (window, data, result); + data.dispose (); + execute.Release (); + if (result[0] == 0) + return null; + + nsIVariant variant = new nsIVariant (result[0]); + Object retval = External.convertToJava (variant); + variant.Release (); + return retval; +} +@Override public boolean execute (String script) { /* * This could be the first content that is set into the browser, so @@ -1400,6 +1447,50 @@ public boolean execute (String script) { */ delegate.removeWindowSubclass (); + long /*int*/[] result = new long /*int*/[1]; + /* + * As of mozilla 1.9 executing javascript via the javascript: protocol no + * longer happens synchronously. As a result, the result of executing JS + * is not returned to the java side when expected by the client. The + * workaround for version 24 is to use a javascript-implemented component + * which then executes synchronously. + */ + if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24)) { + result[0] = 0; + int rc = webBrowser.QueryInterface(IIDStore.GetIID (nsIInterfaceRequestor.class), result); + if (rc != XPCOM.NS_OK) error (rc); + if (result[0] == 0) error (XPCOM.NS_NOINTERFACE); + nsIInterfaceRequestor interfaceRequestor = new nsIInterfaceRequestor (result[0]); + result[0] = 0; + rc = XPCOM.NS_GetServiceManager (result); + if (rc != XPCOM.NS_OK) error (rc); + if (result[0] == 0) error (XPCOM.NS_NOINTERFACE); + + nsIServiceManager serviceManager = new nsIServiceManager (result[0]); + result[0] = 0; + rc = interfaceRequestor.GetInterface (IIDStore.GetIID (nsIDOMWindow.class), result); + interfaceRequestor.Release (); + if (rc != XPCOM.NS_OK) error (rc); + if (result[0] == 0) error (XPCOM.NS_NOINTERFACE); + + nsIDOMWindow window = new nsIDOMWindow (result[0]); + result[0] = 0; + byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.EXECUTE_CONTRACTID, true); + rc = serviceManager.GetServiceByContractID (aContractID, IIDStore.GetIID (Execute.class), result); + if (rc != XPCOM.NS_OK) error (rc); + if (result[0] == 0) error (XPCOM.NS_NOINTERFACE); + + Execute execute = new Execute (result[0]); + result[0] = 0; + nsEmbedString data = new nsEmbedString (script); + rc = execute.EvalInWindow (window, data, result); + if (result[0] != 0) + new nsIVariant (result[0]).Release (); + data.dispose (); + execute.Release (); + return rc == XPCOM.NS_OK; + } + /* * As of mozilla 1.9 executing javascript via the javascript: protocol no * longer happens synchronously. As a result, the result of executing JS @@ -1407,7 +1498,6 @@ public boolean execute (String script) { * workaround is to invoke the javascript handler directly via C++, which is * exposed as of mozilla 1.9. */ - long /*int*/[] result = new long /*int*/[1]; if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR1_9)) { int rc = XPCOM.NS_GetServiceManager (result); if (rc != XPCOM.NS_OK) error (rc); @@ -1439,20 +1529,11 @@ public boolean execute (String script) { if (rc == XPCOM.NS_OK && result[0] != 0) { long /*int*/ scriptGlobalObject = result[0]; result[0] = 0; - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24)) { /* >= 24.x */ - rc = (int/*64*/)XPCOM.nsIScriptGlobalObject24_EnsureScriptEnvironment (scriptGlobalObject); - } else { - rc = (int/*64*/)XPCOM.nsIScriptGlobalObject_EnsureScriptEnvironment (scriptGlobalObject, 2); /* nsIProgrammingLanguage.JAVASCRIPT */ - } + rc = (int/*64*/)XPCOM.nsIScriptGlobalObject_EnsureScriptEnvironment (scriptGlobalObject, 2); /* nsIProgrammingLanguage.JAVASCRIPT */ if (rc != XPCOM.NS_OK) { new nsISupports (scriptGlobalObject).Release (); } else { - long /*int*/ scriptContext; - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24)) { /* >= 24.x */ - scriptContext = XPCOM.nsIScriptGlobalObject24_GetScriptContext (scriptGlobalObject); - } else { - scriptContext = XPCOM.nsIScriptGlobalObject_GetScriptContext (scriptGlobalObject, 2); /* nsIProgrammingLanguage.JAVASCRIPT */ - } + long /*int*/ scriptContext = XPCOM.nsIScriptGlobalObject_GetScriptContext (scriptGlobalObject, 2); /* nsIProgrammingLanguage.JAVASCRIPT */ if (scriptContext != 0) { /* ensure that the received nsIScriptContext implements the expected interface */ @@ -1462,12 +1543,7 @@ public boolean execute (String script) { new nsISupports (result[0]).Release (); result[0] = 0; - long /*int*/ jsContext; - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24)) { /* >= 24.x */ - jsContext = XPCOM.nsIScriptContext24_GetNativeContext (scriptContext); - } else { - jsContext = XPCOM.nsIScriptContext_GetNativeContext (scriptContext); - } + long /*int*/ jsContext = XPCOM.nsIScriptContext_GetNativeContext (scriptContext); if (jsContext != 0) { int length = script.length (); char[] scriptChars = new char[length]; @@ -1480,22 +1556,8 @@ public boolean execute (String script) { result[0] = 0; } byte[] jsLibPath = getJSLibPathBytes (); - long /*int*/ globalJSObject; - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24)) { /* >= 24.x */ - globalJSObject = XPCOM.nsIScriptGlobalObject24_GetGlobalJSObject (scriptGlobalObject); - } else { - globalJSObject = XPCOM.JS_GetGlobalObject (jsLibPath, jsContext); - } + long /*int*/ globalJSObject = XPCOM.JS_GetGlobalObject (jsLibPath, jsContext); if (globalJSObject != 0) { - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24)) { /* >= 24.x */ - boolean success = XPCOM.JS_EvaluateUCScriptForPrincipals24 (jsLibPath, jsContext, globalJSObject, principals, scriptChars, length, urlbytes, 0, 0) != 0; - // should principals be Release()d too? - new nsISupports (scriptGlobalObject).Release (); - principal.Release (); - serviceManager.Release (); - return success; - } - /* 1.9.x - 10.x */ aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_CONTEXTSTACK_CONTRACTID, true); rc = serviceManager.GetServiceByContractID (aContractID, IIDStore.GetIID (nsIJSContextStack.class), result); if (rc == XPCOM.NS_OK && result[0] != 0) { @@ -1810,6 +1872,8 @@ public Object getWebBrowser () { webBrowser.AddRef (); return webBrowserObject; } catch (ClassNotFoundException e) { + webBrowserObject = webBrowser; + return webBrowserObject; } catch (NoSuchMethodException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { @@ -1891,14 +1955,49 @@ static String InitDiscoverXULRunner () { void initExternal (String profilePath) { File componentsDir = new File (profilePath, AppFileLocProvider.COMPONENTS_DIR); - java.io.InputStream is = Library.class.getResourceAsStream ("/external.xpt"); //$NON-NLS-1$ + java.io.InputStream is = Library.class.getResourceAsStream ("/swt.xpt"); //$NON-NLS-1$ + if (is != null) { + if (!componentsDir.exists ()) { + componentsDir.mkdirs (); + } + int read; + byte [] buffer = new byte [4096]; + File file = new File (componentsDir, "swt.xpt"); //$NON-NLS-1$ + try { + FileOutputStream os = new FileOutputStream (file); + while ((read = is.read (buffer)) != -1) { + os.write(buffer, 0, read); + } + os.close (); + is.close (); + } catch (FileNotFoundException e) { + } catch (IOException e) { + } + } + is = Library.class.getResourceAsStream ("/swt.js"); //$NON-NLS-1$ if (is != null) { if (!componentsDir.exists ()) { componentsDir.mkdirs (); } int read; byte [] buffer = new byte [4096]; - File file = new File (componentsDir, "external.xpt"); //$NON-NLS-1$ + File file = new File (componentsDir, "swt.js"); //$NON-NLS-1$ + try { + FileOutputStream os = new FileOutputStream (file); + while ((read = is.read (buffer)) != -1) { + os.write(buffer, 0, read); + } + os.close (); + is.close (); + } catch (FileNotFoundException e) { + } catch (IOException e) { + } + } + is = Library.class.getResourceAsStream ("/chrome.manifest"); //$NON-NLS-1$ + if (is != null) { + int read; + byte [] buffer = new byte [4096]; + File file = new File (profilePath, "chrome.manifest"); //$NON-NLS-1$ try { FileOutputStream os = new FileOutputStream (file); while ((read = is.read (buffer)) != -1) { @@ -2177,9 +2276,6 @@ void initXPCOM (String mozillaPath, boolean isXULRunner) { error (XPCOM.NS_ERROR_NULL_POINTER); } - if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR24, true)) { - Library.loadLibrary("swt-xulrunner24"); //$NON-NLS-1$ - } MozillaDelegate.loadAdditionalLibraries (mozillaPath, true); if (MozillaVersion.CheckVersion (MozillaVersion.VERSION_XR10)) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/internal/mozilla/Execute.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/internal/mozilla/Execute.java new file mode 100644 index 0000000000..1b02ebe721 --- /dev/null +++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/internal/mozilla/Execute.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (c) 2014 Neil Rashbrook and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Neil Rashbrook <neil@parkwaycc.co.uk> - Bug 429739 + * Matthew Painter <matthew.painter@import.io> + *******************************************************************************/ +package org.eclipse.swt.internal.mozilla; + + +public class Execute extends nsISupports { + + static final int LAST_METHOD_ID = nsISupports.LAST_METHOD_ID + 3; + + static final String EXECUTE_IID_STR = "75a03044-d129-4d96-9292-bc1623876de1"; + + static { + IIDStore.RegisterIID(Execute.class, MozillaVersion.VERSION_BASE, new nsID(EXECUTE_IID_STR)); + } + + public Execute(long /*int*/ address) { + super(address); + } + + public int EvalInWindow(nsIDOMWindow aWindow, nsEmbedString code, long /*int*/[] aVariant) { + return XPCOM.VtblCall(nsISupports.LAST_METHOD_ID + 1, getAddress(), aWindow.getAddress(), code.getAddress(), aVariant); + } + + public int EvalAsChrome(nsIDOMWindow aWindow, nsEmbedString code, long /*int*/[] aVariant) { + return XPCOM.VtblCall(nsISupports.LAST_METHOD_ID + 2, getAddress(), aWindow.getAddress(), code.getAddress(), aVariant); + } + +} diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/internal/mozilla/XPCOM.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/internal/mozilla/XPCOM.java index d129f06aa9..876c89c39d 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/internal/mozilla/XPCOM.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/internal/mozilla/XPCOM.java @@ -22,7 +22,8 @@ * * IBM * - Binding to permit interfacing between Mozilla and SWT - * - Copyright (C) 2003, 2013 IBM Corp. All Rights Reserved. + * - Copyright (C) 2003, 2014 IBM Corp. All Rights Reserved. + * Neil Rashbrook <neil@parkwaycc.co.uk> - Bug 429739 * * ***** END LICENSE BLOCK ***** */ package org.eclipse.swt.internal.mozilla; @@ -92,6 +93,7 @@ public class XPCOM extends C { public static final nsID NS_IXPCSCRIPTABLE_IID = new nsID ("155d1863-2b0b-4f5e-b800-05184944156b"); //$NON-NLS-1$ /* contract ID constants */ + public static final String EXECUTE_CONTRACTID = "@eclipse.org/execute;1"; //$NON-NLS-1$ public static final String EXTERNAL_CONTRACTID = "@eclipse.org/external;1"; //$NON-NLS-1$ public static final String NS_AUTHPROMPTER_CONTRACTID = "@mozilla.org/passwordmanager/authpromptfactory;1"; //$NON-NLS-1$ public static final String NS_CERTOVERRIDE_CONTRACTID = "@mozilla.org/security/certoverride;1"; //$NON-NLS-1$ @@ -175,15 +177,6 @@ public class XPCOM extends C { public static final int SEC_ERROR_UNTRUSTED_CERT = 0x805A1FEB; public static final int SEC_ERROR_UNTRUSTED_ISSUER = 0x805A1FEC; public static final int SSL_ERROR_BAD_CERT_DOMAIN = 0x805A2FF4; - public static final int USE_JSSTUB_FOR_ADDPROPERTY = 1 << 17; - public static final int WANT_POSTCREATE = 4; - - /* JSAPI constants */ - public static final int JSPROP_ENUMERATE = 0x1; - public static final int JSPROP_PERMANENT = 0x4; - public static final int JSPROP_READONLY = 0x2; - public static final int JS_FALSE = 0x0; - public static final int JS_TRUE = 0x1; public static final native int nsDynamicFunctionLoad_sizeof (); @@ -234,27 +227,7 @@ public static final native long /*int*/ CALLBACK_GetScriptableFlags24(long /*int public static final native long /*int*/ CALLBACK_JSNative(long /*int*/ func); /** @method flags=no_gen */ -public static final native long /*int*/ _JS_DefineFunction(byte[] mozillaPath, long /*int*/ cx, long /*int*/ obj, byte[] name, long /*int*/ call, int nargs, int flags); -public static final long /*int*/ JS_DefineFunction(byte[] mozillaPath, long /*int*/ cx, long /*int*/ obj, byte[] name, long /*int*/ call, int nargs, int flags) { - lock.lock(); - try { - return _JS_DefineFunction(mozillaPath, cx, obj, name, call, nargs, flags); - } finally { - lock.unlock(); - } -} -/** @method flags=no_gen */ -public static final native long /*int*/ _JS_DefineFunction24(long /*int*/ cx, long /*int*/ obj, byte[] name, long /*int*/ call, int nargs, int flags); -public static final long /*int*/ JS_DefineFunction24(long /*int*/ cx, long /*int*/ obj, byte[] name, long /*int*/ call, int nargs, int flags) { - lock.lock(); - try { - return _JS_DefineFunction24(cx, obj, name, call, nargs, flags); - } finally { - lock.unlock(); - } -} -/** @method flags=no_gen */ -public static final native int _JS_EvaluateUCScriptForPrincipals(byte[] mozillaPath, long /*int*/ cx, long /*int*/ obj, long /*int*/ principals, char[] chars, int length, byte[] filename, int lineno, long /*int*/[] retVal); +public static final native int _JS_EvaluateUCScriptForPrincipals(byte[] mozillaPath, long /*int*/ cx, long /*int*/ obj, long /*int*/ principals, char[] chars, int length, byte[] filename, int lineno, long /*int*/[] retVal); public static final int JS_EvaluateUCScriptForPrincipals(byte[] mozillaPath, long /*int*/ cx, long /*int*/ obj, long /*int*/ principals, char[] chars, int length, byte[] filename, int lineno, long /*int*/[] retVal) { lock.lock(); try { @@ -274,27 +247,7 @@ public static final int JS_EvaluateUCScriptForPrincipals191(byte[] mozillaPath, } } /** @method flags=no_gen */ -public static final native int _JS_EvaluateUCScriptForPrincipals24(byte[] mozillaPath, long /*int*/ cx, long /*int*/ obj, long /*int*/ principals, char[] chars, int length, byte[] filename, int lineno, long /*int*/ retVal); -public static final int JS_EvaluateUCScriptForPrincipals24(byte[] mozillaPath, long /*int*/ cx, long /*int*/ obj, long /*int*/ principals, char[] chars, int length, byte[] filename, int lineno, long /*int*/ retVal) { - lock.lock(); - try { - return _JS_EvaluateUCScriptForPrincipals24(mozillaPath, cx, obj, principals, chars, length, filename, lineno, retVal); - } finally { - lock.unlock(); - } -} -/** @method flags=no_gen */ -public static final native long /*int*/ _JS_GetGlobalForScopeChain24(long /*int*/ cx); -public static final long /*int*/ JS_GetGlobalForScopeChain24(long /*int*/ cx) { - lock.lock(); - try { - return _JS_GetGlobalForScopeChain24(cx); - } finally { - lock.unlock(); - } -} -/** @method flags=no_gen */ -public static final native long /*int*/ _JS_GetGlobalObject(byte[] mozillaPath, long /*int*/ cx); +public static final native long /*int*/ _JS_GetGlobalObject(byte[] mozillaPath, long /*int*/ cx); public static final long /*int*/ JS_GetGlobalObject(byte[] mozillaPath, long /*int*/ cx) { lock.lock(); try { @@ -304,16 +257,6 @@ public static final long /*int*/ JS_GetGlobalObject(byte[] mozillaPath, long /*i } } /** @method flags=no_gen */ -public static final native long /*int*/ _JS_NewObject(byte[] mozillaPath, long /*int*/ cx, long /*int*/ clasp, long /*int*/ proto, long /*int*/ parent); -public static final long /*int*/ JS_NewObject(byte[] mozillaPath, long /*int*/ cx, long /*int*/ clasp, long /*int*/ proto, long /*int*/ parent) { - lock.lock(); - try { - return _JS_NewObject(mozillaPath, cx, clasp, proto, parent); - } finally { - lock.unlock(); - } -} -/** @method flags=no_gen */ public static final native boolean _NS_Free(byte[] mozillaPath, long /*int*/ aPtr); public static final boolean NS_Free(byte[] mozillaPath, long /*int*/ aPtr) { lock.lock(); @@ -445,26 +388,6 @@ public static final int nsIScriptGlobalObject_EnsureScriptEnvironment(long /*int lock.unlock(); } } -/** @method flags=no_gen */ -public static final native int _nsIScriptGlobalObject24_EnsureScriptEnvironment(long /*int*/ ptr); -public static final int nsIScriptGlobalObject24_EnsureScriptEnvironment(long /*int*/ ptr) { - lock.lock(); - try { - return _nsIScriptGlobalObject24_EnsureScriptEnvironment(ptr); - } finally { - lock.unlock(); - } -} -/** @method flags=no_gen */ -public static final native long /*int*/ _nsIScriptGlobalObject24_GetGlobalJSObject(long /*int*/ ptr); -public static final long /*int*/ nsIScriptGlobalObject24_GetGlobalJSObject(long /*int*/ ptr) { - lock.lock(); - try { - return _nsIScriptGlobalObject24_GetGlobalJSObject(ptr); - } finally { - lock.unlock(); - } -} /** * @method flags=cpp * @param ptr cast=(nsIScriptGlobalObject *) @@ -478,16 +401,6 @@ public static final long /*int*/ nsIScriptGlobalObject_GetScriptContext(long /*i lock.unlock(); } } -/** @method flags=no_gen */ -public static final native long /*int*/ _nsIScriptGlobalObject24_GetScriptContext(long /*int*/ ptr); -public static final long /*int*/ nsIScriptGlobalObject24_GetScriptContext(long /*int*/ ptr) { - lock.lock(); - try { - return _nsIScriptGlobalObject24_GetScriptContext(ptr); - } finally { - lock.unlock(); - } -} /** * @method flags=cpp * @param ptr cast=(nsIScriptContext *) @@ -501,16 +414,6 @@ public static final long /*int*/ nsIScriptContext_GetNativeContext(long /*int*/ lock.unlock(); } } -/** @method flags=no_gen */ -public static final native long /*int*/ _nsIScriptContext24_GetNativeContext(long /*int*/ ptr); -public static final long /*int*/ nsIScriptContext24_GetNativeContext(long /*int*/ ptr) { - lock.lock(); - try { - return _nsIScriptContext24_GetNativeContext(ptr); - } finally { - lock.unlock(); - } -} /** * @method flags=cpp * @param ptr cast=(nsEmbedCString *) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/build.sh b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/build.sh index b5a57c0484..a6cc5df227 100644..100755 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/build.sh +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/build.sh @@ -20,21 +20,22 @@ if [ "${GTK_VERSION}" = "" ]; then export GTK_VERSION fi -# Check if we have to compile external.xpt from external.idl -COMPONENTS_DIR=`pwd`/../../components -if test ! -f ${COMPONENTS_DIR}/external.xpt; then - if test ! -f ${COMPONENTS_DIR}/external.idl; then - echo "Can't find ${COMPONENTS_DIR}/external.idl" - else - IDLDIR=`pkg-config --variable=idldir libxul | sed 's@/stable$@@'`/unstable - if test ! -d ${IDLDIR}; then - IDLDIR=`pkg-config --variable=idldir libxul` - fi - XPIDL=`pkg-config --variable=sdkdir libxul`/bin/xpidl - echo "${XPIDL} -m typelib -I ${IDLDIR} -e ${COMPONENTS_DIR}/external.xpt ${COMPONENTS_DIR}/external.idl" - ${XPIDL} -m typelib -I ${IDLDIR} -e ${COMPONENTS_DIR}/external.xpt ${COMPONENTS_DIR}/external.idl - fi -fi +# No longer necessary, but may be useful in future if we want to compile swt.idl rather than using a static one +# +# COMPONENTS_DIR=`pwd`/../../components +# if test ! -f ${COMPONENTS_DIR}/external.xpt; then +# if test ! -f ${COMPONENTS_DIR}/external.idl; then +# echo "Can't find ${COMPONENTS_DIR}/external.idl" +# else +# IDLDIR=`pkg-config --variable=idldir libxul | sed 's@/stable$@@'`/unstable +# if test ! -d ${IDLDIR}; then +# IDLDIR=`pkg-config --variable=idldir libxul` +# fi +# XPIDL=`pkg-config --variable=sdkdir libxul`/bin/xpidl +# echo "${XPIDL} -m typelib -I ${IDLDIR} -e ${COMPONENTS_DIR}/external.xpt ${COMPONENTS_DIR}/external.idl" +# ${XPIDL} -m typelib -I ${IDLDIR} -e ${COMPONENTS_DIR}/external.xpt ${COMPONENTS_DIR}/external.idl +# fi +# fi # Determine which OS we are on if [ "${OS}" = "" ]; then diff --git a/bundles/org.eclipse.swt/components/chrome.manifest b/bundles/org.eclipse.swt/components/chrome.manifest new file mode 100644 index 0000000000..5421a52c1b --- /dev/null +++ b/bundles/org.eclipse.swt/components/chrome.manifest @@ -0,0 +1,3 @@ +interfaces components/swt.xpt +component {0aebcff1-f7b3-4522-a64b-1706d65dc232} components/swt.js +contract @eclipse.org/execute;1 {0aebcff1-f7b3-4522-a64b-1706d65dc232} diff --git a/bundles/org.eclipse.swt/components/external.xpt b/bundles/org.eclipse.swt/components/external.xpt Binary files differdeleted file mode 100644 index 88a803d220..0000000000 --- a/bundles/org.eclipse.swt/components/external.xpt +++ /dev/null diff --git a/bundles/org.eclipse.swt/components/external.idl b/bundles/org.eclipse.swt/components/swt.idl index 441fc09d82..744625c4fa 100644 --- a/bundles/org.eclipse.swt/components/external.idl +++ b/bundles/org.eclipse.swt/components/swt.idl @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008, 2011 IBM Corporation and others. + * Copyright (c) 2008, 2014 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -7,15 +7,25 @@ * * Contributors: * IBM Corporation - initial API and implementation + * Neil Rashbrook <neil@parkwaycc.co.uk> - Bug 429739 *******************************************************************************/ -// to compile: xpidl -m typelib -I S:\swt-builddir\gecko-sdk\idl\ -e external.xpt external.idl +// to compile: xpidl -m typelib -I S:\swt-builddir\gecko-sdk\idl\ -e swt.xpt swt.idl #include "nsISupports.idl" -#include "nsIVariant.idl" +interface nsIVariant; +interface nsIDOMWindow; [scriptable, uuid(ded01d20-ba6f-11dd-ad8b-0800200c9a66)] interface External : nsISupports { nsIVariant callJava (in unsigned long index, in nsIVariant token, in nsIVariant args); }; + +[scriptable, uuid(75a03044-d129-4d96-9292-bc1623876de1)] + +interface Execute : nsISupports { + nsIVariant evalInWindow (in nsIDOMWindow window, in AString code); + nsIVariant evalAsChrome (in nsIDOMWindow window, in AString code); + void evalAsync (in nsIDOMWindow window, in AString code); +}; diff --git a/bundles/org.eclipse.swt/components/swt.js b/bundles/org.eclipse.swt/components/swt.js new file mode 100644 index 0000000000..8b120b69de --- /dev/null +++ b/bundles/org.eclipse.swt/components/swt.js @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2014 Neil Rashbrook and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Neil Rashbrook <neil@parkwaycc.co.uk> - Bug 429739 + *******************************************************************************/ + +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + +function execute() { +} + +execute.prototype.evalInWindow = function(aWindow, aString) { + aWindow = XPCNativeWrapper.unwrap(aWindow); + try { + aWindow.external.QueryInterface(Components.interfaces.External); + } catch (e) { + aWindow.external = Components.classes["@eclipse.org/external;1"].createInstance(); + } + return aWindow.eval(aString); +}; + +execute.prototype.evalAsChrome = function(aWindow, aString) { + var window = XPCNativeWrapper.unwrap(aWindow); + return eval(aString); +}; + +execute.prototype.evalAsync = function(aWindow, aString) { + aWindow.location = "javascript:" + unescape(aString) + ";void(0);"; +}; + +execute.prototype.QueryInterface = XPCOMUtils.generateQI([Components.interfaces.Execute]); + +execute.prototype.classID = Components.ID("{0aebcff1-f7b3-4522-a64b-1706d65dc232}"); + +var NSGetFactory = XPCOMUtils.generateNSGetFactory([execute]); diff --git a/bundles/org.eclipse.swt/components/swt.xpt b/bundles/org.eclipse.swt/components/swt.xpt Binary files differnew file mode 100644 index 0000000000..6f6aca78e4 --- /dev/null +++ b/bundles/org.eclipse.swt/components/swt.xpt |
