aboutsummaryrefslogtreecommitdiffstats
path: root/plugin/icedteanp/java/sun/applet
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/icedteanp/java/sun/applet')
-rw-r--r--plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java51
-rw-r--r--plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java214
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java2244
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginAppletViewer.java981
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginMain.java190
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginObjectStore.java28
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginProxySelector.java47
7 files changed, 1878 insertions, 1877 deletions
diff --git a/plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java b/plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java
index 3820aa4..6e0defd 100644
--- a/plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java
+++ b/plugin/icedteanp/java/sun/applet/AppletSecurityContextManager.java
@@ -43,29 +43,30 @@ import java.util.HashMap;
public class AppletSecurityContextManager {
- // Context identifier -> PluginAppletSecurityContext object.
- // FIXME: make private
- private static HashMap<Integer, PluginAppletSecurityContext> contexts = new HashMap();
-
- public static void addContext(int identifier, PluginAppletSecurityContext context) {
- contexts.put(identifier, context);
- }
-
- public static PluginAppletSecurityContext getSecurityContext(int identifier) {
- return contexts.get(identifier);
- }
-
- public static void dumpStore(int identifier) {
- contexts.get(identifier).dumpStore();
- }
-
- public static void handleMessage(int identifier, int reference, String src, String[] privileges, String message) {
- PluginDebug.debug(identifier + " -- " + src + " -- " + reference + " -- " + message + " CONTEXT= " + contexts.get(identifier));
- AccessControlContext callContext = null;
-
- privileges = privileges != null ? privileges : new String[0];
- callContext = contexts.get(identifier).getAccessControlContext(privileges, src);
-
- contexts.get(identifier).handleMessage(reference, src, callContext, message);
- }
+ // Context identifier -> PluginAppletSecurityContext object.
+ // FIXME: make private
+ private static HashMap<Integer, PluginAppletSecurityContext> contexts =
+ new HashMap<Integer, PluginAppletSecurityContext>();
+
+ public static void addContext(int identifier, PluginAppletSecurityContext context) {
+ contexts.put(identifier, context);
+ }
+
+ public static PluginAppletSecurityContext getSecurityContext(int identifier) {
+ return contexts.get(identifier);
+ }
+
+ public static void dumpStore(int identifier) {
+ contexts.get(identifier).dumpStore();
+ }
+
+ public static void handleMessage(int identifier, int reference, String src, String[] privileges, String message) {
+ PluginDebug.debug(identifier + " -- " + src + " -- " + reference + " -- " + message + " CONTEXT= " + contexts.get(identifier));
+ AccessControlContext callContext = null;
+
+ privileges = privileges != null ? privileges : new String[0];
+ callContext = contexts.get(identifier).getAccessControlContext(privileges, src);
+
+ contexts.get(identifier).handleMessage(reference, src, callContext, message);
+ }
}
diff --git a/plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java b/plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java
index bb41e27..a1b3147 100644
--- a/plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java
+++ b/plugin/icedteanp/java/sun/applet/MethodOverloadResolver.java
@@ -1,5 +1,5 @@
/* MethodOverloadResolver -- Resolves overloaded methods
- Copyright (C) 2009 Red Hat
+ Copyright (C) 2009 Red Hat
This file is part of IcedTea.
@@ -42,8 +42,8 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
-/*
- * This class resolved overloaded methods in Java objects using a cost
+/*
+ * This class resolved overloaded methods in Java objects using a cost
* based-approach as described here:
*
* http://java.sun.com/javase/6/webnotes/6u10/plugin2/liveconnect/#OVERLOADED_METHODS
@@ -52,7 +52,7 @@ import java.util.ArrayList;
public class MethodOverloadResolver {
private static boolean debugging = false;
-
+
public static void main(String[] args) {
testMethodResolver();
}
@@ -62,7 +62,7 @@ public class MethodOverloadResolver {
ArrayList<Object[]> list = new ArrayList<Object[]>(20);
FooClass fc = new FooClass();
-
+
// Numeric to java primitive
// foo_i has Integer and int params
String s1 = "foo_string_int(S,I)";
@@ -71,13 +71,13 @@ public class MethodOverloadResolver {
list.add(o1);
Object[] o1a = { fc.getClass(), "foo_string_int", "blah", "42.42" };
list.add(o1a);
-
+
// Null to non-primitive type
- // foo_i is overloaded with Integer and int
+ // foo_i is overloaded with Integer and int
String s2 = "foo_string_int(N)";
Object[] o2 = { fc.getClass(), "foo_string_int", "blah", null };
list.add(o2);
-
+
// foo_jsobj is overloaded with JSObject and String params
String s3 = "foo_jsobj(LLowCostSignatureComputer/JSObject;)";
Object[] o3 = { fc.getClass(), "foo_jsobj", new JSObject() };
@@ -87,19 +87,19 @@ public class MethodOverloadResolver {
String s4 = "foo_classtype(Ljava/lang/Integer;)";
Object[] o4 = { fc.getClass(), "foo_classtype", 42 };
list.add(o4);
-
+
// foo_multiprim is overloaded with int, long and float types
String s5 = "foo_multiprim(I)";
String s6 = "foo_multiprim(F)";
String s6a = "foo_multiprim(D)";
-
+
Object[] o5 = { fc.getClass(), "foo_multiprim", new Integer(42) };
Object[] o6 = { fc.getClass(), "foo_multiprim", new Float(42.42) };
Object[] o6a = { fc.getClass(), "foo_multiprim", new Double(42.42) };
list.add(o5);
list.add(o6);
list.add(o6a);
-
+
// foo_float has float, String and JSObject type
String s7 = "foo_float(I)";
Object[] o7 = { fc.getClass(), "foo_float", new Integer(42) };
@@ -109,7 +109,7 @@ public class MethodOverloadResolver {
String s8 = "foo_float(S)";
Object[] o8 = { fc.getClass(), "foo_float", "42" };
list.add(o8);
-
+
// foo_class is overloaded with BarClass 2 and 3
String s9 = "foo_class(LLowCostSignatureComputer/BarClass3;)";
Object[] o9 = { fc.getClass(), "foo_class", new BarClass3() };
@@ -129,17 +129,17 @@ public class MethodOverloadResolver {
String s12 = "foo_str_and_float(S,I)";
Object[] o12 = { fc.getClass(), "foo_str_and_float", new JSObject(), new Integer(42) };
list.add(o12);
-
+
// call for which no match will be found
String s13 = "foo_int_only(JSObject)";
Object[] o13 = { fc.getClass(), "foo_int_only", new JSObject() };
list.add(o13);
-
+
// method with no args
String s14 = "foo_noargs()";
Object[] o14 = { fc.getClass(), "foo_noargs" };
list.add(o14);
-
+
// method which takes a primitive bool, given a Boolean
String s15 = "foo_boolonly()";
Object[] o15 = { fc.getClass(), "foo_boolonly", new Boolean(true) };
@@ -152,24 +152,24 @@ public class MethodOverloadResolver {
System.out.println("Best match: " + methodAndArgs[0] + "\n");
else
System.out.println("No match found.\n");
-
+
}
-
+
}
- /*
+ /*
* Cost based overload resolution algorithm based on cost rules specified here:
- *
+ *
* http://java.sun.com/javase/6/webnotes/6u10/plugin2/liveconnect/#OVERLOADED_METHODS
*/
public static Object[] getMatchingMethod(Object[] callList) {
Object[] ret = null;
- Class c = (Class) callList[0];
+ Class<?> c = (Class<?>) callList[0];
String methodName = (String) callList[1];
Method[] matchingMethods = getMatchingMethods(c, methodName, callList.length - 2);
-
+
if (debugging)
System.out.println("getMatchingMethod called with: " + printList(callList));
@@ -187,23 +187,23 @@ public class MethodOverloadResolver {
// Figure out which of the matched methods best represents what we
// want
for (int i = 0; i < paramTypes.length; i++) {
- Class paramTypeClass = paramTypes[i];
+ Class<?> paramTypeClass = paramTypes[i];
Object suppliedParam = callList[i + 2];
- Class suppliedParamClass = suppliedParam != null ? suppliedParam
+ Class<?> suppliedParamClass = suppliedParam != null ? suppliedParam
.getClass()
: null;
Object[] costAndCastedObj = getCostAndCastedObject(
suppliedParam, paramTypeClass);
methodCost += (Integer) costAndCastedObj[0];
-
+
if ((Integer) costAndCastedObj[0] < 0) break;
-
+
Object castedObj = paramTypeClass.isPrimitive() ? costAndCastedObj[1]
: paramTypeClass.cast(costAndCastedObj[1]);
methodAndArgs[i + 1] = castedObj;
- Class castedObjClass = castedObj == null ? null : castedObj
+ Class<?> castedObjClass = castedObj == null ? null : castedObj
.getClass();
Boolean castedObjIsPrim = castedObj == null ? null : castedObj
.getClass().isPrimitive();
@@ -217,7 +217,7 @@ public class MethodOverloadResolver {
+ castedObjIsPrim + " value " + castedObj);
}
- if ((methodCost > 0 && methodCost < lowestCost) ||
+ if ((methodCost > 0 && methodCost < lowestCost) ||
paramTypes.length == 0) {
ret = methodAndArgs;
lowestCost = methodCost;
@@ -230,10 +230,10 @@ public class MethodOverloadResolver {
public static Object[] getMatchingConstructor(Object[] callList) {
Object[] ret = null;
- Class c = (Class) callList[0];
+ Class<?> c = (Class<?>) callList[0];
Constructor[] matchingConstructors = getMatchingConstructors(c, callList.length - 1);
-
+
if (debugging)
System.out.println("getMatchingConstructor called with: " + printList(callList));
@@ -244,14 +244,14 @@ public class MethodOverloadResolver {
for (Constructor matchingConstructor : matchingConstructors) {
int constructorCost = 0;
- Class[] paramTypes = matchingConstructor.getParameterTypes();
+ Class<?>[] paramTypes = matchingConstructor.getParameterTypes();
Object[] constructorAndArgs = new Object[paramTypes.length + 1];
constructorAndArgs[0] = matchingConstructor;
// Figure out which of the matched methods best represents what we
// want
for (int i = 0; i < paramTypes.length; i++) {
- Class paramTypeClass = paramTypes[i];
+ Class<?> paramTypeClass = paramTypes[i];
Object suppliedParam = callList[i + 1];
Class suppliedParamClass = suppliedParam != null ? suppliedParam
.getClass()
@@ -260,14 +260,14 @@ public class MethodOverloadResolver {
Object[] costAndCastedObj = getCostAndCastedObject(
suppliedParam, paramTypeClass);
constructorCost += (Integer) costAndCastedObj[0];
-
+
if ((Integer) costAndCastedObj[0] < 0) break;
-
+
Object castedObj = paramTypeClass.isPrimitive() ? costAndCastedObj[1]
: paramTypeClass.cast(costAndCastedObj[1]);
constructorAndArgs[i + 1] = castedObj;
- Class castedObjClass = castedObj == null ? null : castedObj
+ Class<?> castedObjClass = castedObj == null ? null : castedObj
.getClass();
Boolean castedObjIsPrim = castedObj == null ? null : castedObj
.getClass().isPrimitive();
@@ -281,7 +281,7 @@ public class MethodOverloadResolver {
+ castedObjIsPrim + " value " + castedObj);
}
- if ((constructorCost > 0 && constructorCost < lowestCost) ||
+ if ((constructorCost > 0 && constructorCost < lowestCost) ||
paramTypes.length == 0) {
ret = constructorAndArgs;
lowestCost = constructorCost;
@@ -291,20 +291,20 @@ public class MethodOverloadResolver {
return ret;
}
- public static Object[] getCostAndCastedObject(Object suppliedParam, Class paramTypeClass) {
-
+ public static Object[] getCostAndCastedObject(Object suppliedParam, Class<?> paramTypeClass) {
+
Object[] ret = new Object[2];
Integer cost = new Integer(0);
Object castedObj;
- Class suppliedParamClass = suppliedParam != null ? suppliedParam.getClass() : null ;
-
+ Class<?> suppliedParamClass = suppliedParam != null ? suppliedParam.getClass() : null ;
+
// Either both are an array, or neither are
boolean suppliedParamIsArray = suppliedParamClass != null && suppliedParamClass.isArray();
- if (paramTypeClass.isArray() != suppliedParamIsArray &&
+ if (paramTypeClass.isArray() != suppliedParamIsArray &&
!paramTypeClass.equals(Object.class) &&
!paramTypeClass.equals(String.class)) {
- ret[0] = Integer.MIN_VALUE; // Not allowed
+ ret[0] = Integer.MIN_VALUE; // Not allowed
ret[1] = suppliedParam;
return ret;
}
@@ -315,37 +315,37 @@ public class MethodOverloadResolver {
// If it is a string, we need to convert according to the JS engine rules
if (paramTypeClass.isArray()) {
-
+
Object newArray = Array.newInstance(paramTypeClass.getComponentType(), Array.getLength(suppliedParam));
for (int i=0; i < Array.getLength(suppliedParam); i++) {
- Object original = Array.get(suppliedParam, i);
-
- // When dealing with arrays, we represent empty slots with
- // null. We need to convert this to 0 before recursive
- // calling, since normal transformation does not allow
- // null -> primitive
-
- if (original == null && paramTypeClass.getComponentType().isPrimitive())
- original = 0;
-
- Object[] costAndCastedObject = getCostAndCastedObject(original, paramTypeClass.getComponentType());
-
- if ((Integer) costAndCastedObject[0] < 0) {
- ret[0] = Integer.MIN_VALUE; // Not allowed
+ Object original = Array.get(suppliedParam, i);
+
+ // When dealing with arrays, we represent empty slots with
+ // null. We need to convert this to 0 before recursive
+ // calling, since normal transformation does not allow
+ // null -> primitive
+
+ if (original == null && paramTypeClass.getComponentType().isPrimitive())
+ original = 0;
+
+ Object[] costAndCastedObject = getCostAndCastedObject(original, paramTypeClass.getComponentType());
+
+ if ((Integer) costAndCastedObject[0] < 0) {
+ ret[0] = Integer.MIN_VALUE; // Not allowed
ret[1] = suppliedParam;
return ret;
- }
+ }
- Array.set(newArray, i, costAndCastedObject[1]);
+ Array.set(newArray, i, costAndCastedObject[1]);
}
-
+
ret[0] = 9;
ret[1] = newArray;
return ret;
}
-
+
if (suppliedParamIsArray && paramTypeClass.equals(String.class)) {
-
+
ret[0] = 9;
ret[1] = getArrayAsString(suppliedParam);
return ret;
@@ -366,7 +366,7 @@ public class MethodOverloadResolver {
} else if (suppliedParamClass.equals(paramTypeClass)) {
cost += 3; // Class type to Class type where the types are equal
castedObj = suppliedParam;
- } else if (isNum(suppliedParam) &&
+ } else if (isNum(suppliedParam) &&
(paramTypeClass.isPrimitive() ||
java.lang.Number.class.isAssignableFrom(paramTypeClass) ||
java.lang.Character.class.isAssignableFrom(paramTypeClass) ||
@@ -379,7 +379,7 @@ public class MethodOverloadResolver {
suppliedParam = "1";
else if (suppliedParam.toString().equals("false"))
suppliedParam = "0";
-
+
if (paramTypeClass.equals(Boolean.TYPE))
castedObj = getNum(suppliedParam.toString(), paramTypeClass).doubleValue() != 0D;
else if (paramTypeClass.equals(Character.TYPE))
@@ -394,12 +394,12 @@ public class MethodOverloadResolver {
paramTypeClass.isPrimitive())
) {
cost += 5; // String to numeric type
-
+
if (suppliedParam.toString().equals("true"))
suppliedParam = "1";
else if (suppliedParam.toString().equals("false"))
suppliedParam = "0";
-
+
if (paramTypeClass.equals(Character.TYPE))
castedObj = (char) Short.decode(suppliedParam.toString()).shortValue();
else
@@ -419,24 +419,24 @@ public class MethodOverloadResolver {
castedObj = suppliedParam.toString();
} else if (suppliedParam instanceof JSObject &&
paramTypeClass.isArray()) {
- cost += 8; // JSObject to Java array
+ cost += 8; // JSObject to Java array
castedObj = (JSObject) suppliedParam;
} else {
cost = Integer.MIN_VALUE; // Not allowed
castedObj = suppliedParam;
}
-
+
ret[0] = cost;
ret[1] = castedObj;
return ret;
}
-
- private static Method[] getMatchingMethods(Class c, String name, int paramCount) {
+
+ private static Method[] getMatchingMethods(Class<?> c, String name, int paramCount) {
Method[] allMethods = c.getMethods();
- ArrayList<Method> matchingMethods = new ArrayList(5);
-
+ ArrayList<Method> matchingMethods = new ArrayList<Method>(5);
+
for (Method m: allMethods) {
if (m.getName().equals(name) && m.getParameterTypes().length == paramCount)
matchingMethods.add(m);
@@ -444,11 +444,11 @@ public class MethodOverloadResolver {
return matchingMethods.toArray(new Method[0]);
}
-
- private static Constructor[] getMatchingConstructors(Class c, int paramCount) {
+
+ private static Constructor[] getMatchingConstructors(Class<?> c, int paramCount) {
Constructor[] allConstructors = c.getConstructors();
ArrayList<Constructor> matchingConstructors = new ArrayList<Constructor>(5);
-
+
for (Constructor cs: allConstructors) {
if (cs.getParameterTypes().length == paramCount)
matchingConstructors.add(cs);
@@ -458,7 +458,7 @@ public class MethodOverloadResolver {
}
private static Class getPrimitive(Object o) {
-
+
if (o instanceof java.lang.Byte) {
return java.lang.Byte.TYPE;
} else if (o instanceof java.lang.Character) {
@@ -481,15 +481,15 @@ public class MethodOverloadResolver {
}
private static boolean isNum (Object o) {
-
+
if (o instanceof java.lang.Number)
return true;
-
+
// Boolean is changeable to number as well
if (o instanceof java.lang.Boolean)
return true;
- // At this point, it _has_ to be a string else automatically
+ // At this point, it _has_ to be a string else automatically
// return false
if (!(o instanceof java.lang.String))
return false;
@@ -498,24 +498,24 @@ public class MethodOverloadResolver {
Long.parseLong((String) o); // whole number test
return true;
} catch (NumberFormatException nfe) {}
-
+
try {
Float.parseFloat((String) o); // decimal
return true;
} catch (NumberFormatException nfe) {}
-
+
return false;
}
- private static Number getNum (String s, Class c) throws NumberFormatException {
+ private static Number getNum (String s, Class<?> c) throws NumberFormatException {
Number n;
if (s.contains("."))
n = new Double(s);
else
n = new Long(s);
-
+
// See if we need to collapse first
if (c.equals(java.lang.Integer.class) ||
c.equals(java.lang.Integer.TYPE)) {
@@ -531,12 +531,12 @@ public class MethodOverloadResolver {
c.equals(java.lang.Short.TYPE)) {
return n.shortValue();
}
-
+
if (c.equals(java.lang.Float.class) ||
c.equals(java.lang.Float.TYPE)) {
return n.floatValue();
}
-
+
if (c.equals(java.lang.Double.class) ||
c.equals(java.lang.Double.TYPE)) {
return n.doubleValue();
@@ -551,14 +551,14 @@ public class MethodOverloadResolver {
}
private static String printList (Object[] oList) {
-
+
String ret = "";
-
+
ret += "{ ";
for (Object o : oList) {
-
+
String oStr = o != null ? o.toString() + " [" + o.getClass() + "]" : "null";
-
+
ret += oStr;
ret += ", ";
}
@@ -567,15 +567,15 @@ public class MethodOverloadResolver {
return ret;
}
-
+
private static String getArrayAsString(Object array) {
// We are guaranteed that supplied object is a String
-
+
String ret = new String();
-
+
for (int i=0; i < Array.getLength(array); i++) {
Object element = Array.get(array, i);
-
+
if (element != null) {
if (element.getClass().isArray()) {
ret += getArrayAsString(element);
@@ -583,7 +583,7 @@ public class MethodOverloadResolver {
ret += element;
}
}
-
+
ret += ",";
}
@@ -591,7 +591,7 @@ public class MethodOverloadResolver {
if (ret.length() > 0) {
ret = ret.substring(0, ret.length() - 1);
}
-
+
return ret;
}
}
@@ -601,7 +601,7 @@ public class MethodOverloadResolver {
class FooClass {
public FooClass() {}
-
+
public FooClass(Boolean b, int i) {}
public FooClass(Boolean b, Integer i) {}
@@ -621,7 +621,7 @@ class FooClass {
public FooClass(double d) {}
public FooClass(float f) {}
-
+
public FooClass(JSObject j) {}
public FooClass(BarClass1 b) {}
@@ -629,18 +629,18 @@ class FooClass {
public FooClass(BarClass2 b) {}
public FooClass(String s) {}
-
+
public FooClass(byte b) {}
-
+
public FooClass(String s, Float f) {}
-
+
public FooClass (int i) {}
public void FooClass() {}
public void FooClass(boolean b) {}
-
+
public void foo(Boolean b, int i) {}
public void foo(Boolean b, Integer i) {}
@@ -664,13 +664,13 @@ class FooClass {
public void foo_multiprim(long l) {}
public void foo_multiprim(float f) {}
-
+
public void foo_multiprim(double d) {}
public void foo_float(float f) {}
-
+
public void foo_float(String s) {}
-
+
public void foo_float(JSObject j) {}
public void foo_class(BarClass1 b) {}
@@ -678,13 +678,13 @@ class FooClass {
public void foo_class(BarClass2 b) {}
public void foo_strandbyteonly(String s) {}
-
+
public void foo_strandbyteonly(byte b) {}
-
+
public void foo_str_and_float(String s, Float f) {}
-
+
public void foo_int_only (int i) {}
-
+
public void foo_noargs() {}
public void foo_boolonly(boolean b) {}
diff --git a/plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java b/plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java
index eb68371..e2db130 100644
--- a/plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java
+++ b/plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java
@@ -1,5 +1,5 @@
/* PluginAppletSecurityContext -- execute plugin JNI messages
- Copyright (C) 2008 Red Hat
+ Copyright (C) 2008, 2010 Red Hat
This file is part of IcedTea.
@@ -67,377 +67,377 @@ import netscape.javascript.JSObjectCreatePermission;
class Signature {
- private String signature;
- private int currentIndex;
- private List<Class> typeList;
- private static final char ARRAY = '[';
- private static final char OBJECT = 'L';
- private static final char SIGNATURE_ENDCLASS = ';';
- private static final char SIGNATURE_FUNC = '(';
- private static final char SIGNATURE_ENDFUNC = ')';
- private static final char VOID = 'V';
- private static final char BOOLEAN = 'Z';
- private static final char BYTE = 'B';
- private static final char CHARACTER = 'C';
- private static final char SHORT = 'S';
- private static final char INTEGER = 'I';
- private static final char LONG = 'J';
- private static final char FLOAT = 'F';
- private static final char DOUBLE = 'D';
-
- private String nextTypeName() {
- char key = signature.charAt(currentIndex++);
-
- switch (key) {
- case ARRAY:
- return nextTypeName() + "[]";
-
- case OBJECT:
- int endClass = signature.indexOf(SIGNATURE_ENDCLASS, currentIndex);
- String retVal = signature.substring(currentIndex, endClass);
- retVal = retVal.replace('/', '.');
- currentIndex = endClass + 1;
- return retVal;
-
- // FIXME: generated bytecode with classes named after
- // primitives will not work in this scheme -- those
- // classes will be incorrectly treated as primitive
- // types.
- case VOID:
- return "void";
- case BOOLEAN:
- return "boolean";
- case BYTE:
- return "byte";
- case CHARACTER:
- return "char";
- case SHORT:
- return "short";
- case INTEGER:
- return "int";
- case LONG:
- return "long";
- case FLOAT:
- return "float";
- case DOUBLE:
- return "double";
-
- case SIGNATURE_ENDFUNC:
- return null;
-
- case SIGNATURE_FUNC:
- return nextTypeName();
-
- default:
- throw new IllegalArgumentException(
- "Invalid JNI signature character '" + key + "'");
- }
- }
-
- public Signature(String signature, ClassLoader cl) {
- this.signature = signature;
- currentIndex = 0;
- typeList = new ArrayList<Class>(10);
-
- String elem;
- while (currentIndex < signature.length()) {
- elem = nextTypeName();
-
- if (elem == null) // end of signature
- continue;
-
- // System.out.println ("NEXT TYPE: " + elem);
- Class primitive = primitiveNameToType(elem);
- if (primitive != null)
- typeList.add(primitive);
- else {
- // System.out.println ("HERE1");
- int dimsize = 0;
- int n = elem.indexOf('[');
- if (n != -1) {
- // System.out.println ("HERE2");
- String arrayType = elem.substring(0, n);
- dimsize++;
- n = elem.indexOf('[', n + 1);
- // System.out.println ("HERE2.5");
- while (n != -1) {
- dimsize++;
- n = elem.indexOf('[', n + 1);
- // System.out.println ("HERE2.8");
- }
- int[] dims = new int[dimsize];
- primitive = primitiveNameToType(arrayType);
- // System.out.println ("HERE3");
- if (primitive != null) {
- typeList.add(Array.newInstance(primitive, dims)
- .getClass());
- // System.out.println ("HERE4");
- } else
- typeList.add(Array.newInstance(
- getClass(arrayType, cl), dims).getClass());
- } else {
- typeList.add(getClass(elem, cl));
- }
- }
- }
- if (signature.length() < 2) {
- throw new IllegalArgumentException("Invalid JNI signature '"
- + signature + "'");
- }
- }
-
- public static Class getClass(String name, ClassLoader cl) {
-
- Class c = null;
-
- try {
- c = Class.forName(name);
- } catch (ClassNotFoundException cnfe) {
-
- PluginDebug.debug("Class " + name + " not found in primordial loader. Looking in " + cl);
- try {
- c = cl.loadClass(name);
- } catch (ClassNotFoundException e) {
- throw (new RuntimeException(new ClassNotFoundException("Unable to find class " + name)));
- }
- }
-
- return c;
- }
-
- public static Class primitiveNameToType(String name) {
- if (name.equals("void"))
- return Void.TYPE;
- else if (name.equals("boolean"))
- return Boolean.TYPE;
- else if (name.equals("byte"))
- return Byte.TYPE;
- else if (name.equals("char"))
- return Character.TYPE;
- else if (name.equals("short"))
- return Short.TYPE;
- else if (name.equals("int"))
- return Integer.TYPE;
- else if (name.equals("long"))
- return Long.TYPE;
- else if (name.equals("float"))
- return Float.TYPE;
- else if (name.equals("double"))
- return Double.TYPE;
- else
- return null;
- }
-
- public Class[] getClassArray() {
- return typeList.subList(0, typeList.size()).toArray(new Class[] {});
- }
+ private String signature;
+ private int currentIndex;
+ private List<Class> typeList;
+ private static final char ARRAY = '[';
+ private static final char OBJECT = 'L';
+ private static final char SIGNATURE_ENDCLASS = ';';
+ private static final char SIGNATURE_FUNC = '(';
+ private static final char SIGNATURE_ENDFUNC = ')';
+ private static final char VOID = 'V';
+ private static final char BOOLEAN = 'Z';
+ private static final char BYTE = 'B';
+ private static final char CHARACTER = 'C';
+ private static final char SHORT = 'S';
+ private static final char INTEGER = 'I';
+ private static final char LONG = 'J';
+ private static final char FLOAT = 'F';
+ private static final char DOUBLE = 'D';
+
+ private String nextTypeName() {
+ char key = signature.charAt(currentIndex++);
+
+ switch (key) {
+ case ARRAY:
+ return nextTypeName() + "[]";
+
+ case OBJECT:
+ int endClass = signature.indexOf(SIGNATURE_ENDCLASS, currentIndex);
+ String retVal = signature.substring(currentIndex, endClass);
+ retVal = retVal.replace('/', '.');
+ currentIndex = endClass + 1;
+ return retVal;
+
+ // FIXME: generated bytecode with classes named after
+ // primitives will not work in this scheme -- those
+ // classes will be incorrectly treated as primitive
+ // types.
+ case VOID:
+ return "void";
+ case BOOLEAN:
+ return "boolean";
+ case BYTE:
+ return "byte";
+ case CHARACTER:
+ return "char";
+ case SHORT:
+ return "short";
+ case INTEGER:
+ return "int";
+ case LONG:
+ return "long";
+ case FLOAT:
+ return "float";
+ case DOUBLE:
+ return "double";
+
+ case SIGNATURE_ENDFUNC:
+ return null;
+
+ case SIGNATURE_FUNC:
+ return nextTypeName();
+
+ default:
+ throw new IllegalArgumentException(
+ "Invalid JNI signature character '" + key + "'");
+ }
+ }
+
+ public Signature(String signature, ClassLoader cl) {
+ this.signature = signature;
+ currentIndex = 0;
+ typeList = new ArrayList<Class>(10);
+
+ String elem;
+ while (currentIndex < signature.length()) {
+ elem = nextTypeName();
+
+ if (elem == null) // end of signature
+ continue;
+
+ // System.out.println ("NEXT TYPE: " + elem);
+ Class primitive = primitiveNameToType(elem);
+ if (primitive != null)
+ typeList.add(primitive);
+ else {
+ // System.out.println ("HERE1");
+ int dimsize = 0;
+ int n = elem.indexOf('[');
+ if (n != -1) {
+ // System.out.println ("HERE2");
+ String arrayType = elem.substring(0, n);
+ dimsize++;
+ n = elem.indexOf('[', n + 1);
+ // System.out.println ("HERE2.5");
+ while (n != -1) {
+ dimsize++;
+ n = elem.indexOf('[', n + 1);
+ // System.out.println ("HERE2.8");
+ }
+ int[] dims = new int[dimsize];
+ primitive = primitiveNameToType(arrayType);
+ // System.out.println ("HERE3");
+ if (primitive != null) {
+ typeList.add(Array.newInstance(primitive, dims)
+ .getClass());
+ // System.out.println ("HERE4");
+ } else
+ typeList.add(Array.newInstance(
+ getClass(arrayType, cl), dims).getClass());
+ } else {
+ typeList.add(getClass(elem, cl));
+ }
+ }
+ }
+ if (signature.length() < 2) {
+ throw new IllegalArgumentException("Invalid JNI signature '"
+ + signature + "'");
+ }
+ }
+
+ public static Class getClass(String name, ClassLoader cl) {
+
+ Class c = null;
+
+ try {
+ c = Class.forName(name);
+ } catch (ClassNotFoundException cnfe) {
+
+ PluginDebug.debug("Class " + name + " not found in primordial loader. Looking in " + cl);
+ try {
+ c = cl.loadClass(name);
+ } catch (ClassNotFoundException e) {
+ throw (new RuntimeException(new ClassNotFoundException("Unable to find class " + name)));
+ }
+ }
+
+ return c;
+ }
+
+ public static Class primitiveNameToType(String name) {
+ if (name.equals("void"))
+ return Void.TYPE;
+ else if (name.equals("boolean"))
+ return Boolean.TYPE;
+ else if (name.equals("byte"))
+ return Byte.TYPE;
+ else if (name.equals("char"))
+ return Character.TYPE;
+ else if (name.equals("short"))
+ return Short.TYPE;
+ else if (name.equals("int"))
+ return Integer.TYPE;
+ else if (name.equals("long"))
+ return Long.TYPE;
+ else if (name.equals("float"))
+ return Float.TYPE;
+ else if (name.equals("double"))
+ return Double.TYPE;
+ else
+ return null;
+ }
+
+ public Class[] getClassArray() {
+ return typeList.subList(0, typeList.size()).toArray(new Class[] {});
+ }
}
public class PluginAppletSecurityContext {
-
- private static Hashtable<ClassLoader, URL> classLoaders = new Hashtable<ClassLoader, URL>();
- private static Hashtable<Integer, ClassLoader> instanceClassLoaders = new Hashtable<Integer, ClassLoader>();
-
- // FIXME: make private
- public PluginObjectStore store = new PluginObjectStore();
- private Throwable throwable = null;
- private ClassLoader liveconnectLoader = ClassLoader.getSystemClassLoader();
- int identifier = 0;
-
- public static PluginStreamHandler streamhandler;
-
- long startTime = 0;
-
- public PluginAppletSecurityContext(int identifier) {
- this.identifier = identifier;
-
- // We need a security manager.. and since there is a good chance that
- // an applet will be loaded at some point, we should make it the SM
- // that JNLPRuntime will try to install
- if (System.getSecurityManager() == null) {
- JNLPRuntime.initialize(/* isApplication */ false);
- }
-
- JNLPRuntime.disableExit();
-
- URL u = null;
- try {
- u = new URL("file://");
- } catch (Exception e) {
- e.printStackTrace();
- }
-
-
- this.classLoaders.put(liveconnectLoader, u);
- }
-
- private static <V> V parseCall(String s, ClassLoader cl, Class<V> c) {
- if (c == Integer.class)
- return (V) new Integer(s);
- else if (c == String.class)
- return (V) new String(s);
- else if (c == Signature.class)
- return (V) new Signature(s, cl);
- else
- throw new RuntimeException("Unexpected call value.");
- }
-
- private Object parseArgs(String s, Class c) {
- if (c == Boolean.TYPE || c == Boolean.class)
- return new Boolean(s);
- else if (c == Byte.TYPE || c == Byte.class)
- return new Byte(s);
- else if (c == Character.TYPE || c == Character.class) {
- String[] bytes = s.split("_");
- int low = Integer.parseInt(bytes[0]);
- int high = Integer.parseInt(bytes[1]);
- int full = ((high << 8) & 0x0ff00) | (low & 0x0ff);
- return new Character((char) full);
- } else if (c == Short.TYPE || c == Short.class)
- return new Short(s);
- else if (c == Integer.TYPE || c == Integer.class)
- return new Integer(s);
- else if (c == Long.TYPE || c == Long.class)
- return new Long(s);
- else if (c == Float.TYPE || c == Float.class)
- return new Float(s);
- else if (c == Double.TYPE || c == Double.class)
- return new Double(s);
- else
- return store.getObject(new Integer(s));
- }
-
- public void associateSrc(ClassLoader cl, URL src) {
- PluginDebug.debug("Associating " + cl + " with " + src);
- this.classLoaders.put(cl, src);
- }
-
+
+ private static Hashtable<ClassLoader, URL> classLoaders = new Hashtable<ClassLoader, URL>();
+ private static Hashtable<Integer, ClassLoader> instanceClassLoaders = new Hashtable<Integer, ClassLoader>();
+
+ // FIXME: make private
+ public PluginObjectStore store = new PluginObjectStore();
+ private Throwable throwable = null;
+ private ClassLoader liveconnectLoader = ClassLoader.getSystemClassLoader();
+ int identifier = 0;
+
+ public static PluginStreamHandler streamhandler;
+
+ long startTime = 0;
+
+ public PluginAppletSecurityContext(int identifier) {
+ this.identifier = identifier;
+
+ // We need a security manager.. and since there is a good chance that
+ // an applet will be loaded at some point, we should make it the SM
+ // that JNLPRuntime will try to install
+ if (System.getSecurityManager() == null) {
+ JNLPRuntime.initialize(/* isApplication */ false);
+ }
+
+ JNLPRuntime.disableExit();
+
+ URL u = null;
+ try {
+ u = new URL("file://");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
+ this.classLoaders.put(liveconnectLoader, u);
+ }
+
+ private static <V> V parseCall(String s, ClassLoader cl, Class<V> c) {
+ if (c == Integer.class)
+ return c.cast(new Integer(s));
+ else if (c == String.class)
+ return c.cast(new String(s));
+ else if (c == Signature.class)
+ return c.cast(new Signature(s, cl));
+ else
+ throw new RuntimeException("Unexpected call value.");
+ }
+
+ private Object parseArgs(String s, Class c) {
+ if (c == Boolean.TYPE || c == Boolean.class)
+ return new Boolean(s);
+ else if (c == Byte.TYPE || c == Byte.class)
+ return new Byte(s);
+ else if (c == Character.TYPE || c == Character.class) {
+ String[] bytes = s.split("_");
+ int low = Integer.parseInt(bytes[0]);
+ int high = Integer.parseInt(bytes[1]);
+ int full = ((high << 8) & 0x0ff00) | (low & 0x0ff);
+ return new Character((char) full);
+ } else if (c == Short.TYPE || c == Short.class)
+ return new Short(s);
+ else if (c == Integer.TYPE || c == Integer.class)
+ return new Integer(s);
+ else if (c == Long.TYPE || c == Long.class)
+ return new Long(s);
+ else if (c == Float.TYPE || c == Float.class)
+ return new Float(s);
+ else if (c == Double.TYPE || c == Double.class)
+ return new Double(s);
+ else
+ return store.getObject(new Integer(s));
+ }
+
+ public void associateSrc(ClassLoader cl, URL src) {
+ PluginDebug.debug("Associating " + cl + " with " + src);
+ this.classLoaders.put(cl, src);
+ }
+
public void associateInstance(Integer i, ClassLoader cl) {
PluginDebug.debug("Associating " + cl + " with instance " + i);
this.instanceClassLoaders.put(i, cl);
}
- public static void setStreamhandler(PluginStreamHandler sh) {
- streamhandler = sh;
- }
-
- public static Map<String, String> getLoaderInfo() {
- Hashtable<String, String> map = new Hashtable<String, String>();
-
- for (ClassLoader loader : PluginAppletSecurityContext.classLoaders.keySet()) {
- map.put(loader.getClass().getName(), classLoaders.get(loader).toString());
- }
-
- return map;
- }
-
- public void handleMessage(int reference, String src, AccessControlContext callContext, String message) {
-
- startTime = new java.util.Date().getTime();
-
- try {
- if (message.startsWith("FindClass")) {
- ClassLoader cl = null;
- Class c = null;
- cl = liveconnectLoader;
- String[] args = message.split(" ");
- Integer instance = new Integer(args[1]);
- String className = args[2].replace('/', '.');
- PluginDebug.debug("Searching for class " + className + " in " + cl);
-
- try {
- c = cl.loadClass(className);
- store.reference(c);
- write(reference, "FindClass " + store.getIdentifier(c));
- } catch (ClassNotFoundException cnfe) {
-
- cl = this.instanceClassLoaders.get(instance);
- PluginDebug.debug("Not found. Looking in " + cl);
-
- if (instance != 0 && cl != null) {
- try {
- c = cl.loadClass(className);
- store.reference(c);
- write(reference, "FindClass " + store.getIdentifier(c));
- } catch (ClassNotFoundException cnfe2) {
- write(reference, "FindClass 0");
- }
- } else {
- write(reference, "FindClass 0");
- }
- }
-
- } else if (message.startsWith("GetStaticMethodID")
- || message.startsWith("GetMethodID")) {
- String[] args = message.split(" ");
- Integer classID = parseCall(args[1], null, Integer.class);
- String methodName = parseCall(args[2], null, String.class);
- Signature signature = parseCall(args[3], ((Class) store.getObject(classID)).getClassLoader(), Signature.class);
- Object[] a = signature.getClassArray();
-
- Class c;
-
- if (message.startsWith("GetStaticMethodID") ||
- methodName.equals("<init>") ||
- methodName.equals("<clinit>"))
- c = (Class) store.getObject(classID);
- else
- c = store.getObject(classID).getClass();
-
- Method m = null;
- Constructor cs = null;
- Object o = null;
- if (methodName.equals("<init>")
- || methodName.equals("<clinit>")) {
- o = cs = c.getConstructor(signature.getClassArray());
- store.reference(cs);
- } else {
- o = m = c.getMethod(methodName, signature.getClassArray());
- store.reference(m);
- }
- PluginDebug.debug(o + " has id " + store.getIdentifier(o));
- write(reference, args[0] + " " + store.getIdentifier(o));
- } else if (message.startsWith("GetStaticFieldID")
- || message.startsWith("GetFieldID")) {
- String[] args = message.split(" ");
- Integer classID = parseCall(args[1], null, Integer.class);
- Integer fieldID = parseCall(args[2], null, Integer.class);
- String fieldName = (String) store.getObject(fieldID);
-
- Class c = (Class) store.getObject(classID);
-
- PluginDebug.debug("GetStaticFieldID/GetFieldID got class=" + c.getName());
-
- Field f = null;
- f = c.getField(fieldName);
-
- store.reference(f);
-
- write(reference, "GetStaticFieldID " + store.getIdentifier(f));
- } else if (message.startsWith("GetStaticField")) {
- String[] args = message.split(" ");
- String type = parseCall(args[1], null, String.class);
- Integer classID = parseCall(args[1], null, Integer.class);
- Integer fieldID = parseCall(args[2], null, Integer.class);
-
- final Class c = (Class) store.getObject(classID);
- final Field f = (Field) store.getObject(fieldID);
-
- AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext();
- checkPermission(src, c, acc);
-
- Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
- public Object run() {
- try {
- return f.get(c);
- } catch (Throwable t) {
- return t;
- }
- }
- }, acc);
-
- if (ret instanceof Throwable)
- throw (Throwable) ret;
+ public static void setStreamhandler(PluginStreamHandler sh) {
+ streamhandler = sh;
+ }
+
+ public static Map<String, String> getLoaderInfo() {
+ Hashtable<String, String> map = new Hashtable<String, String>();
+
+ for (ClassLoader loader : PluginAppletSecurityContext.classLoaders.keySet()) {
+ map.put(loader.getClass().getName(), classLoaders.get(loader).toString());
+ }
+
+ return map;
+ }
+
+ public void handleMessage(int reference, String src, AccessControlContext callContext, String message) {
+
+ startTime = new java.util.Date().getTime();
+
+ try {
+ if (message.startsWith("FindClass")) {
+ ClassLoader cl = null;
+ Class c = null;
+ cl = liveconnectLoader;
+ String[] args = message.split(" ");
+ Integer instance = new Integer(args[1]);
+ String className = args[2].replace('/', '.');
+ PluginDebug.debug("Searching for class " + className + " in " + cl);
+
+ try {
+ c = cl.loadClass(className);
+ store.reference(c);
+ write(reference, "FindClass " + store.getIdentifier(c));
+ } catch (ClassNotFoundException cnfe) {
+
+ cl = this.instanceClassLoaders.get(instance);
+ PluginDebug.debug("Not found. Looking in " + cl);
+
+ if (instance != 0 && cl != null) {
+ try {
+ c = cl.loadClass(className);
+ store.reference(c);
+ write(reference, "FindClass " + store.getIdentifier(c));
+ } catch (ClassNotFoundException cnfe2) {
+ write(reference, "FindClass 0");
+ }
+ } else {
+ write(reference, "FindClass 0");
+ }
+ }
+
+ } else if (message.startsWith("GetStaticMethodID")
+ || message.startsWith("GetMethodID")) {
+ String[] args = message.split(" ");
+ Integer classID = parseCall(args[1], null, Integer.class);
+ String methodName = parseCall(args[2], null, String.class);
+ Signature signature = parseCall(args[3], ((Class) store.getObject(classID)).getClassLoader(), Signature.class);
+ Object[] a = signature.getClassArray();
+
+ Class<?> c;
+
+ if (message.startsWith("GetStaticMethodID") ||
+ methodName.equals("<init>") ||
+ methodName.equals("<clinit>"))
+ c = (Class<?>) store.getObject(classID);
+ else
+ c = store.getObject(classID).getClass();
+
+ Method m = null;
+ Constructor cs = null;
+ Object o = null;
+ if (methodName.equals("<init>")
+ || methodName.equals("<clinit>")) {
+ o = cs = c.getConstructor(signature.getClassArray());
+ store.reference(cs);
+ } else {
+ o = m = c.getMethod(methodName, signature.getClassArray());
+ store.reference(m);
+ }
+ PluginDebug.debug(o + " has id " + store.getIdentifier(o));
+ write(reference, args[0] + " " + store.getIdentifier(o));
+ } else if (message.startsWith("GetStaticFieldID")
+ || message.startsWith("GetFieldID")) {
+ String[] args = message.split(" ");
+ Integer classID = parseCall(args[1], null, Integer.class);
+ Integer fieldID = parseCall(args[2], null, Integer.class);
+ String fieldName = (String) store.getObject(fieldID);
+
+ Class<?> c = (Class<?>) store.getObject(classID);
+
+ PluginDebug.debug("GetStaticFieldID/GetFieldID got class=" + c.getName());
+
+ Field f = null;
+ f = c.getField(fieldName);
+
+ store.reference(f);
+
+ write(reference, "GetStaticFieldID " + store.getIdentifier(f));
+ } else if (message.startsWith("GetStaticField")) {
+ String[] args = message.split(" ");
+ String type = parseCall(args[1], null, String.class);
+ Integer classID = parseCall(args[1], null, Integer.class);
+ Integer fieldID = parseCall(args[2], null, Integer.class);
+
+ final Class<?> c = (Class<?>) store.getObject(classID);
+ final Field f = (Field) store.getObject(fieldID);
+
+ AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext();
+ checkPermission(src, c, acc);
+
+ Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
+ public Object run() {
+ try {
+ return f.get(c);
+ } catch (Throwable t) {
+ return t;
+ }
+ }
+ }, acc);
+
+ if (ret instanceof Throwable)
+ throw (Throwable) ret;
if (ret == null) {
write(reference, "GetStaticField literalreturn null");
@@ -448,8 +448,8 @@ public class PluginAppletSecurityContext {
|| f.getType() == Long.TYPE) {
write(reference, "GetStaticField literalreturn " + ret);
} else if (f.getType() == Float.TYPE
- || f.getType() == Double.TYPE) {
- write(reference, "GetStaticField literalreturn " + String.format("%308.308e", ret));
+ || f.getType() == Double.TYPE) {
+ write(reference, "GetStaticField literalreturn " + String.format("%308.308e", ret));
} else if (f.getType() == Character.TYPE) {
write(reference, "GetStaticField literalreturn " + (int) (Character) ret);
} else {
@@ -457,10 +457,10 @@ public class PluginAppletSecurityContext {
store.reference(ret);
write(reference, "GetStaticField " + store.getIdentifier(ret));
}
- } else if (message.startsWith("GetValue")) {
+ } else if (message.startsWith("GetValue")) {
String[] args = message.split(" ");
Integer index = parseCall(args[1], null, Integer.class);
-
+
Object ret = store.getObject(index);
if (ret == null) {
@@ -490,46 +490,46 @@ public class PluginAppletSecurityContext {
write(reference, "GetValue " + store.getIdentifier(ret));
}
} else if (message.startsWith("SetStaticField") ||
- message.startsWith("SetField")) {
- String[] args = message.split(" ");
- Integer classOrObjectID = parseCall(args[1], null, Integer.class);
- Integer fieldID = parseCall(args[2], null, Integer.class);
- Object value = store.getObject(parseCall(args[3], null, Integer.class));
-
- final Object o = store.getObject(classOrObjectID);
- final Field f = (Field) store.getObject(fieldID);
-
- final Object fValue = MethodOverloadResolver.getCostAndCastedObject(value, f.getType())[1];
-
- AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext();
- checkPermission(src,
- message.startsWith("SetStaticField") ? (Class) o : o.getClass(),
- acc);
-
- Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
- public Object run() {
- try {
- f.set(o, fValue);
- } catch (Throwable t) {
- return t;
- }
-
- return null;
- }
- }, acc);
-
- if (ret instanceof Throwable)
- throw (Throwable) ret;
-
- write(reference, "SetField");
- } else if (message.startsWith("GetObjectArrayElement")) {
- String[] args = message.split(" ");
- Integer arrayID = parseCall(args[1], null, Integer.class);
- Integer index = parseCall(args[2], null, Integer.class);
-
- Object ret = Array.get(store.getObject(arrayID), index);
- Class retClass = store.getObject(arrayID).getClass().getComponentType(); // prevent auto-boxing influence
-
+ message.startsWith("SetField")) {
+ String[] args = message.split(" ");
+ Integer classOrObjectID = parseCall(args[1], null, Integer.class);
+ Integer fieldID = parseCall(args[2], null, Integer.class);
+ Object value = store.getObject(parseCall(args[3], null, Integer.class));
+
+ final Object o = store.getObject(classOrObjectID);
+ final Field f = (Field) store.getObject(fieldID);
+
+ final Object fValue = MethodOverloadResolver.getCostAndCastedObject(value, f.getType())[1];
+
+ AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext();
+ checkPermission(src,
+ message.startsWith("SetStaticField") ? (Class) o : o.getClass(),
+ acc);
+
+ Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
+ public Object run() {
+ try {
+ f.set(o, fValue);
+ } catch (Throwable t) {
+ return t;
+ }
+
+ return null;
+ }
+ }, acc);
+
+ if (ret instanceof Throwable)
+ throw (Throwable) ret;
+
+ write(reference, "SetField");
+ } else if (message.startsWith("GetObjectArrayElement")) {
+ String[] args = message.split(" ");
+ Integer arrayID = parseCall(args[1], null, Integer.class);
+ Integer index = parseCall(args[2], null, Integer.class);
+
+ Object ret = Array.get(store.getObject(arrayID), index);
+ Class retClass = store.getObject(arrayID).getClass().getComponentType(); // prevent auto-boxing influence
+
if (ret == null) {
write(reference, "GetObjectArrayElement literalreturn null");
} else if (retClass == Boolean.TYPE
@@ -539,71 +539,71 @@ public class PluginAppletSecurityContext {
|| retClass== Long.TYPE) {
write(reference, "GetObjectArrayElement literalreturn " + ret);
} else if (retClass == Float.TYPE
- || retClass == Double.TYPE) {
- write(reference, "GetObjectArrayElement literalreturn " + String.format("%308.308e", ret));
+ || retClass == Double.TYPE) {
+ write(reference, "GetObjectArrayElement literalreturn " + String.format("%308.308e", ret));
} else if (retClass == Character.TYPE) {
write(reference, "GetObjectArrayElement literalreturn " + (int) (Character) ret);
} else {
// Track returned object.
store.reference(ret);
write(reference, "GetObjectArrayElement " + store.getIdentifier(ret));
- }
-
- } else if (message.startsWith("SetObjectArrayElement")) {
- String[] args = message.split(" ");
- Integer arrayID = parseCall(args[1], null, Integer.class);
- Integer index = parseCall(args[2], null, Integer.class);
- Integer objectID = parseCall(args[3], null, Integer.class);
-
- Object value = store.getObject(objectID);
-
- // Cast the object to appropriate type before insertion
- value = MethodOverloadResolver.getCostAndCastedObject(value, store.getObject(arrayID).getClass().getComponentType())[1];
-
- //if (value == null &&
- // store.getObject(arrayID).getClass().getComponentType().isPrimitive()) {
- // value = 0;
- //}
-
- Array.set(store.getObject(arrayID), index, value);
-
- write(reference, "SetObjectArrayElement");
- } else if (message.startsWith("GetArrayLength")) {
- String[] args = message.split(" ");
- Integer arrayID = parseCall(args[1], null, Integer.class);
-
- //System.out.println("ARRAYID: " + arrayID);
- Object o = (Object) store.getObject(arrayID);
- int len = 0;
- len = Array.getLength(o);
- // System.out.println ("Returning array length: " + len);
-
- // System.out.println ("array length: " + o + " " + len);
- write(reference, "GetArrayLength " + Array.getLength(o));
- } else if (message.startsWith("GetField")) {
- String[] args = message.split(" ");
- String type = parseCall(args[1], null, String.class);
- Integer objectID = parseCall(args[1], null, Integer.class);
- Integer fieldID = parseCall(args[2], null, Integer.class);
-
- final Object o = (Object) store.getObject(objectID);
- final Field f = (Field) store.getObject(fieldID);
-
- AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext();
- checkPermission(src, o.getClass(), acc);
-
- Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
- public Object run() {
- try {
- return f.get(o);
- } catch (Throwable t) {
- return t;
- }
- }
- }, acc);
-
- if (ret instanceof Throwable)
- throw (Throwable) ret;
+ }
+
+ } else if (message.startsWith("SetObjectArrayElement")) {
+ String[] args = message.split(" ");
+ Integer arrayID = parseCall(args[1], null, Integer.class);
+ Integer index = parseCall(args[2], null, Integer.class);
+ Integer objectID = parseCall(args[3], null, Integer.class);
+
+ Object value = store.getObject(objectID);
+
+ // Cast the object to appropriate type before insertion
+ value = MethodOverloadResolver.getCostAndCastedObject(value, store.getObject(arrayID).getClass().getComponentType())[1];
+
+ //if (value == null &&
+ // store.getObject(arrayID).getClass().getComponentType().isPrimitive()) {
+ // value = 0;
+ //}
+
+ Array.set(store.getObject(arrayID), index, value);
+
+ write(reference, "SetObjectArrayElement");
+ } else if (message.startsWith("GetArrayLength")) {
+ String[] args = message.split(" ");
+ Integer arrayID = parseCall(args[1], null, Integer.class);
+
+ //System.out.println("ARRAYID: " + arrayID);
+ Object o = store.getObject(arrayID);
+ int len = 0;
+ len = Array.getLength(o);
+ // System.out.println ("Returning array length: " + len);
+
+ // System.out.println ("array length: " + o + " " + len);
+ write(reference, "GetArrayLength " + Array.getLength(o));
+ } else if (message.startsWith("GetField")) {
+ String[] args = message.split(" ");
+ String type = parseCall(args[1], null, String.class);
+ Integer objectID = parseCall(args[1], null, Integer.class);
+ Integer fieldID = parseCall(args[2], null, Integer.class);
+
+ final Object o = store.getObject(objectID);
+ final Field f = (Field) store.getObject(fieldID);
+
+ AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext();
+ checkPermission(src, o.getClass(), acc);
+
+ Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
+ public Object run() {
+ try {
+ return f.get(o);
+ } catch (Throwable t) {
+ return t;
+ }
+ }
+ }, acc);
+
+ if (ret instanceof Throwable)
+ throw (Throwable) ret;
if (ret == null) {
write(reference, "GetField literalreturn null");
@@ -614,8 +614,8 @@ public class PluginAppletSecurityContext {
|| f.getType() == Long.TYPE) {
write(reference, "GetField literalreturn " + ret);
} else if (f.getType() == Float.TYPE
- || f.getType() == Double.TYPE) {
- write(reference, "GetField literalreturn " + String.format("%308.308e", ret));
+ || f.getType() == Double.TYPE) {
+ write(reference, "GetField literalreturn " + String.format("%308.308e", ret));
} else if (f.getType() == Character.TYPE) {
write(reference, "GetField literalreturn " + (int) (Character) ret);
} else {
@@ -624,217 +624,217 @@ public class PluginAppletSecurityContext {
write(reference, "GetField " + store.getIdentifier(ret));
}
- } else if (message.startsWith("GetObjectClass")) {
- int oid = Integer.parseInt(message.substring("GetObjectClass"
- .length() + 1));
- // System.out.println ("GETTING CLASS FOR: " + oid);
- Class c = store.getObject(oid).getClass();
- // System.out.println (" OBJ: " + store.getObject(oid));
- // System.out.println (" CLS: " + c);
- store.reference(c);
-
- write(reference, "GetObjectClass " + store.getIdentifier(c));
- } else if (message.startsWith("CallMethod") ||
- message.startsWith("CallStaticMethod")) {
- String[] args = message.split(" ");
- Integer objectID = parseCall(args[1], null, Integer.class);
- String methodName = parseCall(args[2], null, String.class);
- Object o = null;
- Class c;
-
- if (message.startsWith("CallMethod")) {
- o = (Object) store.getObject(objectID);
- c = o.getClass();
- } else {
- c = (Class) store.getObject(objectID);
- }
-
- // length -3 to discard first 3, + 2 for holding object
- // and method name
- Object[] arguments = new Object[args.length - 1];
- arguments[0] = c;
- arguments[1] = methodName;
+ } else if (message.startsWith("GetObjectClass")) {
+ int oid = Integer.parseInt(message.substring("GetObjectClass"
+ .length() + 1));
+ // System.out.println ("GETTING CLASS FOR: " + oid);
+ Class<?> c = store.getObject(oid).getClass();
+ // System.out.println (" OBJ: " + store.getObject(oid));
+ // System.out.println (" CLS: " + c);
+ store.reference(c);
+
+ write(reference, "GetObjectClass " + store.getIdentifier(c));
+ } else if (message.startsWith("CallMethod") ||
+ message.startsWith("CallStaticMethod")) {
+ String[] args = message.split(" ");
+ Integer objectID = parseCall(args[1], null, Integer.class);
+ String methodName = parseCall(args[2], null, String.class);
+ Object o = null;
+ Class<?> c;
+
+ if (message.startsWith("CallMethod")) {
+ o = store.getObject(objectID);
+ c = o.getClass();
+ } else {
+ c = (Class<?>) store.getObject(objectID);
+ }
+
+ // length -3 to discard first 3, + 2 for holding object
+ // and method name
+ Object[] arguments = new Object[args.length - 1];
+ arguments[0] = c;
+ arguments[1] = methodName;
for (int i = 0; i < args.length - 3; i++) {
arguments[i+2] = store.getObject(parseCall(args[3 + i], null, Integer.class));
PluginDebug.debug("GOT ARG: " + arguments[i+2]);
}
Object[] matchingMethodAndArgs = MethodOverloadResolver.getMatchingMethod(arguments);
-
+
if (matchingMethodAndArgs == null) {
write(reference, "Error: No suitable method named " + methodName + " with matching args found");
return;
}
- final Method m = (Method) matchingMethodAndArgs[0];
- Object[] castedArgs = new Object[matchingMethodAndArgs.length - 1];
- for (int i=0; i < castedArgs.length; i++) {
- castedArgs[i] = matchingMethodAndArgs[i+1];
- }
-
- String collapsedArgs = "";
- for (Object arg : castedArgs) {
- collapsedArgs += " " + arg;
- }
-
- PluginDebug.debug("Calling method " + m + " on object " + o
- + " (" + c + ") with " + collapsedArgs);
-
- AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext();
- checkPermission(src, c, acc);
-
- final Object[] fArguments = castedArgs;
- final Object callableObject = o;
- // Set the method accessible prior to calling. See:
- // http://forums.sun.com/thread.jspa?threadID=332001&start=15&tstart=0
- m.setAccessible(true);
- Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
- public Object run() {
- try {
- return m.invoke(callableObject, fArguments);
- } catch (Throwable t) {
- return t;
- }
- }
- }, acc);
-
- if (ret instanceof Throwable)
- throw (Throwable) ret;
-
- String retO;
- if (ret == null) {
- retO = "null";
- } else {
- retO = m.getReturnType().toString();
- }
-
- PluginDebug.debug("Calling " + m + " on " + o + " with "
- + collapsedArgs + " and that returned: " + ret
- + " of type " + retO);
-
- if (m.getReturnType().equals(java.lang.Void.class) ||
- m.getReturnType().equals(java.lang.Void.TYPE)) {
+ final Method m = (Method) matchingMethodAndArgs[0];
+ Object[] castedArgs = new Object[matchingMethodAndArgs.length - 1];
+ for (int i=0; i < castedArgs.length; i++) {
+ castedArgs[i] = matchingMethodAndArgs[i+1];
+ }
+
+ String collapsedArgs = "";
+ for (Object arg : castedArgs) {
+ collapsedArgs += " " + arg;
+ }
+
+ PluginDebug.debug("Calling method " + m + " on object " + o
+ + " (" + c + ") with " + collapsedArgs);
+
+ AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext();
+ checkPermission(src, c, acc);
+
+ final Object[] fArguments = castedArgs;
+ final Object callableObject = o;
+ // Set the method accessible prior to calling. See:
+ // http://forums.sun.com/thread.jspa?threadID=332001&start=15&tstart=0
+ m.setAccessible(true);
+ Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
+ public Object run() {
+ try {
+ return m.invoke(callableObject, fArguments);
+ } catch (Throwable t) {
+ return t;
+ }
+ }
+ }, acc);
+
+ if (ret instanceof Throwable)
+ throw (Throwable) ret;
+
+ String retO;
+ if (ret == null) {
+ retO = "null";
+ } else {
+ retO = m.getReturnType().toString();
+ }
+
+ PluginDebug.debug("Calling " + m + " on " + o + " with "
+ + collapsedArgs + " and that returned: " + ret
+ + " of type " + retO);
+
+ if (m.getReturnType().equals(java.lang.Void.class) ||
+ m.getReturnType().equals(java.lang.Void.TYPE)) {
write(reference, "CallMethod literalreturn void");
} else if (ret == null) {
- write(reference, "CallMethod literalreturn null");
- } else if (m.getReturnType() == Boolean.TYPE
- || m.getReturnType() == Byte.TYPE
- || m.getReturnType() == Short.TYPE
- || m.getReturnType() == Integer.TYPE
- || m.getReturnType() == Long.TYPE) {
- write(reference, "CallMethod literalreturn " + ret);
+ write(reference, "CallMethod literalreturn null");
+ } else if (m.getReturnType() == Boolean.TYPE
+ || m.getReturnType() == Byte.TYPE
+ || m.getReturnType() == Short.TYPE
+ || m.getReturnType() == Integer.TYPE
+ || m.getReturnType() == Long.TYPE) {
+ write(reference, "CallMethod literalreturn " + ret);
} else if (m.getReturnType() == Float.TYPE
- || m.getReturnType() == Double.TYPE) {
- write(reference, "CallMethod literalreturn " + String.format("%308.308e", ret));
- } else if (m.getReturnType() == Character.TYPE) {
- write(reference, "CallMethod literalreturn " + (int) (Character) ret);
- } else {
- // Track returned object.
- store.reference(ret);
- write(reference, "CallMethod " + store.getIdentifier(ret));
- }
- } else if (message.startsWith("GetSuperclass")) {
- String[] args = message.split(" ");
- Integer classID = parseCall(args[1], null, Integer.class);
- Class c = null;
- Class ret = null;
-
- c = (Class) store.getObject(classID);
- ret = c.getSuperclass();
- store.reference(ret);
-
- write(reference, "GetSuperclass " + store.getIdentifier(ret));
- } else if (message.startsWith("IsAssignableFrom")) {
- String[] args = message.split(" ");
- Integer classID = parseCall(args[1], null, Integer.class);
- Integer superclassID = parseCall(args[2], null, Integer.class);
-
- boolean result = false;
- Class clz = (Class) store.getObject(classID);
- Class sup = (Class) store.getObject(superclassID);
-
- result = sup.isAssignableFrom(clz);
-
- write(reference, "IsAssignableFrom " + (result ? "1" : "0"));
- } else if (message.startsWith("IsInstanceOf")) {
- String[] args = message.split(" ");
- Integer objectID = parseCall(args[1], null, Integer.class);
- Integer classID = parseCall(args[2], null, Integer.class);
-
- boolean result = false;
- Object o = (Object) store.getObject(objectID);
- Class c = (Class) store.getObject(classID);
-
- result = c.isInstance(o);
-
- write(reference, "IsInstanceOf " + (result ? "1" : "0"));
- } else if (message.startsWith("GetStringUTFLength")) {
- String[] args = message.split(" ");
- Integer stringID = parseCall(args[1], null, Integer.class);
-
- String o = null;
- byte[] b = null;
- o = (String) store.getObject(stringID);
- b = o.getBytes("UTF-8");
- // System.out.println ("STRING UTF-8 LENGTH: " + o + " " +
- // b.length);
-
- write(reference, "GetStringUTFLength " + o.length());
- } else if (message.startsWith("GetStringLength")) {
- String[] args = message.split(" ");
- Integer stringID = parseCall(args[1], null, Integer.class);
-
- String o = null;
- byte[] b = null;
- o = (String) store.getObject(stringID);
- b = o.getBytes("UTF-16LE");
- // System.out.println ("STRING UTF-16 LENGTH: " + o + " " +
- // b.length);
-
- // System.out.println ("Java: GetStringLength " + b.length);
- write(reference, "GetStringLength " + o.length());
- } else if (message.startsWith("GetStringUTFChars")) {
- String[] args = message.split(" ");
- Integer stringID = parseCall(args[1], null, Integer.class);
-
- String o = null;
- byte[] b = null;
- StringBuffer buf = null;
- o = (String) store.getObject(stringID);
- b = o.getBytes("UTF-8");
- buf = new StringBuffer(b.length * 2);
- buf.append(b.length);
- for (int i = 0; i < b.length; i++)
- buf
- .append(" "
- + Integer
- .toString(((int) b[i]) & 0x0ff, 16));
-
- // System.out.println ("Java: GetStringUTFChars: " + o);
- // //System.out.println ("String UTF BYTES: " + buf);
- write(reference, "GetStringUTFChars " + buf);
- } else if (message.startsWith("GetStringChars")) {
- String[] args = message.split(" ");
- Integer stringID = parseCall(args[1], null, Integer.class);
-
- String o = null;
- byte[] b = null;
- StringBuffer buf = null;
- o = (String) store.getObject(stringID);
- // FIXME: LiveConnect uses UCS-2.
- b = o.getBytes("UTF-16LE");
- buf = new StringBuffer(b.length * 2);
- buf.append(b.length);
- for (int i = 0; i < b.length; i++)
- buf
- .append(" "
- + Integer
- .toString(((int) b[i]) & 0x0ff, 16));
-
- PluginDebug.debug("Java: GetStringChars: " + o);
- PluginDebug.debug(" String BYTES: " + buf);
- write(reference, "GetStringChars " + buf);
- } else if (message.startsWith("GetToStringValue")) {
+ || m.getReturnType() == Double.TYPE) {
+ write(reference, "CallMethod literalreturn " + String.format("%308.308e", ret));
+ } else if (m.getReturnType() == Character.TYPE) {
+ write(reference, "CallMethod literalreturn " + (int) (Character) ret);
+ } else {
+ // Track returned object.
+ store.reference(ret);
+ write(reference, "CallMethod " + store.getIdentifier(ret));
+ }
+ } else if (message.startsWith("GetSuperclass")) {
+ String[] args = message.split(" ");
+ Integer classID = parseCall(args[1], null, Integer.class);
+ Class<?> c = null;
+ Class<?> ret = null;
+
+ c = (Class) store.getObject(classID);
+ ret = c.getSuperclass();
+ store.reference(ret);
+
+ write(reference, "GetSuperclass " + store.getIdentifier(ret));
+ } else if (message.startsWith("IsAssignableFrom")) {
+ String[] args = message.split(" ");
+ Integer classID = parseCall(args[1], null, Integer.class);
+ Integer superclassID = parseCall(args[2], null, Integer.class);
+
+ boolean result = false;
+ Class<?> clz = (Class<?>) store.getObject(classID);
+ Class<?> sup = (Class<?>) store.getObject(superclassID);
+
+ result = sup.isAssignableFrom(clz);
+
+ write(reference, "IsAssignableFrom " + (result ? "1" : "0"));
+ } else if (message.startsWith("IsInstanceOf")) {
+ String[] args = message.split(" ");
+ Integer objectID = parseCall(args[1], null, Integer.class);
+ Integer classID = parseCall(args[2], null, Integer.class);
+
+ boolean result = false;
+ Object o = store.getObject(objectID);
+ Class<?> c = (Class<?>) store.getObject(classID);
+
+ result = c.isInstance(o);
+
+ write(reference, "IsInstanceOf " + (result ? "1" : "0"));
+ } else if (message.startsWith("GetStringUTFLength")) {
+ String[] args = message.split(" ");
+ Integer stringID = parseCall(args[1], null, Integer.class);
+
+ String o = null;
+ byte[] b = null;
+ o = (String) store.getObject(stringID);
+ b = o.getBytes("UTF-8");
+ // System.out.println ("STRING UTF-8 LENGTH: " + o + " " +
+ // b.length);
+
+ write(reference, "GetStringUTFLength " + o.length());
+ } else if (message.startsWith("GetStringLength")) {
+ String[] args = message.split(" ");
+ Integer stringID = parseCall(args[1], null, Integer.class);
+
+ String o = null;
+ byte[] b = null;
+ o = (String) store.getObject(stringID);
+ b = o.getBytes("UTF-16LE");
+ // System.out.println ("STRING UTF-16 LENGTH: " + o + " " +
+ // b.length);
+
+ // System.out.println ("Java: GetStringLength " + b.length);
+ write(reference, "GetStringLength " + o.length());
+ } else if (message.startsWith("GetStringUTFChars")) {
+ String[] args = message.split(" ");
+ Integer stringID = parseCall(args[1], null, Integer.class);
+
+ String o = null;
+ byte[] b = null;
+ StringBuffer buf = null;
+ o = (String) store.getObject(stringID);
+ b = o.getBytes("UTF-8");
+ buf = new StringBuffer(b.length * 2);
+ buf.append(b.length);
+ for (int i = 0; i < b.length; i++)
+ buf
+ .append(" "
+ + Integer
+ .toString(((int) b[i]) & 0x0ff, 16));
+
+ // System.out.println ("Java: GetStringUTFChars: " + o);
+ // //System.out.println ("String UTF BYTES: " + buf);
+ write(reference, "GetStringUTFChars " + buf);
+ } else if (message.startsWith("GetStringChars")) {
+ String[] args = message.split(" ");
+ Integer stringID = parseCall(args[1], null, Integer.class);
+
+ String o = null;
+ byte[] b = null;
+ StringBuffer buf = null;
+ o = (String) store.getObject(stringID);
+ // FIXME: LiveConnect uses UCS-2.
+ b = o.getBytes("UTF-16LE");
+ buf = new StringBuffer(b.length * 2);
+ buf.append(b.length);
+ for (int i = 0; i < b.length; i++)
+ buf
+ .append(" "
+ + Integer
+ .toString(((int) b[i]) & 0x0ff, 16));
+
+ PluginDebug.debug("Java: GetStringChars: " + o);
+ PluginDebug.debug(" String BYTES: " + buf);
+ write(reference, "GetStringChars " + buf);
+ } else if (message.startsWith("GetToStringValue")) {
String[] args = message.split(" ");
Integer objectID = parseCall(args[1], null, Integer.class);
@@ -853,56 +853,56 @@ public class PluginAppletSecurityContext {
write(reference, "GetToStringValue " + buf);
} else if (message.startsWith("NewArray")) {
- String[] args = message.split(" ");
- String type = parseCall(args[1], null, String.class);
- Integer length = parseCall(args[2], null, Integer.class);
-
- // System.out.println ("CALLING: NewArray: " + type + " " +
- // length + " "
- // + Signature.primitiveNameToType(type));
-
- Object newArray = null;
-
- Class c;
- if (type.equals("bool")) {
- c = Boolean.class;
- } else if (type.equals("double")) {
- c = Double.class;
- } else if (type.equals("int")) {
- c = Integer.class;
+ String[] args = message.split(" ");
+ String type = parseCall(args[1], null, String.class);
+ Integer length = parseCall(args[2], null, Integer.class);
+
+ // System.out.println ("CALLING: NewArray: " + type + " " +
+ // length + " "
+ // + Signature.primitiveNameToType(type));
+
+ Object newArray = null;
+
+ Class c;
+ if (type.equals("bool")) {
+ c = Boolean.class;
+ } else if (type.equals("double")) {
+ c = Double.class;
+ } else if (type.equals("int")) {
+ c = Integer.class;
} else if (type.equals("string")) {
c = String.class;
} else if (isInt(type)) {
- c = (Class) store.getObject(Integer.parseInt(type));
+ c = (Class<?>) store.getObject(Integer.parseInt(type));
} else {
c = JSObject.class;
}
- if (args.length > 3)
- newArray = Array.newInstance(c, new int[] { length, parseCall(args[3], null, Integer.class)});
- else
- newArray = Array.newInstance(c, length);
+ if (args.length > 3)
+ newArray = Array.newInstance(c, new int[] { length, parseCall(args[3], null, Integer.class)});
+ else
+ newArray = Array.newInstance(c, length);
- store.reference(newArray);
- write(reference, "NewArray " + store.getIdentifier(newArray));
- } else if (message.startsWith("HasMethod")) {
+ store.reference(newArray);
+ write(reference, "NewArray " + store.getIdentifier(newArray));
+ } else if (message.startsWith("HasMethod")) {
String[] args = message.split(" ");
Integer classNameID = parseCall(args[1], null, Integer.class);
Integer methodNameID = parseCall(args[2], null, Integer.class);
-
- Class c = (Class) store.getObject(classNameID);
+
+ Class c = (Class<?>) store.getObject(classNameID);
String methodName = (String) store.getObject(methodNameID);
Method method = null;
Method[] classMethods = c.getMethods();
for (Method m: classMethods) {
- if (m.getName().equals(methodName)) {
- method = m;
- break;
- }
+ if (m.getName().equals(methodName)) {
+ method = m;
+ break;
+ }
}
-
- int hasMethod = (method != null) ? 1 : 0;
+
+ int hasMethod = (method != null) ? 1 : 0;
write(reference, "HasMethod " + hasMethod);
} else if (message.startsWith("HasPackage")) {
@@ -912,7 +912,7 @@ public class PluginAppletSecurityContext {
String pkgName = (String) store.getObject(nameID);
Package pkg = Package.getPackage(pkgName);
- int hasPkg = (pkg != null) ? 1 : 0;
+ int hasPkg = (pkg != null) ? 1 : 0;
write(reference, "HasPackage " + hasPkg);
@@ -920,43 +920,43 @@ public class PluginAppletSecurityContext {
String[] args = message.split(" ");
Integer classNameID = parseCall(args[1], null, Integer.class);
Integer fieldNameID = parseCall(args[2], null, Integer.class);
-
+
Class c = (Class) store.getObject(classNameID);
String fieldName = (String) store.getObject(fieldNameID);
Field field = null;
Field[] classFields = c.getFields();
for (Field f: classFields) {
- if (f.getName().equals(fieldName)) {
- field = f;
- break;
- }
+ if (f.getName().equals(fieldName)) {
+ field = f;
+ break;
+ }
}
- int hasField = (field != null) ? 1 : 0;
+ int hasField = (field != null) ? 1 : 0;
write(reference, "HasField " + hasField);
} else if (message.startsWith("NewObjectArray")) {
- String[] args = message.split(" ");
- Integer length = parseCall(args[1], null, Integer.class);
- Integer classID = parseCall(args[2], null, Integer.class);
- Integer objectID = parseCall(args[3], null, Integer.class);
-
- // System.out.println ("CALLING: NewObjectArray: " +
- // classID + " " + length + " "
- // + objectID);
-
- Object newArray = null;
- newArray = Array.newInstance((Class) store.getObject(classID),
- length);
-
- Object[] array = (Object[]) newArray;
- for (int i = 0; i < array.length; i++)
- array[i] = store.getObject(objectID);
- store.reference(newArray);
- write(reference, "NewObjectArray "
- + store.getIdentifier(newArray));
- } else if (message.startsWith("NewObjectWithConstructor")) {
+ String[] args = message.split(" ");
+ Integer length = parseCall(args[1], null, Integer.class);
+ Integer classID = parseCall(args[2], null, Integer.class);
+ Integer objectID = parseCall(args[3], null, Integer.class);
+
+ // System.out.println ("CALLING: NewObjectArray: " +
+ // classID + " " + length + " "
+ // + objectID);
+
+ Object newArray = null;
+ newArray = Array.newInstance((Class) store.getObject(classID),
+ length);
+
+ Object[] array = (Object[]) newArray;
+ for (int i = 0; i < array.length; i++)
+ array[i] = store.getObject(objectID);
+ store.reference(newArray);
+ write(reference, "NewObjectArray "
+ + store.getIdentifier(newArray));
+ } else if (message.startsWith("NewObjectWithConstructor")) {
String[] args = message.split(" ");
Integer classID = parseCall(args[1], null, Integer.class);
@@ -997,9 +997,9 @@ public class PluginAppletSecurityContext {
write(reference, "NewObject " + store.getIdentifier(ret));
} else if (message.startsWith("NewObject")) {
- String[] args = message.split(" ");
- Integer classID = parseCall(args[1], null, Integer.class);
- Class c = (Class) store.getObject(classID);
+ String[] args = message.split(" ");
+ Integer classID = parseCall(args[1], null, Integer.class);
+ Class c = (Class) store.getObject(classID);
final Constructor cons;
final Object[] fArguments;
@@ -1033,30 +1033,30 @@ public class PluginAppletSecurityContext {
collapsedArgs += " " + arg.toString();
}
- PluginDebug.debug("Calling constructor on class " + c +
+ PluginDebug.debug("Calling constructor on class " + c +
" with " + collapsedArgs);
AccessControlContext acc = callContext != null ? callContext : getClosedAccessControlContext();
- checkPermission(src, c, acc);
+ checkPermission(src, c, acc);
- Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
- public Object run() {
- try {
- return cons.newInstance(fArguments);
- } catch (Throwable t) {
- return t;
- }
- }
- }, acc);
+ Object ret = AccessController.doPrivileged(new PrivilegedAction<Object> () {
+ public Object run() {
+ try {
+ return cons.newInstance(fArguments);
+ } catch (Throwable t) {
+ return t;
+ }
+ }
+ }, acc);
- if (ret instanceof Throwable)
- throw (Throwable) ret;
+ if (ret instanceof Throwable)
+ throw (Throwable) ret;
- store.reference(ret);
+ store.reference(ret);
- write(reference, "NewObject " + store.getIdentifier(ret));
+ write(reference, "NewObject " + store.getIdentifier(ret));
- } else if (message.startsWith("NewStringUTF")) {
+ } else if (message.startsWith("NewStringUTF")) {
PluginDebug.debug("MESSAGE: " + message);
String[] args = message.split(" ");
int length = new Integer(args[1]);
@@ -1068,14 +1068,14 @@ public class PluginAppletSecurityContext {
while (i < length) {
c = Integer.parseInt(args[j++], 16);
byteArray[i++] = (byte) c;
- }
+ }
ret = new String(byteArray, "UTF-8");
PluginDebug.debug("NEWSTRINGUTF: " + ret);
store.reference(ret);
write(reference, "NewStringUTF " + store.getIdentifier(ret));
- } else if (message.startsWith("NewString")) {
+ } else if (message.startsWith("NewString")) {
PluginDebug.debug("MESSAGE: " + message);
String[] args = message.split(" ");
Integer strlength = parseCall(args[1], null, Integer.class);
@@ -1099,383 +1099,383 @@ public class PluginAppletSecurityContext {
store.reference(ret);
write(reference, "NewString " + store.getIdentifier(ret));
- } else if (message.startsWith("ExceptionOccurred")) {
- PluginDebug.debug("EXCEPTION: " + throwable);
- if (throwable != null)
- store.reference(throwable);
- write(reference, "ExceptionOccurred "
- + store.getIdentifier(throwable));
- } else if (message.startsWith("ExceptionClear")) {
- if (throwable != null && store.contains(throwable))
- store.unreference(store.getIdentifier(throwable));
- throwable = null;
- write(reference, "ExceptionClear");
- } else if (message.startsWith("DeleteGlobalRef")) {
- String[] args = message.split(" ");
- Integer id = parseCall(args[1], null, Integer.class);
- store.unreference(id);
- write(reference, "DeleteGlobalRef");
- } else if (message.startsWith("DeleteLocalRef")) {
- String[] args = message.split(" ");
- Integer id = parseCall(args[1], null, Integer.class);
- store.unreference(id);
- write(reference, "DeleteLocalRef");
- } else if (message.startsWith("NewGlobalRef")) {
- String[] args = message.split(" ");
- Integer id = parseCall(args[1], null, Integer.class);
- store.reference(store.getObject(id));
- write(reference, "NewGlobalRef " + id);
- } else if (message.startsWith("GetClassName")) {
- String[] args = message.split(" ");
- Integer objectID = parseCall(args[1], null, Integer.class);
- Object o = (Object) store.getObject(objectID);
- write(reference, "GetClassName " + o.getClass().getName());
- } else if (message.startsWith("GetClassID")) {
+ } else if (message.startsWith("ExceptionOccurred")) {
+ PluginDebug.debug("EXCEPTION: " + throwable);
+ if (throwable != null)
+ store.reference(throwable);
+ write(reference, "ExceptionOccurred "
+ + store.getIdentifier(throwable));
+ } else if (message.startsWith("ExceptionClear")) {
+ if (throwable != null && store.contains(throwable))
+ store.unreference(store.getIdentifier(throwable));
+ throwable = null;
+ write(reference, "ExceptionClear");
+ } else if (message.startsWith("DeleteGlobalRef")) {
+ String[] args = message.split(" ");
+ Integer id = parseCall(args[1], null, Integer.class);
+ store.unreference(id);
+ write(reference, "DeleteGlobalRef");
+ } else if (message.startsWith("DeleteLocalRef")) {
+ String[] args = message.split(" ");
+ Integer id = parseCall(args[1], null, Integer.class);
+ store.unreference(id);
+ write(reference, "DeleteLocalRef");
+ } else if (message.startsWith("NewGlobalRef")) {
+ String[] args = message.split(" ");
+ Integer id = parseCall(args[1], null, Integer.class);
+ store.reference(store.getObject(id));
+ write(reference, "NewGlobalRef " + id);
+ } else if (message.startsWith("GetClassName")) {
+ String[] args = message.split(" ");
+ Integer objectID = parseCall(args[1], null, Integer.class);
+ Object o = store.getObject(objectID);
+ write(reference, "GetClassName " + o.getClass().getName());
+ } else if (message.startsWith("GetClassID")) {
String[] args = message.split(" ");
Integer objectID = parseCall(args[1], null, Integer.class);
store.reference(store.getObject(objectID).getClass());
write(reference, "GetClassID " + store.getIdentifier(store.getObject(objectID).getClass()));
}
- } catch (Throwable t) {
- t.printStackTrace();
- String msg = t.getCause() != null ? t.getCause().getMessage() : t.getMessage();
-
- // add an identifier string to let javaside know of the type of error
- // check for cause as well, since the top level exception will be InvocationTargetException in most cases
- if (t instanceof AccessControlException || t.getCause() instanceof AccessControlException) {
- msg = "LiveConnectPermissionNeeded " + msg;
- }
-
- write(reference, " Error " + msg);
-
- // ExceptionOccured is only called after Callmethod() by mozilla. So
- // for exceptions that are not related to CallMethod, we need a way
- // to log them. This is how we do it.. send an error message to the
- // c++ side to let it know that something went wrong, and it will do
- // the right thing to let mozilla know
-
- // Store the cause as the actual exception. This is needed because
- // the exception we get here will always be an
- // "InvocationTargetException" due to the use of reflection above
- if (message.startsWith("CallMethod") || message.startsWith("CallStaticMethod"))
- throwable = t.getCause();
- }
-
- }
-
- /**
- * Checks if the calling script is allowed to access the specified class
- *
- * @param jsSrc The source of the script
- * @param target The target class that the script is trying to access
- * @param acc AccessControlContext for this execution
- * @throws AccessControlException If the script has insufficient permissions
- */
- public void checkPermission(String jsSrc, Class target, AccessControlContext acc) throws AccessControlException {
- // NPRuntime does not allow cross-site calling. We therefore always
- // allow this, for the time being
- return;
- }
-
- private void write(int reference, String message) {
- PluginDebug.debug("appletviewer writing " + message);
- streamhandler.write("context " + identifier + " reference " + reference
- + " " + message);
- }
-
- public void prePopulateLCClasses() {
-
- int classID;
-
- prepopulateClass("netscape/javascript/JSObject");
- classID = prepopulateClass("netscape/javascript/JSException");
- prepopulateMethod(classID, "<init>", "(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;I)");
- prepopulateMethod(classID, "<init>", "(ILjava/lang/Object;)");
- prepopulateField(classID, "lineno");
- prepopulateField(classID, "tokenIndex");
- prepopulateField(classID, "source");
- prepopulateField(classID, "filename");
- prepopulateField(classID, "wrappedExceptionType");
- prepopulateField(classID, "wrappedException");
-
- classID = prepopulateClass("netscape/javascript/JSUtil");
- prepopulateMethod(classID, "getStackTrace", "(Ljava/lang/Throwable;)");
-
- prepopulateClass("java/lang/Object");
- classID = prepopulateClass("java/lang/Class");
- prepopulateMethod(classID, "getMethods", "()");
- prepopulateMethod(classID, "getConstructors", "()");
- prepopulateMethod(classID, "getFields", "()");
- prepopulateMethod(classID, "getName", "()");
- prepopulateMethod(classID, "isArray", "()");
- prepopulateMethod(classID, "getComponentType", "()");
- prepopulateMethod(classID, "getModifiers", "()");
-
-
- classID = prepopulateClass("java/lang/reflect/Method");
- prepopulateMethod(classID, "getName", "()");
- prepopulateMethod(classID, "getParameterTypes", "()");
- prepopulateMethod(classID, "getReturnType", "()");
- prepopulateMethod(classID, "getModifiers", "()");
-
- classID = prepopulateClass("java/lang/reflect/Constructor");
- prepopulateMethod(classID, "getParameterTypes", "()");
- prepopulateMethod(classID, "getModifiers", "()");
-
- classID = prepopulateClass("java/lang/reflect/Field");
- prepopulateMethod(classID, "getName", "()");
- prepopulateMethod(classID, "getType", "()");
- prepopulateMethod(classID, "getModifiers", "()");
-
- classID = prepopulateClass("java/lang/reflect/Array");
- prepopulateMethod(classID, "newInstance", "(Ljava/lang/Class;I)");
-
- classID = prepopulateClass("java/lang/Throwable");
- prepopulateMethod(classID, "toString", "()");
- prepopulateMethod(classID, "getMessage", "()");
-
- classID = prepopulateClass("java/lang/System");
- prepopulateMethod(classID, "identityHashCode", "(Ljava/lang/Object;)");
-
- classID = prepopulateClass("java/lang/Boolean");
- prepopulateMethod(classID, "booleanValue", "()");
- prepopulateMethod(classID, "<init>", "(Z)");
-
- classID = prepopulateClass("java/lang/Double");
- prepopulateMethod(classID, "doubleValue", "()");
- prepopulateMethod(classID, "<init>", "(D)");
-
- classID = prepopulateClass("java/lang/Void");
- prepopulateField(classID, "TYPE");
-
- prepopulateClass("java/lang/String");
- prepopulateClass("java/applet/Applet");
- }
-
- private int prepopulateClass(String name) {
- name = name.replace('/', '.');
- ClassLoader cl = liveconnectLoader;
- Class c = null;
-
- try {
- c = cl.loadClass(name);
- store.reference(c);
- } catch (ClassNotFoundException cnfe) {
- // do nothing ... this should never happen
- cnfe.printStackTrace();
- }
-
- return store.getIdentifier(c);
- }
-
- private int prepopulateMethod(int classID, String methodName, String signatureStr) {
- Signature signature = parseCall(signatureStr, ((Class) store.getObject(classID)).getClassLoader(), Signature.class);
- Object[] a = signature.getClassArray();
-
- Class c = (Class) store.getObject(classID);
- Method m = null;
- Constructor cs = null;
- Object o = null;
-
- try {
- if (methodName.equals("<init>")
- || methodName.equals("<clinit>")) {
- o = cs = c.getConstructor(signature.getClassArray());
- store.reference(cs);
- } else {
- o = m = c.getMethod(methodName, signature.getClassArray());
- store.reference(m);
- }
- } catch (NoSuchMethodException e) {
- // should never happen
- e.printStackTrace();
- }
-
- return store.getIdentifier(m);
- }
-
- private int prepopulateField(int classID, String fieldName) {
-
- Class c = (Class) store.getObject(classID);
- Field f = null;
- try {
- f = c.getField(fieldName);
- } catch (SecurityException e) {
- // should never happen
- e.printStackTrace();
- } catch (NoSuchFieldException e) {
- // should never happen
- e.printStackTrace();
- }
-
- store.reference(f);
- return store.getIdentifier(f);
- }
-
- public void dumpStore() {
- store.dump();
- }
-
- public Object getObject(int identifier) {
- return store.getObject(identifier);
- }
-
- public int getIdentifier(Object o) {
- return store.getIdentifier(o);
- }
-
- public void store(Object o) {
- store.reference(o);
- }
-
- /**
- * Returns a "closed" AccessControlContext i.e. no permissions to get out of sandbox.
- */
- public AccessControlContext getClosedAccessControlContext() {
- // Deny everything
- Permissions p = new Permissions();
- ProtectionDomain pd = new ProtectionDomain(null, p);
- return new AccessControlContext(new ProtectionDomain[] {pd});
- }
-
- public AccessControlContext getAccessControlContext(String[] nsPrivilegeList, String src) {
+ } catch (Throwable t) {
+ t.printStackTrace();
+ String msg = t.getCause() != null ? t.getCause().getMessage() : t.getMessage();
+
+ // add an identifier string to let javaside know of the type of error
+ // check for cause as well, since the top level exception will be InvocationTargetException in most cases
+ if (t instanceof AccessControlException || t.getCause() instanceof AccessControlException) {
+ msg = "LiveConnectPermissionNeeded " + msg;
+ }
+
+ write(reference, " Error " + msg);
+
+ // ExceptionOccured is only called after Callmethod() by mozilla. So
+ // for exceptions that are not related to CallMethod, we need a way
+ // to log them. This is how we do it.. send an error message to the
+ // c++ side to let it know that something went wrong, and it will do
+ // the right thing to let mozilla know
+
+ // Store the cause as the actual exception. This is needed because
+ // the exception we get here will always be an
+ // "InvocationTargetException" due to the use of reflection above
+ if (message.startsWith("CallMethod") || message.startsWith("CallStaticMethod"))
+ throwable = t.getCause();
+ }
+
+ }
+
+ /**
+ * Checks if the calling script is allowed to access the specified class
+ *
+ * @param jsSrc The source of the script
+ * @param target The target class that the script is trying to access
+ * @param acc AccessControlContext for this execution
+ * @throws AccessControlException If the script has insufficient permissions
+ */
+ public void checkPermission(String jsSrc, Class target, AccessControlContext acc) throws AccessControlException {
+ // NPRuntime does not allow cross-site calling. We therefore always
+ // allow this, for the time being
+ return;
+ }
+
+ private void write(int reference, String message) {
+ PluginDebug.debug("appletviewer writing " + message);
+ streamhandler.write("context " + identifier + " reference " + reference
+ + " " + message);
+ }
+
+ public void prePopulateLCClasses() {
+
+ int classID;
+
+ prepopulateClass("netscape/javascript/JSObject");
+ classID = prepopulateClass("netscape/javascript/JSException");
+ prepopulateMethod(classID, "<init>", "(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;I)");
+ prepopulateMethod(classID, "<init>", "(ILjava/lang/Object;)");
+ prepopulateField(classID, "lineno");
+ prepopulateField(classID, "tokenIndex");
+ prepopulateField(classID, "source");
+ prepopulateField(classID, "filename");
+ prepopulateField(classID, "wrappedExceptionType");
+ prepopulateField(classID, "wrappedException");
+
+ classID = prepopulateClass("netscape/javascript/JSUtil");
+ prepopulateMethod(classID, "getStackTrace", "(Ljava/lang/Throwable;)");
+
+ prepopulateClass("java/lang/Object");
+ classID = prepopulateClass("java/lang/Class");
+ prepopulateMethod(classID, "getMethods", "()");
+ prepopulateMethod(classID, "getConstructors", "()");
+ prepopulateMethod(classID, "getFields", "()");
+ prepopulateMethod(classID, "getName", "()");
+ prepopulateMethod(classID, "isArray", "()");
+ prepopulateMethod(classID, "getComponentType", "()");
+ prepopulateMethod(classID, "getModifiers", "()");
+
+
+ classID = prepopulateClass("java/lang/reflect/Method");
+ prepopulateMethod(classID, "getName", "()");
+ prepopulateMethod(classID, "getParameterTypes", "()");
+ prepopulateMethod(classID, "getReturnType", "()");
+ prepopulateMethod(classID, "getModifiers", "()");
+
+ classID = prepopulateClass("java/lang/reflect/Constructor");
+ prepopulateMethod(classID, "getParameterTypes", "()");
+ prepopulateMethod(classID, "getModifiers", "()");
+
+ classID = prepopulateClass("java/lang/reflect/Field");
+ prepopulateMethod(classID, "getName", "()");
+ prepopulateMethod(classID, "getType", "()");
+ prepopulateMethod(classID, "getModifiers", "()");
+
+ classID = prepopulateClass("java/lang/reflect/Array");
+ prepopulateMethod(classID, "newInstance", "(Ljava/lang/Class;I)");
+
+ classID = prepopulateClass("java/lang/Throwable");
+ prepopulateMethod(classID, "toString", "()");
+ prepopulateMethod(classID, "getMessage", "()");
+
+ classID = prepopulateClass("java/lang/System");
+ prepopulateMethod(classID, "identityHashCode", "(Ljava/lang/Object;)");
+
+ classID = prepopulateClass("java/lang/Boolean");
+ prepopulateMethod(classID, "booleanValue", "()");
+ prepopulateMethod(classID, "<init>", "(Z)");
+
+ classID = prepopulateClass("java/lang/Double");
+ prepopulateMethod(classID, "doubleValue", "()");
+ prepopulateMethod(classID, "<init>", "(D)");
+
+ classID = prepopulateClass("java/lang/Void");
+ prepopulateField(classID, "TYPE");
+
+ prepopulateClass("java/lang/String");
+ prepopulateClass("java/applet/Applet");
+ }
+
+ private int prepopulateClass(String name) {
+ name = name.replace('/', '.');
+ ClassLoader cl = liveconnectLoader;
+ Class c = null;
+
+ try {
+ c = cl.loadClass(name);
+ store.reference(c);
+ } catch (ClassNotFoundException cnfe) {
+ // do nothing ... this should never happen
+ cnfe.printStackTrace();
+ }
+
+ return store.getIdentifier(c);
+ }
+
+ private int prepopulateMethod(int classID, String methodName, String signatureStr) {
+ Signature signature = parseCall(signatureStr, ((Class) store.getObject(classID)).getClassLoader(), Signature.class);
+ Object[] a = signature.getClassArray();
+
+ Class<?> c = (Class<?>) store.getObject(classID);
+ Method m = null;
+ Constructor cs = null;
+ Object o = null;
+
+ try {
+ if (methodName.equals("<init>")
+ || methodName.equals("<clinit>")) {
+ o = cs = c.getConstructor(signature.getClassArray());
+ store.reference(cs);
+ } else {
+ o = m = c.getMethod(methodName, signature.getClassArray());
+ store.reference(m);
+ }
+ } catch (NoSuchMethodException e) {
+ // should never happen
+ e.printStackTrace();
+ }
+
+ return store.getIdentifier(m);
+ }
+
+ private int prepopulateField(int classID, String fieldName) {
+
+ Class<?> c = (Class<?>) store.getObject(classID);
+ Field f = null;
+ try {
+ f = c.getField(fieldName);
+ } catch (SecurityException e) {
+ // should never happen
+ e.printStackTrace();
+ } catch (NoSuchFieldException e) {
+ // should never happen
+ e.printStackTrace();
+ }
+
+ store.reference(f);
+ return store.getIdentifier(f);
+ }
+
+ public void dumpStore() {
+ store.dump();
+ }
+
+ public Object getObject(int identifier) {
+ return store.getObject(identifier);
+ }
+
+ public int getIdentifier(Object o) {
+ return store.getIdentifier(o);
+ }
+
+ public void store(Object o) {
+ store.reference(o);
+ }
+
+ /**
+ * Returns a "closed" AccessControlContext i.e. no permissions to get out of sandbox.
+ */
+ public AccessControlContext getClosedAccessControlContext() {
+ // Deny everything
+ Permissions p = new Permissions();
+ ProtectionDomain pd = new ProtectionDomain(null, p);
+ return new AccessControlContext(new ProtectionDomain[] {pd});
+ }
+
+ public AccessControlContext getAccessControlContext(String[] nsPrivilegeList, String src) {
/*
- for (int i=0; i < nsPrivilegeList.length; i++) {
- String privilege = nsPrivilegeList[i];
-
- if (privilege.equals("UniversalAccept")) {
- SocketPermission sp = new SocketPermission("*", "accept,resolve");
- grantedPermissions.add(sp);
- } else if (privilege.equals("UniversalAwtEventQueueAccess")) {
- AWTPermission awtp = new AWTPermission("accessEventQueue");
- grantedPermissions.add(awtp);
- } else if (privilege.equals("UniversalConnect")) {
- SocketPermission sp = new SocketPermission("*", "connect,resolve");
- grantedPermissions.add(sp);
- } else if (privilege.equals("UniversalListen")) {
- SocketPermission sp = new SocketPermission("*", "listen,resolve");
- grantedPermissions.add(sp);
- } else if (privilege.equals("UniversalExecAccess")) {
- FilePermission fp = new FilePermission("<<ALL FILES>>", "execute");
- RuntimePermission rtp = new RuntimePermission("setIO");
- grantedPermissions.add(fp);
- grantedPermissions.add(rtp);
- } else if (privilege.equals("UniversalExitAccess")) {
- // Doesn't matter what the permissions are. Do not allow VM to exit.. we
- // use a single VM for the entire browser lifecycle once invoked, we
- // cannot let it exit
-
- //RuntimePermission rtp = new RuntimePermission("exitVM.*");
- //grantedPermissions.add(rtp);
- } else if (privilege.equals("UniversalFileDelete")) {
- FilePermission fp = new FilePermission("<<ALL FILES>>", "delete");
- grantedPermissions.add(fp);
- } else if (privilege.equals("UniversalFileRead")) {
- FilePermission fp = new FilePermission("<<ALL FILES>>", "read");
- grantedPermissions.add(fp);
- } else if (privilege.equals("UniversalFileWrite")) {
- FilePermission fp = new FilePermission("<<ALL FILES>>", "write");
- grantedPermissions.add(fp);
- } else if (privilege.equals("UniversalFdRead")) {
- RuntimePermission rtp = new RuntimePermission("readFileDescriptor");
- grantedPermissions.add(rtp);
- } else if (privilege.equals("UniversalFdWrite")) {
- RuntimePermission rtp = new RuntimePermission("writeFileDescriptor");
- grantedPermissions.add(rtp);
- } else if (privilege.equals("UniversalLinkAccess")) {
- RuntimePermission rtp = new RuntimePermission("loadLibrary.*");
- grantedPermissions.add(rtp);
- } else if (privilege.equals("UniversalListen")) {
- SocketPermission sp = new SocketPermission("*", "listen");
- grantedPermissions.add(sp);
- } else if (privilege.equals("UniversalMulticast")) {
- SocketPermission sp = new SocketPermission("*", "accept,connect,resolve");
- grantedPermissions.add(sp);
- } else if (privilege.equals("UniversalPackageAccess")) {
- RuntimePermission rtp = new RuntimePermission("defineClassInPackage.*");
- grantedPermissions.add(rtp);
- } else if (privilege.equals("UniversalPackageDefinition")) {
- RuntimePermission rtp = new RuntimePermission("accessClassInPackage.*");
- grantedPermissions.add(rtp);
- } else if (privilege.equals("UniversalPrintJobAccess")) {
- RuntimePermission rtp = new RuntimePermission("queuePrintJob");
- grantedPermissions.add(rtp);
- } else if (privilege.equals("UniversalPropertyRead")) {
- PropertyPermission pp = new PropertyPermission("*", "read");
- grantedPermissions.add(pp);
- } else if (privilege.equals("UniversalPropertyWrite")) {
- PropertyPermission pp = new PropertyPermission("*", "write");
- grantedPermissions.add(pp);
- } else if (privilege.equals("UniversalSetFactory")) {
- RuntimePermission rtp = new RuntimePermission("setFactory");
- grantedPermissions.add(rtp);
- } else if (privilege.equals("UniversalSystemClipboardAccess")) {
- AWTPermission awtp = new AWTPermission("accessClipboard");
- grantedPermissions.add(awtp);
- } else if (privilege.equals("UniversalThreadAccess")) {
- RuntimePermission rtp1 = new RuntimePermission("modifyThread");
- RuntimePermission rtp2 = new RuntimePermission("stopThread");
- grantedPermissions.add(rtp1);
- grantedPermissions.add(rtp2);
- } else if (privilege.equals("UniversalThreadGroupAccess")) {
- RuntimePermission rtp1 = new RuntimePermission("modifyThreadGroup");
- RuntimePermission rtp2 = new RuntimePermission("modifyThread");
- RuntimePermission rtp3 = new RuntimePermission("stopThread");
- grantedPermissions.add(rtp1);
- grantedPermissions.add(rtp2);
- grantedPermissions.add(rtp3);
- } else if (privilege.equals("UniversalTopLevelWindow")) {
- AWTPermission awtp = new AWTPermission("topLevelWindow");
- grantedPermissions.add(awtp);
- } else if (privilege.equals("UniversalBrowserRead")) {
- BrowserReadPermission bp = new BrowserReadPermission();
- grantedPermissions.add(bp);
- } else if (privilege.equals("UniversalJavaPermissions")) {
- AllPermission ap = new AllPermission();
- grantedPermissions.add(ap);
- }
- }
-
- // what to do with these is unknown: UniversalConnectWithRedirect, UniversalDialogModality, UniversalSendMail, LimitedInstall, FullInstall, SilentInstall
+ for (int i=0; i < nsPrivilegeList.length; i++) {
+ String privilege = nsPrivilegeList[i];
+
+ if (privilege.equals("UniversalAccept")) {
+ SocketPermission sp = new SocketPermission("*", "accept,resolve");
+ grantedPermissions.add(sp);
+ } else if (privilege.equals("UniversalAwtEventQueueAccess")) {
+ AWTPermission awtp = new AWTPermission("accessEventQueue");
+ grantedPermissions.add(awtp);
+ } else if (privilege.equals("UniversalConnect")) {
+ SocketPermission sp = new SocketPermission("*", "connect,resolve");
+ grantedPermissions.add(sp);
+ } else if (privilege.equals("UniversalListen")) {
+ SocketPermission sp = new SocketPermission("*", "listen,resolve");
+ grantedPermissions.add(sp);
+ } else if (privilege.equals("UniversalExecAccess")) {
+ FilePermission fp = new FilePermission("<<ALL FILES>>", "execute");
+ RuntimePermission rtp = new RuntimePermission("setIO");
+ grantedPermissions.add(fp);
+ grantedPermissions.add(rtp);
+ } else if (privilege.equals("UniversalExitAccess")) {
+ // Doesn't matter what the permissions are. Do not allow VM to exit.. we
+ // use a single VM for the entire browser lifecycle once invoked, we
+ // cannot let it exit
+
+ //RuntimePermission rtp = new RuntimePermission("exitVM.*");
+ //grantedPermissions.add(rtp);
+ } else if (privilege.equals("UniversalFileDelete")) {
+ FilePermission fp = new FilePermission("<<ALL FILES>>", "delete");
+ grantedPermissions.add(fp);
+ } else if (privilege.equals("UniversalFileRead")) {
+ FilePermission fp = new FilePermission("<<ALL FILES>>", "read");
+ grantedPermissions.add(fp);
+ } else if (privilege.equals("UniversalFileWrite")) {
+ FilePermission fp = new FilePermission("<<ALL FILES>>", "write");
+ grantedPermissions.add(fp);
+ } else if (privilege.equals("UniversalFdRead")) {
+ RuntimePermission rtp = new RuntimePermission("readFileDescriptor");
+ grantedPermissions.add(rtp);
+ } else if (privilege.equals("UniversalFdWrite")) {
+ RuntimePermission rtp = new RuntimePermission("writeFileDescriptor");
+ grantedPermissions.add(rtp);
+ } else if (privilege.equals("UniversalLinkAccess")) {
+ RuntimePermission rtp = new RuntimePermission("loadLibrary.*");
+ grantedPermissions.add(rtp);
+ } else if (privilege.equals("UniversalListen")) {
+ SocketPermission sp = new SocketPermission("*", "listen");
+ grantedPermissions.add(sp);
+ } else if (privilege.equals("UniversalMulticast")) {
+ SocketPermission sp = new SocketPermission("*", "accept,connect,resolve");
+ grantedPermissions.add(sp);
+ } else if (privilege.equals("UniversalPackageAccess")) {
+ RuntimePermission rtp = new RuntimePermission("defineClassInPackage.*");
+ grantedPermissions.add(rtp);
+ } else if (privilege.equals("UniversalPackageDefinition")) {
+ RuntimePermission rtp = new RuntimePermission("accessClassInPackage.*");
+ grantedPermissions.add(rtp);
+ } else if (privilege.equals("UniversalPrintJobAccess")) {
+ RuntimePermission rtp = new RuntimePermission("queuePrintJob");
+ grantedPermissions.add(rtp);
+ } else if (privilege.equals("UniversalPropertyRead")) {
+ PropertyPermission pp = new PropertyPermission("*", "read");
+ grantedPermissions.add(pp);
+ } else if (privilege.equals("UniversalPropertyWrite")) {
+ PropertyPermission pp = new PropertyPermission("*", "write");
+ grantedPermissions.add(pp);
+ } else if (privilege.equals("UniversalSetFactory")) {
+ RuntimePermission rtp = new RuntimePermission("setFactory");
+ grantedPermissions.add(rtp);
+ } else if (privilege.equals("UniversalSystemClipboardAccess")) {
+ AWTPermission awtp = new AWTPermission("accessClipboard");
+ grantedPermissions.add(awtp);
+ } else if (privilege.equals("UniversalThreadAccess")) {
+ RuntimePermission rtp1 = new RuntimePermission("modifyThread");
+ RuntimePermission rtp2 = new RuntimePermission("stopThread");
+ grantedPermissions.add(rtp1);
+ grantedPermissions.add(rtp2);
+ } else if (privilege.equals("UniversalThreadGroupAccess")) {
+ RuntimePermission rtp1 = new RuntimePermission("modifyThreadGroup");
+ RuntimePermission rtp2 = new RuntimePermission("modifyThread");
+ RuntimePermission rtp3 = new RuntimePermission("stopThread");
+ grantedPermissions.add(rtp1);
+ grantedPermissions.add(rtp2);
+ grantedPermissions.add(rtp3);
+ } else if (privilege.equals("UniversalTopLevelWindow")) {
+ AWTPermission awtp = new AWTPermission("topLevelWindow");
+ grantedPermissions.add(awtp);
+ } else if (privilege.equals("UniversalBrowserRead")) {
+ BrowserReadPermission bp = new BrowserReadPermission();
+ grantedPermissions.add(bp);
+ } else if (privilege.equals("UniversalJavaPermissions")) {
+ AllPermission ap = new AllPermission();
+ grantedPermissions.add(ap);
+ }
+ }
+
+ // what to do with these is unknown: UniversalConnectWithRedirect, UniversalDialogModality, UniversalSendMail, LimitedInstall, FullInstall, SilentInstall
*/
- Permissions grantedPermissions = new Permissions();
-
- for (int i=0; i < nsPrivilegeList.length; i++) {
- String privilege = nsPrivilegeList[i];
-
- if (privilege.equals("UniversalBrowserRead")) {
- BrowserReadPermission bp = new BrowserReadPermission();
- grantedPermissions.add(bp);
- } else if (privilege.equals("UniversalJavaPermission")) {
- AllPermission ap = new AllPermission();
- grantedPermissions.add(ap);
- }
- }
-
- CodeSource cs = new CodeSource((URL) null, (java.security.cert.Certificate [])null);
-
- if (src != null && src.length() > 0) {
- try {
- cs = new CodeSource(new URL(src + "/"), (java.security.cert.Certificate[]) null);
- } catch (MalformedURLException mfue) {
- // do nothing
- }
-
- if (src.equals("[System]"))
- grantedPermissions.add(new JSObjectCreatePermission());
-
- } else {
- JSObjectCreatePermission perm = new JSObjectCreatePermission();
- grantedPermissions.add(perm);
- }
-
- ProtectionDomain pd = new ProtectionDomain(cs, grantedPermissions, null, null);
-
- // Add to hashmap
- return new AccessControlContext(new ProtectionDomain[] {pd});
- }
+ Permissions grantedPermissions = new Permissions();
+
+ for (int i=0; i < nsPrivilegeList.length; i++) {
+ String privilege = nsPrivilegeList[i];
+
+ if (privilege.equals("UniversalBrowserRead")) {
+ BrowserReadPermission bp = new BrowserReadPermission();
+ grantedPermissions.add(bp);
+ } else if (privilege.equals("UniversalJavaPermission")) {
+ AllPermission ap = new AllPermission();
+ grantedPermissions.add(ap);
+ }
+ }
+
+ CodeSource cs = new CodeSource((URL) null, (java.security.cert.Certificate [])null);
+
+ if (src != null && src.length() > 0) {
+ try {
+ cs = new CodeSource(new URL(src + "/"), (java.security.cert.Certificate[]) null);
+ } catch (MalformedURLException mfue) {
+ // do nothing
+ }
+
+ if (src.equals("[System]"))
+ grantedPermissions.add(new JSObjectCreatePermission());
+
+ } else {
+ JSObjectCreatePermission perm = new JSObjectCreatePermission();
+ grantedPermissions.add(perm);
+ }
+
+ ProtectionDomain pd = new ProtectionDomain(cs, grantedPermissions, null, null);
+
+ // Add to hashmap
+ return new AccessControlContext(new ProtectionDomain[] {pd});
+ }
// private static final == inline
private static final boolean isInt(Object o) {
@@ -1490,11 +1490,11 @@ public class PluginAppletSecurityContext {
return isInt;
}
-
- class BrowserReadPermission extends BasicPermission {
- public BrowserReadPermission() {
- super("browserRead");
- }
- }
-
+
+ class BrowserReadPermission extends BasicPermission {
+ public BrowserReadPermission() {
+ super("browserRead");
+ }
+ }
+
}
diff --git a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
index 27246b0..29a3103 100644
--- a/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
+++ b/plugin/icedteanp/java/sun/applet/PluginAppletViewer.java
@@ -1,5 +1,5 @@
/* PluginAppletViewer -- Handles embedding of the applet panel
- Copyright (C) 2008 Red Hat
+ Copyright (C) 2008 Red Hat
This file is part of IcedTea.
@@ -59,9 +59,9 @@ exception statement from your version. */
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
-
+
package sun.applet;
-
+
import java.applet.Applet;
import java.applet.AppletContext;
import java.applet.AudioClip;
@@ -93,10 +93,14 @@ import java.net.URL;
import java.security.AccessController;
import java.security.AllPermission;
import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Vector;
@@ -110,23 +114,23 @@ import sun.awt.X11.XEmbeddedFrame;
import sun.misc.Ref;
import com.sun.jndi.toolkit.url.UrlUtil;
-
+
/**
* Lets us construct one using unix-style one shot behaviors
*/
-
+
class PluginAppletPanelFactory
{
- public AppletPanel createPanel(PluginStreamHandler streamhandler,
+ public AppletPanel createPanel(PluginStreamHandler streamhandler,
int identifier,
long handle, int x, int y,
- final URL doc, final Hashtable atts) {
-
- AppletViewerPanel panel = (AppletViewerPanel) AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
+ final URL doc,
+ final Hashtable<String,String> atts) {
+ AppletViewerPanel panel = AccessController.doPrivileged(new PrivilegedAction<AppletViewerPanel>() {
+ public AppletViewerPanel run() {
try {
- AppletPanel panel = new NetxPanel(doc, atts, false);
+ AppletViewerPanel panel = new NetxPanel(doc, atts, false);
AppletViewerPanel.debug("Using NetX panel");
PluginDebug.debug(atts.toString());
return panel;
@@ -136,7 +140,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
}
});
-
+
// create the frame.
PluginAppletViewer.framePanel(identifier, System.out, handle, panel);
@@ -151,7 +155,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
if (atts.get("codebase") != null) {
try {
- URL appletSrcURL = new URL(codeBase + (String) atts.get("codebase"));
+ URL appletSrcURL = new URL(codeBase + atts.get("codebase"));
codeBase = appletSrcURL.getProtocol() + "://" + appletSrcURL.getHost();
} catch (MalformedURLException mfue) {
// do nothing
@@ -162,7 +166,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
// Wait for the panel to initialize
// (happens in a separate thread)
Applet a;
-
+
// Wait for panel to come alive
int maxWait = PluginAppletViewer.APPLET_TIMEOUT; // wait for panel to come alive
int wait = 0;
@@ -174,7 +178,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
// just wait
}
}
-
+
// Wait for the panel to initialize
// (happens in a separate thread)
PluginAppletViewer.waitForAppletInit((NetxPanel) panel);
@@ -189,18 +193,18 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug("Applet " + a.getClass() + " initialized");
streamhandler.write("instance " + identifier + " reference 0 initialized");
-
+
AppletSecurityContextManager.getSecurityContext(0).associateSrc(((NetxPanel) panel).getAppletClassLoader(), doc);
AppletSecurityContextManager.getSecurityContext(0).associateInstance(identifier, ((NetxPanel) panel).getAppletClassLoader());
-
+
return panel;
}
-
+
public boolean isStandalone()
{
return false;
}
-
+
/**
* Send the initial set of events to the appletviewer event queue.
* On start-up the current behaviour is to load the applet and call
@@ -209,12 +213,12 @@ import com.sun.jndi.toolkit.url.UrlUtil;
private void initEventQueue(AppletPanel panel) {
// appletviewer.send.event is an undocumented and unsupported system
// property which is used exclusively for testing purposes.
- PrivilegedAction pa = new PrivilegedAction() {
- public Object run() {
+ PrivilegedAction<String> pa = new PrivilegedAction<String>() {
+ public String run() {
return System.getProperty("appletviewer.send.event");
}
};
- String eventList = (String) AccessController.doPrivileged(pa);
+ String eventList = AccessController.doPrivileged(pa);
if (eventList == null) {
// Add the standard events onto the event queue.
@@ -256,8 +260,8 @@ import com.sun.jndi.toolkit.url.UrlUtil;
while (!panel.emptyEventQueue()) ;
}
}
-
-
+
+
/**
* Split a string based on the presence of a specified separator. Returns
* an array of arbitrary length. The end of each element in the array is
@@ -273,30 +277,28 @@ import com.sun.jndi.toolkit.url.UrlUtil;
* s. Whitespace not stripped.
*/
private String [] splitSeparator(String sep, String s) {
- Vector v = new Vector();
+ List<String> l = new ArrayList<String>();
int tokenStart = 0;
int tokenEnd = 0;
while ((tokenEnd = s.indexOf(sep, tokenStart)) != -1) {
- v.addElement(s.substring(tokenStart, tokenEnd));
+ l.add(s.substring(tokenStart, tokenEnd));
tokenStart = tokenEnd+1;
}
// Add the final element.
- v.addElement(s.substring(tokenStart));
+ l.add(s.substring(tokenStart));
- String [] retVal = new String[v.size()];
- v.copyInto(retVal);
- return retVal;
+ return l.toArray(new String[l.size()]);
}
}
-
+
class PluginParseRequest
{
long handle;
String tag;
String documentbase;
}
-
+
/*
*/
// FIXME: declare JSProxy implementation
@@ -306,11 +308,11 @@ import com.sun.jndi.toolkit.url.UrlUtil;
* Some constants...
*/
private static String defaultSaveFile = "Applet.ser";
-
-
+
+
/**
* Enumerates the current status of an applet
- *
+ *
* PRE_INIT -> Parsing and initialization phase
* INIT_COMPLETE -> Initialization complete, reframe pending
* REFRAME_COMPLETE -> Reframe complete, applet is initialized and usable by the user
@@ -323,61 +325,61 @@ import com.sun.jndi.toolkit.url.UrlUtil;
* The panel in which the applet is being displayed.
*/
AppletViewerPanel panel;
-
+
/**
* The status line.
*/
Label label;
-
+
/**
* output status messages to this stream
*/
-
+
PrintStream statusMsgStream;
-
+
int identifier;
-
- private static HashMap<Integer, PluginParseRequest> requests =
- new HashMap();
-
+
+ private static HashMap<Integer, PluginParseRequest> requests =
+ new HashMap<Integer,PluginParseRequest>();
+
// Instance identifier -> PluginAppletViewer object.
- private static HashMap<Integer, PluginAppletViewer> applets =
- new HashMap();
-
+ private static HashMap<Integer, PluginAppletViewer> applets =
+ new HashMap<Integer,PluginAppletViewer>();
+
private static PluginStreamHandler streamhandler;
-
+
private static PluginCallRequestFactory requestFactory;
- private static HashMap<Integer, PAV_INIT_STATUS> status =
+ private static HashMap<Integer, PAV_INIT_STATUS> status =
new HashMap<Integer,PAV_INIT_STATUS>();
-
+
private long handle = 0;
private WindowListener windowEventListener = null;
private AppletEventListener appletEventListener = null;
-
+
public static final int APPLET_TIMEOUT = 180000;
private static Long requestIdentityCounter = 0L;
-
+
private Image bufFrameImg;
private Graphics bufFrameImgGraphics;
-
+
/**
* Null constructor to allow instantiation via newInstance()
*/
public PluginAppletViewer() {
}
- public static void framePanel(int identifier, PrintStream statusMsgStream,
- long handle, AppletViewerPanel panel) {
+ public static void framePanel(int identifier, PrintStream statusMsgStream,
+ long handle, AppletViewerPanel panel) {
PluginDebug.debug("Framing " + panel);
-
+
// SecurityManager MUST be set, and only privileged code may call reFrame()
System.getSecurityManager().checkPermission(new AllPermission());
PluginAppletViewer appletFrame = new PluginAppletViewer(handle, identifier, statusMsgStream, panel);
-
+
appletFrame.add("Center", panel);
appletFrame.pack();
@@ -392,10 +394,10 @@ import com.sun.jndi.toolkit.url.UrlUtil;
/**
* Create new plugin appletviewer frame
*/
- private PluginAppletViewer(long handle, final int identifier,
- PrintStream statusMsgStream,
+ private PluginAppletViewer(long handle, final int identifier,
+ PrintStream statusMsgStream,
AppletViewerPanel appletPanel) {
-
+
super(handle, true);
this.statusMsgStream = statusMsgStream;
this.identifier = identifier;
@@ -423,37 +425,37 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
- private static class AppletEventListener implements AppletListener
+ private static class AppletEventListener implements AppletListener
{
final Frame frame;
final PluginAppletViewer appletViewer;
-
+
public AppletEventListener(Frame frame, PluginAppletViewer appletViewer)
{
this.frame = frame;
this.appletViewer = appletViewer;
}
-
- public void appletStateChanged(AppletEvent evt)
+
+ public void appletStateChanged(AppletEvent evt)
{
AppletPanel src = (AppletPanel)evt.getSource();
-
+
switch (evt.getID()) {
case AppletPanel.APPLET_RESIZE: {
if(src != null) {
- appletViewer.resize(appletViewer.preferredSize());
+ appletViewer.setSize(appletViewer.getPreferredSize());
appletViewer.validate();
- }
+ }
break;
}
case AppletPanel.APPLET_LOADING_COMPLETED: {
Applet a = src.getApplet(); // sun.applet.AppletPanel
-
+
// Fixed #4754451: Applet can have methods running on main
- // thread event queue.
- //
- // The cause of this bug is that the frame of the applet
- // is created in main thread group. Thus, when certain
+ // thread event queue.
+ //
+ // The cause of this bug is that the frame of the applet
+ // is created in main thread group. Thus, when certain
// AWT/Swing events are generated, the events will be
// dispatched through the wrong event dispatch thread.
//
@@ -468,14 +470,14 @@ import com.sun.jndi.toolkit.url.UrlUtil;
else
AppletPanel.changeFrameAppContext(frame, AppContext.getAppContext());
- updateStatus(appletViewer.identifier, PAV_INIT_STATUS.INIT_COMPLETE);
+ updateStatus(appletViewer.identifier, PAV_INIT_STATUS.INIT_COMPLETE);
break;
}
}
}
}
-
+
public static void setStreamhandler(PluginStreamHandler sh) {
streamhandler = sh;
}
@@ -491,35 +493,35 @@ import com.sun.jndi.toolkit.url.UrlUtil;
{
PluginDebug.debug("PAV handling: " + message);
-
+
try {
if (message.startsWith("handle")) {
- // If there is a key for this status, it means it
- // was either initialized before, or destroy has been
- // processed. Stop moving further.
- if (updateStatus(identifier, PAV_INIT_STATUS.PRE_INIT) != null)
- return;
-
- // Extract the information from the message
- String[] msgParts = new String[4];
- for (int i=0; i < 3; i++) {
- int spaceLocation = message.indexOf(' ');
- int nextSpaceLocation = message.indexOf(' ', spaceLocation+1);
- msgParts[i] = message.substring(spaceLocation + 1, nextSpaceLocation);
- message = message.substring(nextSpaceLocation + 1);
- }
-
- long handle = Long.parseLong(msgParts[0]);
- String width = msgParts[1];
- String height = msgParts[2];
-
- int spaceLocation = message.indexOf(' ', "tag".length()+1);
- String documentBase =
+ // If there is a key for this status, it means it
+ // was either initialized before, or destroy has been
+ // processed. Stop moving further.
+ if (updateStatus(identifier, PAV_INIT_STATUS.PRE_INIT) != null)
+ return;
+
+ // Extract the information from the message
+ String[] msgParts = new String[4];
+ for (int i=0; i < 3; i++) {
+ int spaceLocation = message.indexOf(' ');
+ int nextSpaceLocation = message.indexOf(' ', spaceLocation+1);
+ msgParts[i] = message.substring(spaceLocation + 1, nextSpaceLocation);
+ message = message.substring(nextSpaceLocation + 1);
+ }
+
+ long handle = Long.parseLong(msgParts[0]);
+ String width = msgParts[1];
+ String height = msgParts[2];
+
+ int spaceLocation = message.indexOf(' ', "tag".length()+1);
+ String documentBase =
UrlUtil.decode(message.substring("tag".length() + 1, spaceLocation));
- String tag = message.substring(spaceLocation+1);
-
- // Decode the tag
+ String tag = message.substring(spaceLocation+1);
+
+ // Decode the tag
tag = tag.replace("&gt;", ">");
tag = tag.replace("&lt;", "<");
tag = tag.replace("&amp;", "&");
@@ -527,16 +529,16 @@ import com.sun.jndi.toolkit.url.UrlUtil;
tag = tag.replace("&#13;", "\r");
tag = tag.replace("&quot;", "\"");
- PluginDebug.debug ("Handle = " + handle + "\n" +
- "Width = " + width + "\n" +
- "Height = " + height + "\n" +
- "DocumentBase = " + documentBase + "\n" +
- "Tag = " + tag);
-
- PluginAppletViewer.parse
- (identifier, handle, width, height,
- new StringReader(tag),
- new URL(documentBase));
+ PluginDebug.debug ("Handle = " + handle + "\n" +
+ "Width = " + width + "\n" +
+ "Height = " + height + "\n" +
+ "DocumentBase = " + documentBase + "\n" +
+ "Tag = " + tag);
+
+ PluginAppletViewer.parse
+ (identifier, handle, width, height,
+ new StringReader(tag),
+ new URL(documentBase));
int maxWait = APPLET_TIMEOUT; // wait for applet to fully load
int wait = 0;
@@ -554,13 +556,13 @@ import com.sun.jndi.toolkit.url.UrlUtil;
// If wait exceeded maxWait, we timed out. Throw an exception
if (wait >= maxWait)
throw new Exception("Applet initialization timeout");
-
+
PluginAppletViewer oldFrame = applets.get(identifier);
- // We should not try to destroy an applet during
- // initialization. It may cause an inconsistent state,
- // which would bad if it's a trusted applet that
- // read/writes to files
+ // We should not try to destroy an applet during
+ // initialization. It may cause an inconsistent state,
+ // which would bad if it's a trusted applet that
+ // read/writes to files
waitForAppletInit((NetxPanel) applets.get(identifier).panel);
// Should we proceed with reframing?
@@ -571,22 +573,22 @@ import com.sun.jndi.toolkit.url.UrlUtil;
} else if (message.startsWith("destroy")) {
- // Set it inactive, and try to do cleanup is applicable
- PAV_INIT_STATUS previousStatus = updateStatus(identifier, PAV_INIT_STATUS.INACTIVE);
- PluginDebug.debug("Destroy status set for " + identifier);
+ // Set it inactive, and try to do cleanup is applicable
+ PAV_INIT_STATUS previousStatus = updateStatus(identifier, PAV_INIT_STATUS.INACTIVE);
+ PluginDebug.debug("Destroy status set for " + identifier);
- if (previousStatus != null &&
- previousStatus.equals(PAV_INIT_STATUS.REFRAME_COMPLETE)) {
- destroyApplet(identifier);
- }
+ if (previousStatus != null &&
+ previousStatus.equals(PAV_INIT_STATUS.REFRAME_COMPLETE)) {
+ destroyApplet(identifier);
+ }
} else {
PluginDebug.debug ("Handling message: " + message + " instance " + identifier + " " + Thread.currentThread());
// Wait till initialization finishes
- while (!applets.containsKey(identifier) &&
+ while (!applets.containsKey(identifier) &&
(
- !status.containsKey(identifier) ||
+ !status.containsKey(identifier) ||
status.get(identifier).equals(PAV_INIT_STATUS.PRE_INIT)
)
);
@@ -600,118 +602,118 @@ import com.sun.jndi.toolkit.url.UrlUtil;
} catch (Exception e) {
e.printStackTrace();
-
+
// If an exception happened during pre-init, we need to update status
updateStatus(identifier, PAV_INIT_STATUS.INACTIVE);
- throw new RuntimeException("Failed to handle message: " +
+ throw new RuntimeException("Failed to handle message: " +
message + " for instance " + identifier, e);
}
}
-
+
/**
- * Sets the status unless an overriding status is set (e.g. if
+ * Sets the status unless an overriding status is set (e.g. if
* status is DESTROYED, it may not be overridden).
- *
+ *
* @param identifier The identifier for which the status is to be set
* @param status The status to switch to
* @return The previous status
*/
private static synchronized PAV_INIT_STATUS updateStatus(int identifier, PAV_INIT_STATUS newStatus) {
-
- PAV_INIT_STATUS prev = status.get(identifier);
-
- // If the status is set
- if (status.containsKey(identifier)) {
-
- // Nothing may override destroyed status
- if (status.get(identifier).equals(PAV_INIT_STATUS.DESTROYED)) {
- return prev;
- }
-
- // If status is inactive, only DESTROYED may override it
- if (status.get(identifier).equals(PAV_INIT_STATUS.INACTIVE)) {
- if (!newStatus.equals(PAV_INIT_STATUS.DESTROYED)) {
- return prev;
- }
- }
- }
-
- // Else set to given status
- status.put(identifier, newStatus);
-
- return prev;
+
+ PAV_INIT_STATUS prev = status.get(identifier);
+
+ // If the status is set
+ if (status.containsKey(identifier)) {
+
+ // Nothing may override destroyed status
+ if (status.get(identifier).equals(PAV_INIT_STATUS.DESTROYED)) {
+ return prev;
+ }
+
+ // If status is inactive, only DESTROYED may override it
+ if (status.get(identifier).equals(PAV_INIT_STATUS.INACTIVE)) {
+ if (!newStatus.equals(PAV_INIT_STATUS.DESTROYED)) {
+ return prev;
+ }
+ }
+ }
+
+ // Else set to given status
+ status.put(identifier, newStatus);
+
+ return prev;
}
/**
* Destroys the given applet instance.
- *
- * This function may be called multiple times without problems.
- * It does a synchronized check on the status and will only
+ *
+ * This function may be called multiple times without problems.
+ * It does a synchronized check on the status and will only
* attempt to destroy the applet if not previously destroyed.
- *
+ *
* @param identifier The instance which is to be destroyed
*/
-
+
private static synchronized void destroyApplet(int identifier) {
- PluginDebug.debug("DestroyApplet called for " + identifier);
-
- PAV_INIT_STATUS prev = updateStatus(identifier, PAV_INIT_STATUS.DESTROYED);
+ PluginDebug.debug("DestroyApplet called for " + identifier);
- // If already destroyed, return
- if (prev.equals(PAV_INIT_STATUS.DESTROYED)) {
- PluginDebug.debug(identifier + " already destroyed. Returning.");
- return;
- }
+ PAV_INIT_STATUS prev = updateStatus(identifier, PAV_INIT_STATUS.DESTROYED);
- PluginDebug.debug("Attempting to destroy frame " + identifier);
-
- // Try to dispose the panel right away
- if (applets.containsKey(identifier))
- applets.get(identifier).dispose();
+ // If already destroyed, return
+ if (prev.equals(PAV_INIT_STATUS.DESTROYED)) {
+ PluginDebug.debug(identifier + " already destroyed. Returning.");
+ return;
+ }
- // If panel is already disposed, return
- if (applets.get(identifier).panel.applet == null) {
- PluginDebug.debug(identifier + " panel inactive. Returning.");
- return;
- }
+ PluginDebug.debug("Attempting to destroy frame " + identifier);
- PluginDebug.debug("Attempting to destroy panel " + identifier);
+ // Try to dispose the panel right away
+ if (applets.containsKey(identifier))
+ applets.get(identifier).dispose();
- final int fIdentifier = identifier;
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- applets.get(fIdentifier).appletClose();
- }
- });
+ // If panel is already disposed, return
+ if (applets.get(identifier).panel.applet == null) {
+ PluginDebug.debug(identifier + " panel inactive. Returning.");
+ return;
+ }
+
+ PluginDebug.debug("Attempting to destroy panel " + identifier);
- PluginDebug.debug(identifier + " destroyed");
+ final int fIdentifier = identifier;
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ applets.get(fIdentifier).appletClose();
+ }
+ });
+
+ PluginDebug.debug(identifier + " destroyed");
}
-
+
/**
* Function to block until applet initialization is complete
- *
+ *
* @param identifier The instance to wait for
*/
public static void waitForAppletInit(NetxPanel panel) {
-
- int waitTime = 0;
-
+
+ int waitTime = 0;
+
// Wait till initialization finishes
while (panel.getApplet() == null &&
panel.isAlive() &&
waitTime < APPLET_TIMEOUT) {
try {
if (waitTime%500 == 0)
- PluginDebug.debug("Waiting for applet panel " + panel + " to initialize...");
+ PluginDebug.debug("Waiting for applet panel " + panel + " to initialize...");
Thread.sleep(waitTime += 50);
} catch (InterruptedException ie) {
// just wait
}
}
-
+
PluginDebug.debug("Applet panel " + panel + " initialized");
}
@@ -730,12 +732,12 @@ import com.sun.jndi.toolkit.url.UrlUtil;
// just wait
}
}
-
+
// 0 => width, 1=> width_value, 2 => height, 3=> height_value
String[] dimMsg = message.split(" ");
-
- final int height = (int) (Integer.parseInt(dimMsg[3]));
- final int width = (int) (Integer.parseInt(dimMsg[1]));
+
+ final int height = Integer.parseInt(dimMsg[3]);
+ final int width = Integer.parseInt(dimMsg[1]);
if (panel instanceof NetxPanel)
((NetxPanel) panel).updateSizeInAtts(height, width);
@@ -745,15 +747,15 @@ import com.sun.jndi.toolkit.url.UrlUtil;
public void run() {
setSize(width, height);
-
- // There is a rather odd drawing bug whereby resizing
- // the panel makes no difference on initial call
- // because the panel thinks that it is already the
- // right size. Validation has no effect there either.
- // So we work around by setting size to 1, validating,
- // and then setting to the right size and validating
- // again. This is not very efficient, and there is
- // probably a better way -- but resizing happens
+
+ // There is a rather odd drawing bug whereby resizing
+ // the panel makes no difference on initial call
+ // because the panel thinks that it is already the
+ // right size. Validation has no effect there either.
+ // So we work around by setting size to 1, validating,
+ // and then setting to the right size and validating
+ // again. This is not very efficient, and there is
+ // probably a better way -- but resizing happens
// quite infrequently, so for now this is how we do it
panel.setSize(1,1);
@@ -761,7 +763,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
panel.setSize(width, height);
panel.validate();
-
+
panel.applet.resize(width, height);
panel.applet.validate();
}
@@ -791,7 +793,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
// just wait
}
}
-
+
// Wait for the panel to initialize
// (happens in a separate thread)
waitForAppletInit((NetxPanel) panel);
@@ -815,7 +817,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
}
- // FIXME: Kind of hackish way to ensure synchronized re-drawing
+ // FIXME: Kind of hackish way to ensure synchronized re-drawing
private synchronized void forceredraw() {
doLayout();
}
@@ -823,43 +825,43 @@ import com.sun.jndi.toolkit.url.UrlUtil;
/*
* Methods for java.applet.AppletContext
*/
-
- private static Map audioClips = new HashMap();
-
+
+ private static Map<URL,AudioClip> audioClips = new HashMap<URL,AudioClip>();
+
/**
* Get an audio clip.
*/
public AudioClip getAudioClip(URL url) {
- checkConnect(url);
- synchronized (audioClips) {
- AudioClip clip = (AudioClip)audioClips.get(url);
- if (clip == null) {
- audioClips.put(url, clip = new AppletAudioClip(url));
- }
- return clip;
- }
+ checkConnect(url);
+ synchronized (audioClips) {
+ AudioClip clip = audioClips.get(url);
+ if (clip == null) {
+ audioClips.put(url, clip = new AppletAudioClip(url));
+ }
+ return clip;
+ }
}
-
- private static Map imageRefs = new HashMap();
-
+
+ private static Map<URL,AppletImageRef> imageRefs = new HashMap<URL,AppletImageRef>();
+
/**
* Get an image.
*/
public Image getImage(URL url) {
- return getCachedImage(url);
+ return getCachedImage(url);
}
-
+
private Image getCachedImage(URL url) {
// System.getSecurityManager().checkConnection(url.getHost(), url.getPort());
return (Image)getCachedImageRef(url).get();
}
-
+
/**
* Get an image ref.
*/
private synchronized Ref getCachedImageRef(URL url) {
PluginDebug.debug("getCachedImageRef() searching for " + url);
-
+
try {
String originalURL = url.toString();
@@ -874,9 +876,9 @@ import com.sun.jndi.toolkit.url.UrlUtil;
if (panel instanceof NetxPanel) {
URL localURL = null;
-
- String resourceName = originalURL.substring(codeBase.length());
- JNLPClassLoader loader = (JNLPClassLoader) ((NetxPanel) panel).getAppletClassLoader();
+
+ String resourceName = originalURL.substring(codeBase.length());
+ JNLPClassLoader loader = (JNLPClassLoader) ((NetxPanel) panel).getAppletClassLoader();
if (loader.resourceAvailableLocally(resourceName))
localURL = loader.getResource(resourceName);
@@ -888,7 +890,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug("getCachedImageRef() getting img from URL = " + url);
synchronized (imageRefs) {
- AppletImageRef ref = (AppletImageRef)imageRefs.get(url);
+ AppletImageRef ref = imageRefs.get(url);
if (ref == null) {
ref = new AppletImageRef(url);
imageRefs.put(url, ref);
@@ -901,16 +903,16 @@ import com.sun.jndi.toolkit.url.UrlUtil;
return null;
}
}
-
+
/**
* Flush the image cache.
*/
static void flushImageCache() {
- imageRefs.clear();
+ imageRefs.clear();
}
-
- static Vector appletPanels = new Vector();
-
+
+ static Vector<AppletPanel> appletPanels = new Vector<AppletPanel>();
+
/**
* Get an applet by name.
*/
@@ -926,10 +928,10 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
if (name.equals(param) &&
p.getDocumentBase().equals(panel.getDocumentBase())) {
-
+
SocketPermission sp =
new SocketPermission(p.getCodeBase().getHost(), "connect");
-
+
if (panelSp.implies(sp)) {
return p.applet;
}
@@ -937,30 +939,30 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
return null;
}
-
+
/**
* Return an enumeration of all the accessible
* applets on this page.
*/
- public Enumeration getApplets() {
- Vector v = new Vector();
- SocketPermission panelSp =
- new SocketPermission(panel.getCodeBase().getHost(), "connect");
-
- for (Enumeration e = appletPanels.elements() ; e.hasMoreElements() ;) {
- AppletPanel p = (AppletPanel)e.nextElement();
- if (p.getDocumentBase().equals(panel.getDocumentBase())) {
-
- SocketPermission sp =
- new SocketPermission(p.getCodeBase().getHost(), "connect");
- if (panelSp.implies(sp)) {
- v.addElement(p.applet);
- }
- }
- }
- return v.elements();
+ public Enumeration<Applet> getApplets() {
+ Vector<Applet> v = new Vector<Applet>();
+ SocketPermission panelSp =
+ new SocketPermission(panel.getCodeBase().getHost(), "connect");
+
+ for (Enumeration<AppletPanel> e = appletPanels.elements() ; e.hasMoreElements() ;) {
+ AppletPanel p = e.nextElement();
+ if (p.getDocumentBase().equals(panel.getDocumentBase())) {
+
+ SocketPermission sp =
+ new SocketPermission(p.getCodeBase().getHost(), "connect");
+ if (panelSp.implies(sp)) {
+ v.addElement(p.applet);
+ }
+ }
+ }
+ return v.elements();
}
-
+
/**
* Ignore.
*/
@@ -968,7 +970,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug("Showing document...");
showDocument(url, "_self");
}
-
+
/**
* Ignore.
*/
@@ -982,7 +984,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
// streamhandler.pluginOutputStream has been closed.
}
}
-
+
/**
* Show status.
*/
@@ -998,11 +1000,11 @@ import com.sun.jndi.toolkit.url.UrlUtil;
// streamhandler.pluginOutputStream has been closed.
}
}
-
+
/**
- * Returns an incremental number (unique identifier) for a message.
+ * Returns an incremental number (unique identifier) for a message.
* If identifier hits Long.MAX_VALUE it loops back starting at 0.
- *
+ *
* @return A unique Long identifier for the request
*/
private static Long getRequestIdentifier() {
@@ -1010,7 +1012,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
if (requestIdentityCounter == Long.MAX_VALUE)
requestIdentityCounter = 0L;
-
+
return requestIdentityCounter++;
}
}
@@ -1020,7 +1022,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
Long reference = getRequestIdentifier();
PluginCallRequest request = requestFactory.getPluginCallRequest("window",
- "instance " + identifier + " reference " +
+ "instance " + identifier + " reference " +
+ reference + " " + "GetWindow", reference);
PluginDebug.debug ("STARTING postCallRequest");
@@ -1043,17 +1045,17 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug ("STARTING getWindow DONE");
return (Long) request.getObject();
}
-
+
// FIXME: make private, access via reflection.
public static Object getMember(long internal, String name)
{
AppletSecurityContextManager.getSecurityContext(0).store(name);
int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
Long reference = getRequestIdentifier();
-
+
// Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " GetMember " +
+ PluginCallRequest request = requestFactory.getPluginCallRequest("member",
+ "instance " + 0 + " reference " + reference + " GetMember " +
internal + " " + nameID, reference);
streamhandler.postCallRequest(request);
@@ -1073,14 +1075,14 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug (" getMember DONE");
return request.getObject();
}
-
+
public static void setMember(long internal, String name, Object value) {
System.err.println("Setting to class " + value.getClass() + ":" + value.getClass().isPrimitive());
AppletSecurityContextManager.getSecurityContext(0).store(name);
int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
Long reference = getRequestIdentifier();
- // work on a copy of value, as we don't want to be manipulating
+ // work on a copy of value, as we don't want to be manipulating
// complex objects
String valueToSetTo;
if (value instanceof java.lang.Byte ||
@@ -1094,23 +1096,23 @@ import com.sun.jndi.toolkit.url.UrlUtil;
valueToSetTo = "literalreturn " + value.toString();
- // Character -> Str results in str value.. we need int value as
+ // Character -> Str results in str value.. we need int value as
// per specs.
if (value instanceof java.lang.Character) {
- valueToSetTo = "literalreturn " + (int) ((java.lang.Character) value).charValue();
+ valueToSetTo = "literalreturn " + (int) ((java.lang.Character) value).charValue();
} else if (value instanceof Float ||
value instanceof Double) {
valueToSetTo = "literalreturn " + String.format("%308.308e", value);
- }
-
+ }
+
} else {
AppletSecurityContextManager.getSecurityContext(0).store(value);
valueToSetTo = Integer.toString(AppletSecurityContextManager.getSecurityContext(0).getIdentifier(value));
}
-
+
// Prefix with dummy instance for convenience.
PluginCallRequest request = requestFactory.getPluginCallRequest("void",
- "instance " + 0 + " reference " + reference + " SetMember " +
+ "instance " + 0 + " reference " + reference + " SetMember " +
internal + " " + nameID + " " + valueToSetTo, reference);
streamhandler.postCallRequest(request);
@@ -1130,13 +1132,13 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
PluginDebug.debug (" setMember DONE");
}
-
+
// FIXME: handle long index as well.
public static void setSlot(long internal, int index, Object value) {
AppletSecurityContextManager.getSecurityContext(0).store(value);
Long reference = getRequestIdentifier();
-
- // work on a copy of value, as we don't want to be manipulating
+
+ // work on a copy of value, as we don't want to be manipulating
// complex objects
String valueToSetTo;
if (value instanceof java.lang.Byte ||
@@ -1150,23 +1152,23 @@ import com.sun.jndi.toolkit.url.UrlUtil;
valueToSetTo = "literalreturn " + value.toString();
- // Character -> Str results in str value.. we need int value as
+ // Character -> Str results in str value.. we need int value as
// per specs.
if (value instanceof java.lang.Character) {
- valueToSetTo = "literalreturn " + (int) ((java.lang.Character) value).charValue();
+ valueToSetTo = "literalreturn " + (int) ((java.lang.Character) value).charValue();
} else if (value instanceof Float ||
value instanceof Double) {
valueToSetTo = "literalreturn " + String.format("%308.308e", value);
- }
-
+ }
+
} else {
AppletSecurityContextManager.getSecurityContext(0).store(value);
valueToSetTo = Integer.toString(AppletSecurityContextManager.getSecurityContext(0).getIdentifier(value));
}
-
+
// Prefix with dummy instance for convenience.
PluginCallRequest request = requestFactory.getPluginCallRequest("void",
- "instance " + 0 + " reference " + reference + " SetSlot " +
+ "instance " + 0 + " reference " + reference + " SetSlot " +
internal + " " + index + " " + valueToSetTo, reference);
streamhandler.postCallRequest(request);
@@ -1185,14 +1187,14 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
PluginDebug.debug (" setSlot DONE");
}
-
+
public static Object getSlot(long internal, int index)
{
Long reference = getRequestIdentifier();
// Prefix with dummy instance for convenience.
- PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " GetSlot " +
+ PluginCallRequest request = requestFactory.getPluginCallRequest("member",
+ "instance " + 0 + " reference " + reference + " GetSlot " +
internal + " " + index, reference);
streamhandler.postCallRequest(request);
streamhandler.write(request.getMessage());
@@ -1211,7 +1213,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug (" getSlot DONE");
return request.getObject();
}
-
+
public static Object eval(long internal, String s)
{
AppletSecurityContextManager.getSecurityContext(0).store(s);
@@ -1220,8 +1222,8 @@ import com.sun.jndi.toolkit.url.UrlUtil;
// Prefix with dummy instance for convenience.
// FIXME: rename GetMemberPluginCallRequest ObjectPluginCallRequest.
- PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " Eval " +
+ PluginCallRequest request = requestFactory.getPluginCallRequest("member",
+ "instance " + 0 + " reference " + reference + " Eval " +
internal + " " + stringID, reference);
streamhandler.postCallRequest(request);
streamhandler.write(request.getMessage());
@@ -1240,15 +1242,15 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug (" getSlot DONE");
return request.getObject();
}
-
+
public static void removeMember (long internal, String name) {
AppletSecurityContextManager.getSecurityContext(0).store(name);
int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
Long reference = getRequestIdentifier();
-
+
// Prefix with dummy instance for convenience.
PluginCallRequest request = requestFactory.getPluginCallRequest("void",
- "instance " + 0 + " reference " + reference + " RemoveMember " +
+ "instance " + 0 + " reference " + reference + " RemoveMember " +
internal + " " + nameID, reference);
streamhandler.postCallRequest(request);
@@ -1267,7 +1269,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
PluginDebug.debug (" RemoveMember DONE");
}
-
+
public static Object call(long internal, String name, Object args[])
{
// FIXME: when is this removed from the object store?
@@ -1276,7 +1278,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
AppletSecurityContextManager.getSecurityContext(0).store(name);
int nameID = AppletSecurityContextManager.getSecurityContext(0).getIdentifier(name);
Long reference = getRequestIdentifier();
-
+
String argIDs = "";
for (Object arg : args)
{
@@ -1284,10 +1286,10 @@ import com.sun.jndi.toolkit.url.UrlUtil;
argIDs += AppletSecurityContextManager.getSecurityContext(0).getIdentifier(arg) + " ";
}
argIDs = argIDs.trim();
-
+
// Prefix with dummy instance for convenience.
PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " Call " +
+ "instance " + 0 + " reference " + reference + " Call " +
internal + " " + nameID + " " + argIDs, reference);
streamhandler.postCallRequest(request);
@@ -1307,7 +1309,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug (" Call DONE");
return request.getObject();
}
-
+
public static Object requestPluginCookieInfo(URI uri) {
PluginCallRequest request;
@@ -1315,9 +1317,9 @@ import com.sun.jndi.toolkit.url.UrlUtil;
try
{
- String encodedURI = UrlUtil.encode(uri.toString(), "UTF-8");
+ String encodedURI = UrlUtil.encode(uri.toString(), "UTF-8");
request = requestFactory.getPluginCallRequest("cookieinfo",
- "plugin PluginCookieInfo " + "reference " + reference +
+ "plugin PluginCookieInfo " + "reference " + reference +
" " + encodedURI, reference);
} catch (UnsupportedEncodingException e)
@@ -1352,12 +1354,12 @@ import com.sun.jndi.toolkit.url.UrlUtil;
try {
- // there is no easy way to get SOCKS proxy info. So, we tell mozilla that we want proxy for
- // an HTTP uri in case of non http/ftp protocols. If we get back a SOCKS proxy, we can
+ // there is no easy way to get SOCKS proxy info. So, we tell mozilla that we want proxy for
+ // an HTTP uri in case of non http/ftp protocols. If we get back a SOCKS proxy, we can
// use that, if we get back an http proxy, we fallback to DIRECT connect
String scheme = uri.getScheme();
- String port = uri.getPort() != -1 ? ":" + uri.getPort() : "";
+ String port = uri.getPort() != -1 ? ":" + uri.getPort() : "";
if (!uri.getScheme().startsWith("http") && !uri.getScheme().equals("ftp"))
scheme = "http";
@@ -1369,7 +1371,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
PluginCallRequest request = requestFactory.getPluginCallRequest("proxyinfo",
- "plugin PluginProxyInfo reference " + reference + " " +
+ "plugin PluginProxyInfo reference " + reference + " " +
requestURI, reference);
PluginMessageConsumer.registerPriorityWait(reference);
@@ -1390,14 +1392,14 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug (" Call DONE");
return request.getObject();
}
-
+
public static void JavaScriptFinalize(long internal)
{
Long reference = getRequestIdentifier();
// Prefix with dummy instance for convenience.
PluginCallRequest request = requestFactory.getPluginCallRequest("void",
- "instance " + 0 + " reference " + reference + " Finalize " +
+ "instance " + 0 + " reference " + reference + " Finalize " +
internal, reference);
streamhandler.postCallRequest(request);
@@ -1416,14 +1418,14 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
PluginDebug.debug (" finalize DONE");
}
-
+
public static String javascriptToString(long internal)
{
Long reference = getRequestIdentifier();
// Prefix with dummy instance for convenience.
PluginCallRequest request = requestFactory.getPluginCallRequest("member",
- "instance " + 0 + " reference " + reference + " ToString " +
+ "instance " + 0 + " reference " + reference + " ToString " +
internal, reference);
streamhandler.postCallRequest(request);
@@ -1443,7 +1445,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
PluginDebug.debug (" ToString DONE");
return (String) request.getObject();
}
-
+
// FIXME: make this private and access it from JSObject using
// reflection.
private void write(String message) throws IOException {
@@ -1455,22 +1457,24 @@ import com.sun.jndi.toolkit.url.UrlUtil;
public void setStream(String key, InputStream stream)throws IOException{
// We do nothing.
}
-
+
+ @Override
public InputStream getStream(String key){
- // We do nothing.
- return null;
+ // We do nothing.
+ return null;
}
-
- public Iterator getStreamKeys(){
- // We do nothing.
- return null;
+
+ @Override
+ public Iterator<String> getStreamKeys(){
+ // We do nothing.
+ return null;
}
-
+
/**
* System parameters.
*/
- static Hashtable systemParam = new Hashtable();
-
+ static Hashtable<String,String> systemParam = new Hashtable<String,String>();
+
static {
systemParam.put("codebase", "codebase");
systemParam.put("code", "code");
@@ -1481,58 +1485,58 @@ import com.sun.jndi.toolkit.url.UrlUtil;
systemParam.put("vspace", "vspace");
systemParam.put("hspace", "hspace");
}
-
+
/**
* Print the HTML tag.
*/
- public static void printTag(PrintStream out, Hashtable atts) {
+ public static void printTag(PrintStream out, Hashtable<String,String> atts) {
out.print("<applet");
-
- String v = (String)atts.get("codebase");
+
+ String v = atts.get("codebase");
if (v != null) {
out.print(" codebase=\"" + v + "\"");
}
-
- v = (String)atts.get("code");
+
+ v = atts.get("code");
if (v == null) {
v = "applet.class";
}
out.print(" code=\"" + v + "\"");
- v = (String)atts.get("width");
+ v = atts.get("width");
if (v == null) {
v = "150";
}
out.print(" width=" + v);
-
- v = (String)atts.get("height");
+
+ v = atts.get("height");
if (v == null) {
v = "100";
}
out.print(" height=" + v);
-
- v = (String)atts.get("name");
+
+ v = atts.get("name");
if (v != null) {
out.print(" name=\"" + v + "\"");
}
out.println(">");
-
+
// A very slow sorting algorithm
int len = atts.size();
String params[] = new String[len];
len = 0;
- for (Enumeration e = atts.keys() ; e.hasMoreElements() ;) {
- String param = (String)e.nextElement();
+ for (Enumeration<String> e = atts.keys() ; e.hasMoreElements() ;) {
+ String param = e.nextElement();
int i = 0;
for (; i < len ; i++) {
- if (params[i].compareTo(param) >= 0) {
- break;
- }
+ if (params[i].compareTo(param) >= 0) {
+ break;
+ }
}
System.arraycopy(params, i, params, i + 1, len - i);
params[i] = param;
len++;
}
-
+
for (int i = 0 ; i < len ; i++) {
String param = params[i];
if (systemParam.get(param) == null) {
@@ -1542,19 +1546,19 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
out.println("</applet>");
}
-
+
/**
* Make sure the atrributes are uptodate.
*/
- public void updateAtts() {
- Dimension d = panel.size();
- Insets in = panel.insets();
- panel.atts.put("width",
- new Integer(d.width - (in.left + in.right)).toString());
- panel.atts.put("height",
- new Integer(d.height - (in.top + in.bottom)).toString());
- }
-
+ public void updateAtts() {
+ Dimension d = panel.getSize();
+ Insets in = panel.getInsets();
+ panel.atts.put("width",
+ Integer.valueOf(d.width - (in.left + in.right)).toString());
+ panel.atts.put("height",
+ Integer.valueOf(d.height - (in.top + in.bottom)).toString());
+ }
+
/**
* Restart the applet.
*/
@@ -1564,7 +1568,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
panel.sendEvent(AppletPanel.APPLET_INIT);
panel.sendEvent(AppletPanel.APPLET_START);
}
-
+
/**
* Reload the applet.
*/
@@ -1572,14 +1576,14 @@ import com.sun.jndi.toolkit.url.UrlUtil;
panel.sendEvent(AppletPanel.APPLET_STOP);
panel.sendEvent(AppletPanel.APPLET_DESTROY);
panel.sendEvent(AppletPanel.APPLET_DISPOSE);
-
+
/**
- * Fixed #4501142: Classlaoder sharing policy doesn't
+ * Fixed #4501142: Classlaoder sharing policy doesn't
* take "archive" into account. This will be overridden
* by Java Plug-in. [stanleyh]
*/
AppletPanel.flushClassLoader(panel.getClassLoaderCacheKey());
-
+
/*
* Make sure we don't have two threads running through the event queue
* at the same time.
@@ -1590,37 +1594,37 @@ import com.sun.jndi.toolkit.url.UrlUtil;
} catch (InterruptedException e) {
return; // abort the reload
}
-
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
+
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ public Void run() {
panel.createAppletThread();
return null;
}
- });
-
+ });
+
panel.sendEvent(AppletPanel.APPLET_LOAD);
panel.sendEvent(AppletPanel.APPLET_INIT);
panel.sendEvent(AppletPanel.APPLET_START);
}
-
+
public int print(Graphics graphics, PageFormat pf, int pageIndex) {
return Printable.NO_SUCH_PAGE;
}
-
+
/**
* Start the applet.
*/
void appletStart() {
panel.sendEvent(AppletPanel.APPLET_START);
}
-
+
/**
* Stop the applet.
*/
void appletStop() {
panel.sendEvent(AppletPanel.APPLET_STOP);
}
-
+
/**
* Shutdown a viewer.
* Stop, Destroy, Dispose and Quit a viewer
@@ -1631,7 +1635,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
p.sendEvent(AppletPanel.APPLET_DISPOSE);
p.sendEvent(AppletPanel.APPLET_QUIT);
}
-
+
/**
* Close this viewer.
* Stop, Destroy, Dispose and Quit an AppletView, then
@@ -1657,7 +1661,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
dispose();
if (tg.activeCount() > 0)
- tg.stop();
+ tg.stop();
if (countApplets() == 0) {
appletSystemExit();
@@ -1668,24 +1672,24 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}).start();
}
-
+
/**
* Exit the program.
* Exit from the program (if not stand alone) - do no clean-up
*/
private void appletSystemExit() {
- // Do nothing. Exit is handled by another
+ // Do nothing. Exit is handled by another
// block of code, called when _all_ applets are gone
}
-
+
/**
* How many applets are running?
*/
-
+
public static int countApplets() {
return appletPanels.size();
}
-
+
/**
* Scan spaces.
@@ -1693,39 +1697,39 @@ import com.sun.jndi.toolkit.url.UrlUtil;
public static void skipSpace(int[] c, Reader in) throws IOException {
while ((c[0] >= 0) &&
((c[0] == ' ') || (c[0] == '\t') || (c[0] == '\n') || (c[0] == '\r'))) {
- c[0] = in.read();
+ c[0] = in.read();
}
}
-
+
/**
* Scan identifier
*/
public static String scanIdentifier(int[] c, Reader in) throws IOException {
- StringBuffer buf = new StringBuffer();
-
- if (c[0] == '!') {
- // Technically, we should be scanning for '!--' but we are reading
- // from a stream, and there is no way to peek ahead. That said,
- // a ! at this point can only mean comment here afaik, so we
- // should be okay
- skipComment(c, in);
- return "";
- }
-
- while (true) {
- if (((c[0] >= 'a') && (c[0] <= 'z')) ||
- ((c[0] >= 'A') && (c[0] <= 'Z')) ||
- ((c[0] >= '0') && (c[0] <= '9')) || (c[0] == '_')) {
- buf.append((char)c[0]);
- c[0] = in.read();
- } else {
- return buf.toString();
- }
- }
+ StringBuilder buf = new StringBuilder();
+
+ if (c[0] == '!') {
+ // Technically, we should be scanning for '!--' but we are reading
+ // from a stream, and there is no way to peek ahead. That said,
+ // a ! at this point can only mean comment here afaik, so we
+ // should be okay
+ skipComment(c, in);
+ return "";
+ }
+
+ while (true) {
+ if (((c[0] >= 'a') && (c[0] <= 'z')) ||
+ ((c[0] >= 'A') && (c[0] <= 'Z')) ||
+ ((c[0] >= '0') && (c[0] <= '9')) || (c[0] == '_')) {
+ buf.append((char)c[0]);
+ c[0] = in.read();
+ } else {
+ return buf.toString();
+ }
+ }
}
public static void skipComment(int[] c, Reader in) throws IOException {
- StringBuffer buf = new StringBuffer();
+ StringBuilder buf = new StringBuilder();
boolean commentHeaderPassed = false;
c[0] = in.read();
buf.append((char)c[0]);
@@ -1758,42 +1762,42 @@ import com.sun.jndi.toolkit.url.UrlUtil;
buf.append((char)c[0]);
}
}
-
+
/**
* Scan tag
*/
- public static Hashtable scanTag(int[] c, Reader in) throws IOException {
- Hashtable atts = new Hashtable();
- skipSpace(c, in);
+ public static Hashtable<String,String> scanTag(int[] c, Reader in) throws IOException {
+ Hashtable<String,String> atts = new Hashtable<String,String>();
+ skipSpace(c, in);
while (c[0] >= 0 && c[0] != '>') {
- String att = scanIdentifier(c, in);
- String val = "";
- skipSpace(c, in);
- if (c[0] == '=') {
- int quote = -1;
- c[0] = in.read();
- skipSpace(c, in);
- if ((c[0] == '\'') || (c[0] == '\"')) {
- quote = c[0];
- c[0] = in.read();
- }
- StringBuffer buf = new StringBuffer();
+ String att = scanIdentifier(c, in);
+ String val = "";
+ skipSpace(c, in);
+ if (c[0] == '=') {
+ int quote = -1;
+ c[0] = in.read();
+ skipSpace(c, in);
+ if ((c[0] == '\'') || (c[0] == '\"')) {
+ quote = c[0];
+ c[0] = in.read();
+ }
+ StringBuilder buf = new StringBuilder();
while ((c[0] > 0) &&
- (((quote < 0) && (c[0] != ' ') && (c[0] != '\t') &&
+ (((quote < 0) && (c[0] != ' ') && (c[0] != '\t') &&
(c[0] != '\n') && (c[0] != '\r') && (c[0] != '>'))
- || ((quote >= 0) && (c[0] != quote)))) {
- buf.append((char)c[0]);
- c[0] = in.read();
- }
- if (c[0] == quote) {
- c[0] = in.read();
- }
- skipSpace(c, in);
- val = buf.toString();
- }
+ || ((quote >= 0) && (c[0] != quote)))) {
+ buf.append((char)c[0]);
+ c[0] = in.read();
+ }
+ if (c[0] == quote) {
+ c[0] = in.read();
+ }
+ skipSpace(c, in);
+ val = buf.toString();
+ }
- PluginDebug.debug("PUT " + att + " = '" + val + "'");
- atts.put(att.toLowerCase(java.util.Locale.ENGLISH), val);
+ PluginDebug.debug("PUT " + att + " = '" + val + "'");
+ atts.put(att.toLowerCase(java.util.Locale.ENGLISH), val);
while (true) {
if ((c[0] == '>') || (c[0] < 0) ||
@@ -1804,10 +1808,10 @@ import com.sun.jndi.toolkit.url.UrlUtil;
c[0] = in.read();
}
//skipSpace(in);
- }
- return atts;
+ }
+ return atts;
}
-
+
// private static final == inline
private static final boolean isInt(Object o) {
boolean isInt = false;
@@ -1820,15 +1824,15 @@ import com.sun.jndi.toolkit.url.UrlUtil;
return isInt;
}
-
+
/* values used for placement of AppletViewer's frames */
private static int x = 0;
private static int y = 0;
private static final int XDELTA = 30;
private static final int YDELTA = XDELTA;
-
+
static String encoding = null;
-
+
static private Reader makeReader(InputStream is) {
if (encoding != null) {
try {
@@ -1839,7 +1843,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
encoding = r.getEncoding();
return new BufferedReader(r);
}
-
+
/**
* Scan an html file for <applet> tags
*/
@@ -1848,35 +1852,27 @@ import com.sun.jndi.toolkit.url.UrlUtil;
encoding = enc;
parse(identifier, handle, width, height, in, url, System.out, new PluginAppletPanelFactory());
}
-
+
public static void parse(int identifier, long handle, String width, String height, Reader in, URL url)
- throws IOException {
-
+ throws PrivilegedActionException {
+
final int fIdentifier = identifier;
final long fHandle = handle;
final String fWidth = width;
final String fHeight = height;
final Reader fIn = in;
final URL fUrl = url;
- PrivilegedAction pa = new PrivilegedAction() {
- public Object run() {
- try {
- parse(fIdentifier, fHandle, fWidth, fHeight, fIn, fUrl, System.out, new PluginAppletPanelFactory());
- } catch (IOException ioe) {
- return ioe;
- }
+ AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
+ public Void run() throws IOException {
+ parse(fIdentifier, fHandle, fWidth, fHeight, fIn, fUrl,
+ System.out, new PluginAppletPanelFactory());
return null;
}
- };
-
- Object ret = AccessController.doPrivileged(pa);
- if (ret instanceof IOException) {
- throw (IOException) ret;
- }
+ });
}
-
- public static void parse(int identifier, long handle, String width,
- String height, Reader in, URL url,
+
+ public static void parse(int identifier, long handle, String width,
+ String height, Reader in, URL url,
PrintStream statusMsgStream,
PluginAppletPanelFactory factory)
throws IOException
@@ -1888,8 +1884,8 @@ import com.sun.jndi.toolkit.url.UrlUtil;
boolean objectTagAlreadyParsed = false;
// The current character
- // FIXME: This is an evil hack to force pass-by-reference.. the
- // parsing code needs to be rewritten from scratch to prevent such
+ // FIXME: This is an evil hack to force pass-by-reference.. the
+ // parsing code needs to be rewritten from scratch to prevent such
//a need
int[] c = new int[1];
@@ -1914,7 +1910,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
url = conn.getURL();
int ydisp = 1;
- Hashtable atts = null;
+ Hashtable<String,String> atts = null;
while(true) {
c[0] = in.read();
@@ -1944,11 +1940,11 @@ import com.sun.jndi.toolkit.url.UrlUtil;
// shouldn't be part of parsing. It's presence
// causes things to be a little too much of a
// hack.
-
+
// Let user know we are starting up
streamhandler.write("instance " + identifier + " status " + amh.getMessage("status.start"));
factory.createPanel(streamhandler, identifier, handle, x, y, url, atts);
-
+
x += XDELTA;
y += YDELTA;
// make sure we don't go too far!
@@ -1968,8 +1964,8 @@ import com.sun.jndi.toolkit.url.UrlUtil;
else {
String nm = scanIdentifier(c, in);
if (nm.equalsIgnoreCase("param")) {
- Hashtable t = scanTag(c, in);
- String att = (String)t.get("name");
+ Hashtable<String,String> t = scanTag(c, in);
+ String att = t.get("name");
if (atts.containsKey(att))
continue;
@@ -1977,7 +1973,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
if (att == null) {
statusMsgStream.println(requiresNameWarning);
} else {
- String val = (String)t.get("value");
+ String val = t.get("value");
if (val == null) {
statusMsgStream.println(requiresNameWarning);
} else if (atts != null) {
@@ -1993,13 +1989,14 @@ import com.sun.jndi.toolkit.url.UrlUtil;
atts = scanTag(c, in);
// If there is a classid and no code tag present, transform it to code tag
- if (atts.get("code") == null && atts.get("classid") != null && !((String) atts.get("classid")).startsWith("clsid:")) {
+ if (atts.get("code") == null && atts.get("classid") != null
+ && !(atts.get("classid")).startsWith("clsid:")) {
atts.put("code", atts.get("classid"));
}
-
+
// remove java: from code tag
- if (atts.get("code") != null && ((String) atts.get("code")).startsWith("java:")) {
- atts.put("code", ((String) atts.get("code")).substring(5));
+ if (atts.get("code") != null && (atts.get("code")).startsWith("java:")) {
+ atts.put("code", (atts.get("code")).substring(5));
}
if (atts.get("code") == null && atts.get("object") == null) {
@@ -2010,7 +2007,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
if (atts.get("width") == null || !isInt(atts.get("width"))) {
atts.put("width", width);
}
-
+
if (atts.get("height") == null || !isInt(atts.get("height"))) {
atts.put("height", height);
}
@@ -2025,19 +2022,20 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
// If there is a classid and no code tag present, transform it to code tag
- if (atts.get("code") == null && atts.get("classid") != null && !((String) atts.get("classid")).startsWith("clsid:")) {
+ if (atts.get("code") == null && atts.get("classid") != null
+ && !(atts.get("classid")).startsWith("clsid:")) {
atts.put("code", atts.get("classid"));
}
-
+
// remove java: from code tag
- if (atts.get("code") != null && ((String) atts.get("code")).startsWith("java:")) {
- atts.put("code", ((String) atts.get("code")).substring(5));
+ if (atts.get("code") != null && (atts.get("code")).startsWith("java:")) {
+ atts.put("code", (atts.get("code")).substring(5));
}
// java_* aliases override older names:
// http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/using_tags.html#in-ie
if (atts.get("java_code") != null) {
- atts.put("code", ((String) atts.get("java_code")));
+ atts.put("code", (atts.get("java_code")));
}
if (atts.containsKey("code")) {
@@ -2045,25 +2043,25 @@ import com.sun.jndi.toolkit.url.UrlUtil;
}
if (atts.get("java_codebase") != null) {
- atts.put("codebase", ((String) atts.get("java_codebase")));
+ atts.put("codebase", (atts.get("java_codebase")));
}
if (atts.get("java_archive") != null) {
- atts.put("archive", ((String) atts.get("java_archive")));
+ atts.put("archive", (atts.get("java_archive")));
}
if (atts.get("java_object") != null) {
- atts.put("object", ((String) atts.get("java_object")));
+ atts.put("object", (atts.get("java_object")));
}
if (atts.get("java_type") != null) {
- atts.put("type", ((String) atts.get("java_type")));
+ atts.put("type", (atts.get("java_type")));
}
if (atts.get("width") == null || !isInt(atts.get("width"))) {
atts.put("width", width);
}
-
+
if (atts.get("height") == null || !isInt(atts.get("height"))) {
atts.put("height", height);
}
@@ -2073,46 +2071,47 @@ import com.sun.jndi.toolkit.url.UrlUtil;
atts = scanTag(c, in);
// If there is a classid and no code tag present, transform it to code tag
- if (atts.get("code") == null && atts.get("classid") != null && !((String) atts.get("classid")).startsWith("clsid:")) {
+ if (atts.get("code") == null && atts.get("classid") != null
+ && !(atts.get("classid")).startsWith("clsid:")) {
atts.put("code", atts.get("classid"));
}
// remove java: from code tag
- if (atts.get("code") != null && ((String) atts.get("code")).startsWith("java:")) {
- atts.put("code", ((String) atts.get("code")).substring(5));
+ if (atts.get("code") != null && (atts.get("code")).startsWith("java:")) {
+ atts.put("code", (atts.get("code")).substring(5));
}
-
+
// java_* aliases override older names:
// http://java.sun.com/j2se/1.4.2/docs/guide/plugin/developer_guide/using_tags.html#in-nav
if (atts.get("java_code") != null) {
- atts.put("code", ((String) atts.get("java_code")));
+ atts.put("code", (atts.get("java_code")));
}
-
+
if (atts.get("java_codebase") != null) {
- atts.put("codebase", ((String) atts.get("java_codebase")));
+ atts.put("codebase", (atts.get("java_codebase")));
}
-
+
if (atts.get("java_archive") != null) {
- atts.put("archive", ((String) atts.get("java_archive")));
+ atts.put("archive", (atts.get("java_archive")));
}
-
+
if (atts.get("java_object") != null) {
- atts.put("object", ((String) atts.get("java_object")));
+ atts.put("object", (atts.get("java_object")));
}
-
+
if (atts.get("java_type") != null) {
- atts.put("type", ((String) atts.get("java_type")));
+ atts.put("type", (atts.get("java_type")));
}
if (atts.get("code") == null && atts.get("object") == null) {
statusMsgStream.println(embedRequiresCodeWarning);
atts = null;
}
-
+
if (atts.get("width") == null || !isInt(atts.get("width"))) {
atts.put("width", width);
}
-
+
if (atts.get("height") == null || !isInt(atts.get("height"))) {
atts.put("height", height);
}
@@ -2126,7 +2125,7 @@ import com.sun.jndi.toolkit.url.UrlUtil;
private static AppletMessageHandler amh = new AppletMessageHandler("appletviewer");
-
+
private static void checkConnect(URL url)
{
SecurityManager security = System.getSecurityManager();
@@ -2148,21 +2147,21 @@ import com.sun.jndi.toolkit.url.UrlUtil;
* {@inheritDoc}
*
* This method calls paint directly, rather than via super.update() since
- * the parent class's update() just does a couple of checks (both of
+ * the parent class's update() just does a couple of checks (both of
* which are accounted for) and then calls paint anyway.
*/
public void update(Graphics g) {
- // If the image or the graphics don't exist, create new ones
- if (bufFrameImg == null || bufFrameImgGraphics == null) {
- bufFrameImg = createImage(getWidth(), getHeight());
- bufFrameImgGraphics = bufFrameImg.getGraphics ();
- }
+ // If the image or the graphics don't exist, create new ones
+ if (bufFrameImg == null || bufFrameImgGraphics == null) {
+ bufFrameImg = createImage(getWidth(), getHeight());
+ bufFrameImgGraphics = bufFrameImg.getGraphics ();
+ }
- // Paint off-screen
- paint(bufFrameImgGraphics);
+ // Paint off-screen
+ paint(bufFrameImgGraphics);
- // Draw the painted image
- g.drawImage(bufFrameImg, 0, 0, this);
+ // Draw the painted image
+ g.drawImage(bufFrameImg, 0, 0, this);
}
}
diff --git a/plugin/icedteanp/java/sun/applet/PluginMain.java b/plugin/icedteanp/java/sun/applet/PluginMain.java
index 6c83ffd..6c4b1f4 100644
--- a/plugin/icedteanp/java/sun/applet/PluginMain.java
+++ b/plugin/icedteanp/java/sun/applet/PluginMain.java
@@ -88,136 +88,136 @@ public class PluginMain
public static final String PLUGIN_STDERR_FILE = "java.stderr";
public static final String PLUGIN_STDOUT_FILE = "java.stdout";
- final boolean redirectStreams = System.getenv().containsKey("ICEDTEAPLUGIN_DEBUG");
- static PluginStreamHandler streamHandler;
-
- // This is used in init(). Getting rid of this is desirable but depends
+ final boolean redirectStreams = System.getenv().containsKey("ICEDTEAPLUGIN_DEBUG");
+ static PluginStreamHandler streamHandler;
+
+ // This is used in init(). Getting rid of this is desirable but depends
// on whether the property that uses it is necessary/standard.
public static final String theVersion = System.getProperty("java.version");
-
+
private PluginAppletSecurityContext securityContext;
/**
* The main entry point into AppletViewer.
*/
public static void main(String args[])
- throws IOException
+ throws IOException
{
if (args.length != 2 || !(new File(args[0]).exists()) || !(new File(args[1]).exists())) {
System.err.println("Invalid pipe names provided. Refusing to proceed.");
System.exit(1);
}
- try {
- PluginMain pm = new PluginMain(args[0], args[1]);
- } catch (Exception e) {
- e.printStackTrace();
- System.err.println("Something very bad happened. I don't know what to do, so I am going to exit :(");
- System.exit(1);
- }
+ try {
+ PluginMain pm = new PluginMain(args[0], args[1]);
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.err.println("Something very bad happened. I don't know what to do, so I am going to exit :(");
+ System.exit(1);
+ }
}
public PluginMain(String inPipe, String outPipe) {
-
- connect(inPipe, outPipe);
+
+ connect(inPipe, outPipe);
// must be called before JNLPRuntime.initialize()
JNLPRuntime.setRedirectStreams(redirectStreams);
- securityContext = new PluginAppletSecurityContext(0);
- securityContext.prePopulateLCClasses();
- securityContext.setStreamhandler(streamHandler);
- AppletSecurityContextManager.addContext(0, securityContext);
+ securityContext = new PluginAppletSecurityContext(0);
+ securityContext.prePopulateLCClasses();
+ securityContext.setStreamhandler(streamHandler);
+ AppletSecurityContextManager.addContext(0, securityContext);
- PluginAppletViewer.setStreamhandler(streamHandler);
- PluginAppletViewer.setPluginCallRequestFactory(new PluginCallRequestFactory());
+ PluginAppletViewer.setStreamhandler(streamHandler);
+ PluginAppletViewer.setPluginCallRequestFactory(new PluginCallRequestFactory());
- init();
+ init();
- // Streams set. Start processing.
- streamHandler.startProcessing();
+ // Streams set. Start processing.
+ streamHandler.startProcessing();
}
- public void connect(String inPipe, String outPipe) {
- try {
- streamHandler = new PluginStreamHandler(new FileInputStream(inPipe), new FileOutputStream(outPipe));
- PluginDebug.debug("Streams initialized");
- } catch (IOException ioe) {
- ioe.printStackTrace();
- }
- }
-
- private static void init() {
- Properties avProps = new Properties();
-
- // ADD OTHER RANDOM PROPERTIES
- // XXX 5/18 need to revisit why these are here, is there some
- // standard for what is available?
-
- // Standard browser properties
- avProps.put("browser", "sun.applet.AppletViewer");
- avProps.put("browser.version", "1.06");
- avProps.put("browser.vendor", "Sun Microsystems Inc.");
- avProps.put("http.agent", "Java(tm) 2 SDK, Standard Edition v" + theVersion);
-
- // Define which packages can be extended by applets
- // XXX 5/19 probably not needed, not checked in AppletSecurity
- avProps.put("package.restrict.definition.java", "true");
- avProps.put("package.restrict.definition.sun", "true");
-
- // Define which properties can be read by applets.
- // A property named by "key" can be read only when its twin
- // property "key.applet" is true. The following ten properties
- // are open by default. Any other property can be explicitly
- // opened up by the browser user by calling appletviewer with
- // -J-Dkey.applet=true
- avProps.put("java.version.applet", "true");
- avProps.put("java.vendor.applet", "true");
- avProps.put("java.vendor.url.applet", "true");
- avProps.put("java.class.version.applet", "true");
- avProps.put("os.name.applet", "true");
- avProps.put("os.version.applet", "true");
- avProps.put("os.arch.applet", "true");
- avProps.put("file.separator.applet", "true");
- avProps.put("path.separator.applet", "true");
- avProps.put("line.separator.applet", "true");
-
- avProps.put("javaplugin.nodotversion", "160_17");
- avProps.put("javaplugin.version", "1.6.0_17");
- avProps.put("javaplugin.vm.options", "");
-
- // Read in the System properties. If something is going to be
- // over-written, warn about it.
- Properties sysProps = System.getProperties();
- for (Enumeration e = sysProps.propertyNames(); e.hasMoreElements(); ) {
- String key = (String) e.nextElement();
- String val = (String) sysProps.getProperty(key);
- avProps.setProperty(key, val);
- }
-
- // INSTALL THE PROPERTY LIST
- System.setProperties(avProps);
-
- // plug in a custom authenticator and proxy selector
- boolean installAuthenticator = Boolean.valueOf(JNLPRuntime.getConfiguration()
- .getProperty(DeploymentConfiguration.KEY_SECURITY_INSTALL_AUTHENTICATOR));
- if (installAuthenticator) {
- Authenticator.setDefault(new JNLPAuthenticator());
- }
+ public void connect(String inPipe, String outPipe) {
+ try {
+ streamHandler = new PluginStreamHandler(new FileInputStream(inPipe), new FileOutputStream(outPipe));
+ PluginDebug.debug("Streams initialized");
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ }
+
+ private static void init() {
+ Properties avProps = new Properties();
+
+ // ADD OTHER RANDOM PROPERTIES
+ // XXX 5/18 need to revisit why these are here, is there some
+ // standard for what is available?
+
+ // Standard browser properties
+ avProps.put("browser", "sun.applet.AppletViewer");
+ avProps.put("browser.version", "1.06");
+ avProps.put("browser.vendor", "Sun Microsystems Inc.");
+ avProps.put("http.agent", "Java(tm) 2 SDK, Standard Edition v" + theVersion);
+
+ // Define which packages can be extended by applets
+ // XXX 5/19 probably not needed, not checked in AppletSecurity
+ avProps.put("package.restrict.definition.java", "true");
+ avProps.put("package.restrict.definition.sun", "true");
+
+ // Define which properties can be read by applets.
+ // A property named by "key" can be read only when its twin
+ // property "key.applet" is true. The following ten properties
+ // are open by default. Any other property can be explicitly
+ // opened up by the browser user by calling appletviewer with
+ // -J-Dkey.applet=true
+ avProps.put("java.version.applet", "true");
+ avProps.put("java.vendor.applet", "true");
+ avProps.put("java.vendor.url.applet", "true");
+ avProps.put("java.class.version.applet", "true");
+ avProps.put("os.name.applet", "true");
+ avProps.put("os.version.applet", "true");
+ avProps.put("os.arch.applet", "true");
+ avProps.put("file.separator.applet", "true");
+ avProps.put("path.separator.applet", "true");
+ avProps.put("line.separator.applet", "true");
+
+ avProps.put("javaplugin.nodotversion", "160_17");
+ avProps.put("javaplugin.version", "1.6.0_17");
+ avProps.put("javaplugin.vm.options", "");
+
+ // Read in the System properties. If something is going to be
+ // over-written, warn about it.
+ Properties sysProps = System.getProperties();
+ for (Enumeration<?> e = sysProps.propertyNames(); e.hasMoreElements(); ) {
+ String key = (String) e.nextElement();
+ String val = sysProps.getProperty(key);
+ avProps.setProperty(key, val);
+ }
+
+ // INSTALL THE PROPERTY LIST
+ System.setProperties(avProps);
+
+ // plug in a custom authenticator and proxy selector
+ boolean installAuthenticator = Boolean.valueOf(JNLPRuntime.getConfiguration()
+ .getProperty(DeploymentConfiguration.KEY_SECURITY_INSTALL_AUTHENTICATOR));
+ if (installAuthenticator) {
+ Authenticator.setDefault(new JNLPAuthenticator());
+ }
// override the proxy selector set by JNLPRuntime
ProxySelector.setDefault(new PluginProxySelector());
-
+
CookieManager ckManager = new PluginCookieManager();
CookieHandler.setDefault(ckManager);
- }
+ }
static boolean messageAvailable() {
- return streamHandler.messageAvailable();
+ return streamHandler.messageAvailable();
}
static String getMessage() {
- return streamHandler.getMessage();
+ return streamHandler.getMessage();
}
-
+
}
diff --git a/plugin/icedteanp/java/sun/applet/PluginObjectStore.java b/plugin/icedteanp/java/sun/applet/PluginObjectStore.java
index b744744..9960211 100644
--- a/plugin/icedteanp/java/sun/applet/PluginObjectStore.java
+++ b/plugin/icedteanp/java/sun/applet/PluginObjectStore.java
@@ -43,9 +43,9 @@ import java.io.*;
public class PluginObjectStore
{
- private static HashMap<Integer, Object> objects = new HashMap();
- private static HashMap<Integer, Integer> counts = new HashMap();
- private static HashMap<Object, Integer> identifiers = new HashMap();
+ private static HashMap<Integer, Object> objects = new HashMap<Integer,Object>();
+ private static HashMap<Integer, Integer> counts = new HashMap<Integer,Integer>();
+ private static HashMap<Object, Integer> identifiers = new HashMap<Object,Integer>();
// FIXME:
//
// IF uniqueID == MAX_LONG, uniqueID =
@@ -70,16 +70,16 @@ public class PluginObjectStore
return 0;
return identifiers.get(object);
}
-
+
public boolean contains(Object object) {
- if (object == null)
- return identifiers.containsKey(object);
+ if (object == null)
+ return identifiers.containsKey(object);
- return false;
+ return false;
}
-
+
public boolean contains(int identifier) {
- return objects.containsKey(identifier);
+ return objects.containsKey(identifier);
}
public void reference(Object object) {
@@ -122,11 +122,11 @@ public class PluginObjectStore
}
public void dump() {
- Iterator i = objects.keySet().iterator();
- while (i.hasNext()) {
- Object key = i.next();
- PluginDebug.debug(key + "::" + objects.get(key));
- }
+ Iterator i = objects.keySet().iterator();
+ while (i.hasNext()) {
+ Object key = i.next();
+ PluginDebug.debug(key + "::" + objects.get(key));
+ }
}
}
diff --git a/plugin/icedteanp/java/sun/applet/PluginProxySelector.java b/plugin/icedteanp/java/sun/applet/PluginProxySelector.java
index f6a096f..36236ba 100644
--- a/plugin/icedteanp/java/sun/applet/PluginProxySelector.java
+++ b/plugin/icedteanp/java/sun/applet/PluginProxySelector.java
@@ -49,20 +49,20 @@ import net.sourceforge.jnlp.runtime.JNLPProxySelector;
/**
* Proxy selector implementation for plugin network functions.
- *
- * This class fetches proxy information from the web browser and
- * uses that information in the context of all network connection
+ *
+ * This class fetches proxy information from the web browser and
+ * uses that information in the context of all network connection
* (plugin specific and applet connections) as applicable
- *
+ *
*/
public class PluginProxySelector extends JNLPProxySelector {
- private TimedHashMap<String, Proxy> proxyCache = new TimedHashMap<String, Proxy>();
+ private TimedHashMap<String, Proxy> proxyCache = new TimedHashMap<String, Proxy>();
/**
* Selects the appropriate proxy (or DIRECT connection method) for the given URI
- *
+ *
* @param uri The URI being accessed
* @return A list of Proxy objects that are usable for this URI
*/
@@ -87,11 +87,11 @@ public class PluginProxySelector extends JNLPProxySelector {
if (o != null) {
PluginDebug.debug("Proxy URI = " + o);
URI proxyURI = (URI) o;
-
+
// If origin uri is http/ftp, we're good. If origin uri is not that, the proxy _must_ be socks, else we fallback to direct
if (uri.getScheme().startsWith("http") || uri.getScheme().equals("ftp") || proxyURI.getScheme().startsWith("socks")) {
- Proxy.Type type = proxyURI.getScheme().equals("http") ? Proxy.Type.HTTP : Proxy.Type.SOCKS;
+ Proxy.Type type = proxyURI.getScheme().equals("http") ? Proxy.Type.HTTP : Proxy.Type.SOCKS;
InetSocketAddress socketAddr = new InetSocketAddress(proxyURI.getHost(), proxyURI.getPort());
proxy = new Proxy(type, socketAddr);
@@ -113,14 +113,14 @@ public class PluginProxySelector extends JNLPProxySelector {
return proxyList;
}
- /**
- * Checks to see if proxy information is already cached.
- *
+ /**
+ * Checks to see if proxy information is already cached.
+ *
* @param uri The URI to check
- * @return The cached Proxy. null if there is no suitable cached proxy.
+ * @return The cached Proxy. null if there is no suitable cached proxy.
*/
private Proxy checkCache(URI uri) {
-
+
String uriKey = uri.getScheme() + "://" + uri.getHost();
if (proxyCache.get(uriKey) != null) {
return proxyCache.get(uriKey);
@@ -128,10 +128,10 @@ public class PluginProxySelector extends JNLPProxySelector {
return null;
}
-
+
/**
* Simple utility class that extends HashMap by adding an expiry to the entries.
- *
+ *
* This map stores entries, and returns them only if the entries were last accessed within time t=10 seconds
*
* @param <K> The key type
@@ -142,10 +142,10 @@ public class PluginProxySelector extends JNLPProxySelector {
HashMap<K, Long> timeStamps = new HashMap<K, Long>();
Long expiry = 10000L;
-
+
/**
* Store the item in the map and associate a timestamp with it
- *
+ *
* @param key The key
* @param value The value to store
*/
@@ -156,12 +156,13 @@ public class PluginProxySelector extends JNLPProxySelector {
/**
* Return cached item if it has not already expired.
- *
- * Before returning, this method also resets the "last accessed"
+ *
+ * Before returning, this method also resets the "last accessed"
* time for this entry, so it is good for another 10 seconds
- *
+ *
* @param key The key
*/
+ @SuppressWarnings("unchecked")
public V get(Object key) {
Long now = new Date().getTime();
@@ -169,7 +170,7 @@ public class PluginProxySelector extends JNLPProxySelector {
if (super.containsKey(key)) {
Long age = now - timeStamps.get(key);
- // Item exists. If it has not expired, renew its access time and return it
+ // Item exists. If it has not expired, renew its access time and return it
if (age <= expiry) {
PluginDebug.debug("Returning proxy " + super.get(key) + " from cache for " + key);
timeStamps.put((K) key, (new Date()).getTime());
@@ -177,10 +178,10 @@ public class PluginProxySelector extends JNLPProxySelector {
} else {
PluginDebug.debug("Proxy cache for " + key + " has expired (age=" + age/1000.0 + " seconds)");
}
- }
+ }
return null;
}
}
-
+
}