aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java27
-rw-r--r--tests/netx/unit/sun/applet/PluginAppletSecurityContextTest.java185
3 files changed, 216 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 262eefa..1846838 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2013-01-15 Adam Domurad <[email protected]>
+ Unit test for PluginAppletSecurityContext#toObjectIDString. Make
+ PluginAppletSecurityContext more unit-testable.
+ * plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java:
+ Don't initialize security manager in constructor. Fix a few Java->JS
+ corner cases.
+ * plugin/icedteanp/java/sun/applet/PluginMain.java: Create testing-only
+ constructor for bypassing initialization of SecurityManager.
+ * tests/netx/unit/sun/applet/PluginAppletSecurityContextTest.java:
+ Unit test for all the corner cases of converting a Java object to a
+ string that can be precisely identified.
+
+2013-01-15 Adam Domurad <[email protected]>
+
Fix PR1198: JSObject passed incorrectly to Javascript
* plugin/icedteanp/IcedTeaJavaRequestProcessor.cc: Pass extra data for
'jsobject' object result messages.
diff --git a/plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java b/plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java
index a015884..ec4dd47 100644
--- a/plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java
+++ b/plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java
@@ -238,18 +238,23 @@ public class PluginAppletSecurityContext {
long startTime = 0;
- public PluginAppletSecurityContext(int identifier) {
+ /* Package-private constructor that allows for bypassing security manager installation.
+ * This is useful for testing. Note that while the public constructor should be used otherwise,
+ * the security installation can't be bypassed if it has already occurred.*/
+ PluginAppletSecurityContext(int identifier, boolean ensureSecurityContext) {
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.setDefaultLaunchHandler(new DefaultLaunchHandler(System.err));
- }
+ if (ensureSecurityContext) {
+ // 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.setDefaultLaunchHandler(new DefaultLaunchHandler(System.err));
+ }
- JNLPRuntime.disableExit();
+ JNLPRuntime.disableExit();
+ }
URL u = null;
try {
@@ -261,6 +266,10 @@ public class PluginAppletSecurityContext {
this.classLoaders.put(liveconnectLoader, u);
}
+ public PluginAppletSecurityContext(int identifier) {
+ this(identifier, true);
+ }
+
private static <V> V parseCall(String s, ClassLoader cl, Class<V> c) {
if (c == Integer.class)
return c.cast(new Integer(s));
diff --git a/tests/netx/unit/sun/applet/PluginAppletSecurityContextTest.java b/tests/netx/unit/sun/applet/PluginAppletSecurityContextTest.java
new file mode 100644
index 0000000..23a619e
--- /dev/null
+++ b/tests/netx/unit/sun/applet/PluginAppletSecurityContextTest.java
@@ -0,0 +1,185 @@
+package sun.applet;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
+
+import netscape.javascript.JSObject;
+
+import org.junit.Test;
+
+public class PluginAppletSecurityContextTest {
+
+ private static PluginAppletSecurityContext dummySecurityContext() {
+ return new PluginAppletSecurityContext(0, false);
+ }
+
+ @Test
+ public void toIDStringNullTest() {
+ PluginAppletSecurityContext pasc = dummySecurityContext();
+ assertEquals("literalreturn null",
+ pasc.toObjectIDString(null, Object.class, false));
+ }
+
+ @Test
+ public void toIDStringVoidTest() {
+ PluginAppletSecurityContext pasc = dummySecurityContext();
+ assertEquals("literalreturn void",
+ pasc.toObjectIDString(null, Void.TYPE, false));
+
+ assertFalse("literalreturn void".equals(pasc.toObjectIDString(null,
+ Void.class, false)));
+ }
+
+ @Test
+ public void toIDStringIntegralTest() {
+ // NB: the special .TYPE classes here represent primitives
+ PluginAppletSecurityContext pasc = dummySecurityContext();
+
+ // Test both unboxing allowed and not allowed to be sure it doesn't
+ // alter result
+ // although it really shouldn't
+ for (boolean unboxPrimitives : new Boolean[] { false, true }) {
+ assertEquals("literalreturn true", pasc.toObjectIDString(
+ new Boolean(true), Boolean.TYPE, unboxPrimitives));
+
+ assertEquals("literalreturn 1", pasc.toObjectIDString(new Byte(
+ (byte) 1), Byte.TYPE, unboxPrimitives));
+
+ assertEquals("literalreturn 1", pasc.toObjectIDString(
+ new Character((char) 1), Character.TYPE, unboxPrimitives));
+
+ assertEquals("literalreturn 1", pasc.toObjectIDString(new Short(
+ (short) 1), Short.TYPE, unboxPrimitives));
+
+ assertEquals("literalreturn 1", pasc.toObjectIDString(
+ new Integer(1), Integer.TYPE, unboxPrimitives));
+
+ assertEquals("literalreturn 1", pasc.toObjectIDString(new Long(1),
+ Long.TYPE, unboxPrimitives));
+ }
+ }
+
+ @Test
+ public void toIDStringBoxedIntegralNoUnboxingTest() {
+ PluginAppletSecurityContext pasc = dummySecurityContext();
+
+ assertFalse("literalreturn true".equals(pasc.toObjectIDString(
+ new Boolean(true), Boolean.class, false)));
+
+ assertFalse("literalreturn 1".equals(pasc.toObjectIDString(new Byte(
+ (byte) 1), Byte.class, false)));
+
+ assertFalse("literalreturn 1".equals(pasc.toObjectIDString(
+ new Character((char) 1), Character.class, false)));
+
+ assertFalse("literalreturn 1".equals(pasc.toObjectIDString(new Short(
+ (short) 1), Short.class, false)));
+
+ assertFalse("literalreturn 1".equals(pasc.toObjectIDString(new Integer(
+ 1), Integer.class, false)));
+
+ assertFalse("literalreturn 1".equals(pasc.toObjectIDString(new Long(1),
+ Long.class, false)));
+ }
+
+ @Test
+ public void toIDStringBoxedIntegralWithUnboxingTest() {
+ PluginAppletSecurityContext pasc = dummySecurityContext();
+
+ assertEquals("literalreturn true",
+ pasc.toObjectIDString(new Boolean(true), Boolean.class, true));
+
+ assertEquals("literalreturn 1",
+ pasc.toObjectIDString(new Byte((byte) 1), Byte.class, true));
+
+ assertEquals("literalreturn 1", pasc.toObjectIDString(new Character(
+ (char) 1), Character.class, true));
+
+ assertEquals("literalreturn 1",
+ pasc.toObjectIDString(new Short((short) 1), Short.class, true));
+
+ assertEquals("literalreturn 1",
+ pasc.toObjectIDString(new Integer(1), Integer.class, true));
+
+ assertEquals("literalreturn 1",
+ pasc.toObjectIDString(new Long(1), Long.class, true));
+ }
+
+ @Test
+ public void toIDStringFloatingPoint() {
+ final int prefixLength = "literalreturn ".length();
+
+ // NB: the special .TYPE classes here represent primitives
+ PluginAppletSecurityContext pasc = dummySecurityContext();
+
+ // Test both unboxing allowed and not allowed to be sure it doesn't
+ // alter result
+ // although it really shouldn't
+ for (boolean unboxPrimitives : new Boolean[] { false, true }) {
+ {
+ final float testFloat = 3.141592f;
+ String idString = pasc.toObjectIDString(new Float(testFloat),
+ Float.TYPE, unboxPrimitives);
+ String floatRepr = idString.substring(prefixLength);
+ assertTrue(testFloat == Float.parseFloat(floatRepr));
+ }
+ {
+ final double testDouble = 3.141592;
+ String idString = pasc.toObjectIDString(new Double(testDouble),
+ Double.TYPE, unboxPrimitives);
+ String doubleRepr = idString.substring(prefixLength);
+ assertTrue(testDouble == Double.parseDouble(doubleRepr));
+ }
+
+ }
+ {
+ final float testFloat = 3.141592f;
+ String idString = pasc.toObjectIDString(new Float(testFloat),
+ Float.class, true);
+ String floatRepr = idString.substring(prefixLength);
+ assertTrue(testFloat == Float.parseFloat(floatRepr));
+ }
+ {
+ final double testDouble = 3.141592;
+ String idString = pasc.toObjectIDString(new Double(testDouble),
+ Double.class, true);
+ String doubleRepr = idString.substring(prefixLength);
+ assertTrue(testDouble == Double.parseDouble(doubleRepr));
+ }
+ {
+ final float testFloat = 3.141592f;
+ String idString = pasc.toObjectIDString(new Float(testFloat),
+ Float.class, false);
+ assertFalse(idString.startsWith("literalreturn "));
+ }
+ {
+ final double testDouble = 3.141592;
+ String idString = pasc.toObjectIDString(new Double(testDouble),
+ Double.class, false);
+ assertFalse(idString.startsWith("literalreturn "));
+ }
+ }
+
+ // FIXME: How can we get the permissions to do this?
+ // @Test
+ // public void toIDStringJSObject() {
+ // PluginAppletSecurityContext pasc = dummySecurityContext();
+ //
+ // long testReference = 1;
+ // assertEquals("literalreturn 1", pasc.toObjectIDString(new JSObject(
+ // testReference), JSObject.class, false));
+ // }
+
+ @Test
+ public void toIDStringArbitraryObject() {
+ PluginAppletSecurityContext pasc = dummySecurityContext();
+
+ final Object testObject = new Object();
+ String idString = pasc.toObjectIDString(testObject,
+ testObject.getClass(), false);
+
+ assertFalse(idString.startsWith("literalreturn"));
+ assertFalse(idString.startsWith("jsobject"));
+ }
+}