diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | plugin/icedteanp/java/sun/applet/PluginAppletSecurityContext.java | 27 | ||||
-rw-r--r-- | tests/netx/unit/sun/applet/PluginAppletSecurityContextTest.java | 185 |
3 files changed, 216 insertions, 9 deletions
@@ -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")); + } +} |