mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-24 04:54:40 +02:00
Merge
This commit is contained in:
commit
ed18e742ce
5 changed files with 168 additions and 96 deletions
|
@ -52,11 +52,6 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
private final ScriptObject sobj;
|
private final ScriptObject sobj;
|
||||||
private final ScriptObject global;
|
private final ScriptObject global;
|
||||||
|
|
||||||
ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) {
|
|
||||||
this.sobj = sobj;
|
|
||||||
this.global = global;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(final Object other) {
|
public boolean equals(final Object other) {
|
||||||
if (other instanceof ScriptObjectMirror) {
|
if (other instanceof ScriptObjectMirror) {
|
||||||
|
@ -81,25 +76,6 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private <V> V inGlobal(final Callable<V> callable) {
|
|
||||||
final ScriptObject oldGlobal = NashornScriptEngine.getNashornGlobal();
|
|
||||||
final boolean globalChanged = (oldGlobal != global);
|
|
||||||
if (globalChanged) {
|
|
||||||
NashornScriptEngine.setNashornGlobal(global);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return callable.call();
|
|
||||||
} catch (final RuntimeException e) {
|
|
||||||
throw e;
|
|
||||||
} catch (final Exception e) {
|
|
||||||
throw new AssertionError("Cannot happen", e);
|
|
||||||
} finally {
|
|
||||||
if (globalChanged) {
|
|
||||||
NashornScriptEngine.setNashornGlobal(oldGlobal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSObject methods
|
// JSObject methods
|
||||||
@Override
|
@Override
|
||||||
public Object call(final String functionName, final Object... args) {
|
public Object call(final String functionName, final Object... args) {
|
||||||
|
@ -212,6 +188,8 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// javax.script.Bindings methods
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clear() {
|
public void clear() {
|
||||||
inGlobal(new Callable<Object>() {
|
inGlobal(new Callable<Object>() {
|
||||||
|
@ -379,7 +357,7 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
public Object getProto() {
|
public Object getProto() {
|
||||||
return inGlobal(new Callable<Object>() {
|
return inGlobal(new Callable<Object>() {
|
||||||
@Override public Object call() {
|
@Override public Object call() {
|
||||||
return wrap(getScriptObject().getProto(), global);
|
return wrap(sobj.getProto(), global);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -395,7 +373,7 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
public Object getOwnPropertyDescriptor(final String key) {
|
public Object getOwnPropertyDescriptor(final String key) {
|
||||||
return inGlobal(new Callable<Object>() {
|
return inGlobal(new Callable<Object>() {
|
||||||
@Override public Object call() {
|
@Override public Object call() {
|
||||||
return wrap(getScriptObject().getOwnPropertyDescriptor(key), global);
|
return wrap(sobj.getOwnPropertyDescriptor(key), global);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -409,7 +387,7 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
public String[] getOwnKeys(final boolean all) {
|
public String[] getOwnKeys(final boolean all) {
|
||||||
return inGlobal(new Callable<String[]>() {
|
return inGlobal(new Callable<String[]>() {
|
||||||
@Override public String[] call() {
|
@Override public String[] call() {
|
||||||
return getScriptObject().getOwnKeys(all);
|
return sobj.getOwnKeys(all);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -422,7 +400,7 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
public ScriptObjectMirror preventExtensions() {
|
public ScriptObjectMirror preventExtensions() {
|
||||||
return inGlobal(new Callable<ScriptObjectMirror>() {
|
return inGlobal(new Callable<ScriptObjectMirror>() {
|
||||||
@Override public ScriptObjectMirror call() {
|
@Override public ScriptObjectMirror call() {
|
||||||
getScriptObject().preventExtensions();
|
sobj.preventExtensions();
|
||||||
return ScriptObjectMirror.this;
|
return ScriptObjectMirror.this;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -435,7 +413,7 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
public boolean isExtensible() {
|
public boolean isExtensible() {
|
||||||
return inGlobal(new Callable<Boolean>() {
|
return inGlobal(new Callable<Boolean>() {
|
||||||
@Override public Boolean call() {
|
@Override public Boolean call() {
|
||||||
return getScriptObject().isExtensible();
|
return sobj.isExtensible();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -447,7 +425,7 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
public ScriptObjectMirror seal() {
|
public ScriptObjectMirror seal() {
|
||||||
return inGlobal(new Callable<ScriptObjectMirror>() {
|
return inGlobal(new Callable<ScriptObjectMirror>() {
|
||||||
@Override public ScriptObjectMirror call() {
|
@Override public ScriptObjectMirror call() {
|
||||||
getScriptObject().seal();
|
sobj.seal();
|
||||||
return ScriptObjectMirror.this;
|
return ScriptObjectMirror.this;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -460,7 +438,7 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
public boolean isSealed() {
|
public boolean isSealed() {
|
||||||
return inGlobal(new Callable<Boolean>() {
|
return inGlobal(new Callable<Boolean>() {
|
||||||
@Override public Boolean call() {
|
@Override public Boolean call() {
|
||||||
return getScriptObject().isSealed();
|
return sobj.isSealed();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -472,7 +450,7 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
public ScriptObjectMirror freeze() {
|
public ScriptObjectMirror freeze() {
|
||||||
return inGlobal(new Callable<ScriptObjectMirror>() {
|
return inGlobal(new Callable<ScriptObjectMirror>() {
|
||||||
@Override public ScriptObjectMirror call() {
|
@Override public ScriptObjectMirror call() {
|
||||||
getScriptObject().freeze();
|
sobj.freeze();
|
||||||
return ScriptObjectMirror.this;
|
return ScriptObjectMirror.this;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -485,7 +463,7 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
public boolean isFrozen() {
|
public boolean isFrozen() {
|
||||||
return inGlobal(new Callable<Boolean>() {
|
return inGlobal(new Callable<Boolean>() {
|
||||||
@Override public Boolean call() {
|
@Override public Boolean call() {
|
||||||
return getScriptObject().isFrozen();
|
return sobj.isFrozen();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -507,11 +485,38 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
|
|
||||||
return inGlobal(new Callable<Boolean>() {
|
return inGlobal(new Callable<Boolean>() {
|
||||||
@Override public Boolean call() {
|
@Override public Boolean call() {
|
||||||
return getScriptObject().isInstance(instance.getScriptObject());
|
return sobj.isInstance(instance.sobj);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* is this a function object?
|
||||||
|
*
|
||||||
|
* @return if this mirror wraps a ECMAScript function instance
|
||||||
|
*/
|
||||||
|
public boolean isFunction() {
|
||||||
|
return sobj instanceof ScriptFunction;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* is this a 'use strict' function object?
|
||||||
|
*
|
||||||
|
* @return true if this mirror represents a ECMAScript 'use strict' function
|
||||||
|
*/
|
||||||
|
public boolean isStrictFunction() {
|
||||||
|
return isFunction() && ((ScriptFunction)sobj).isStrict();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* is this an array object?
|
||||||
|
*
|
||||||
|
* @return if this mirror wraps a ECMAScript array object
|
||||||
|
*/
|
||||||
|
public boolean isArray() {
|
||||||
|
return sobj.isArray();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility to check if given object is ECMAScript undefined value
|
* Utility to check if given object is ECMAScript undefined value
|
||||||
*
|
*
|
||||||
|
@ -522,35 +527,6 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
return obj == ScriptRuntime.UNDEFINED;
|
return obj == ScriptRuntime.UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* is this a function object?
|
|
||||||
*
|
|
||||||
* @return if this mirror wraps a ECMAScript function instance
|
|
||||||
*/
|
|
||||||
public boolean isFunction() {
|
|
||||||
return getScriptObject() instanceof ScriptFunction;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* is this a 'use strict' function object?
|
|
||||||
*
|
|
||||||
* @return true if this mirror represents a ECMAScript 'use strict' function
|
|
||||||
*/
|
|
||||||
public boolean isStrictFunction() {
|
|
||||||
return isFunction() && ((ScriptFunction)getScriptObject()).isStrict();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* is this an array object?
|
|
||||||
*
|
|
||||||
* @return if this mirror wraps a ECMAScript array object
|
|
||||||
*/
|
|
||||||
public boolean isArray() {
|
|
||||||
return getScriptObject().isArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
// These are public only so that Context can access these.
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make a script object mirror on given object if needed.
|
* Make a script object mirror on given object if needed.
|
||||||
*
|
*
|
||||||
|
@ -621,6 +597,12 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
}
|
}
|
||||||
|
|
||||||
// package-privates below this.
|
// package-privates below this.
|
||||||
|
|
||||||
|
ScriptObjectMirror(final ScriptObject sobj, final ScriptObject global) {
|
||||||
|
this.sobj = sobj;
|
||||||
|
this.global = global;
|
||||||
|
}
|
||||||
|
|
||||||
ScriptObject getScriptObject() {
|
ScriptObject getScriptObject() {
|
||||||
return sobj;
|
return sobj;
|
||||||
}
|
}
|
||||||
|
@ -628,4 +610,25 @@ public final class ScriptObjectMirror extends JSObject implements Bindings {
|
||||||
static Object translateUndefined(Object obj) {
|
static Object translateUndefined(Object obj) {
|
||||||
return (obj == ScriptRuntime.UNDEFINED)? null : obj;
|
return (obj == ScriptRuntime.UNDEFINED)? null : obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// internals only below this.
|
||||||
|
private <V> V inGlobal(final Callable<V> callable) {
|
||||||
|
final ScriptObject oldGlobal = NashornScriptEngine.getNashornGlobal();
|
||||||
|
final boolean globalChanged = (oldGlobal != global);
|
||||||
|
if (globalChanged) {
|
||||||
|
NashornScriptEngine.setNashornGlobal(global);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return callable.call();
|
||||||
|
} catch (final RuntimeException e) {
|
||||||
|
throw e;
|
||||||
|
} catch (final Exception e) {
|
||||||
|
throw new AssertionError("Cannot happen", e);
|
||||||
|
} finally {
|
||||||
|
if (globalChanged) {
|
||||||
|
NashornScriptEngine.setNashornGlobal(oldGlobal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -526,11 +526,13 @@ public final class Context {
|
||||||
});
|
});
|
||||||
setGlobalTrusted(newGlobal);
|
setGlobalTrusted(newGlobal);
|
||||||
|
|
||||||
final Object[] wrapped = args == null? ScriptRuntime.EMPTY_ARRAY : ScriptObjectMirror.wrapArray(args, newGlobal);
|
final Object[] wrapped = args == null? ScriptRuntime.EMPTY_ARRAY : ScriptObjectMirror.wrapArray(args, oldGlobal);
|
||||||
newGlobal.put("arguments", ((GlobalObject)newGlobal).wrapAsObject(wrapped));
|
newGlobal.put("arguments", ((GlobalObject)newGlobal).wrapAsObject(wrapped));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return ScriptObjectMirror.wrap(load(newGlobal, from), newGlobal);
|
// wrap objects from newGlobal's world as mirrors - but if result
|
||||||
|
// is from oldGlobal's world, unwrap it!
|
||||||
|
return ScriptObjectMirror.unwrap(ScriptObjectMirror.wrap(load(newGlobal, from), newGlobal), oldGlobal);
|
||||||
} finally {
|
} finally {
|
||||||
setGlobalTrusted(oldGlobal);
|
setGlobalTrusted(oldGlobal);
|
||||||
}
|
}
|
||||||
|
|
54
nashorn/test/script/basic/JDK-8020463.js
Normal file
54
nashorn/test/script/basic/JDK-8020463.js
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JDK-8020463: Input argument array wrapping in loadWithNewGlobal is wrong
|
||||||
|
*
|
||||||
|
* @test
|
||||||
|
* @run
|
||||||
|
*/
|
||||||
|
|
||||||
|
loadWithNewGlobal({
|
||||||
|
name: "test",
|
||||||
|
script: "arguments[0]();"
|
||||||
|
}, func);
|
||||||
|
|
||||||
|
function func() {
|
||||||
|
try {
|
||||||
|
foo;
|
||||||
|
} catch (e) {
|
||||||
|
if (! (e instanceof ReferenceError)) {
|
||||||
|
fail("FAILED: expected ReferenceError!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// identity
|
||||||
|
var result = loadWithNewGlobal({
|
||||||
|
name: "test2",
|
||||||
|
script: "arguments[0]"
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
if (result !== this) {
|
||||||
|
fail("FAILED: expected global to be returned 'as is'");
|
||||||
|
}
|
|
@ -27,7 +27,10 @@ package jdk.nashorn.api.scripting;
|
||||||
|
|
||||||
import static org.testng.Assert.fail;
|
import static org.testng.Assert.fail;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import javax.script.Invocable;
|
||||||
import javax.script.ScriptEngine;
|
import javax.script.ScriptEngine;
|
||||||
|
import javax.script.ScriptException;
|
||||||
import javax.script.ScriptEngineManager;
|
import javax.script.ScriptEngineManager;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
@ -44,6 +47,7 @@ public class ScriptEngineSecurityTest {
|
||||||
public void securityPackagesTest() {
|
public void securityPackagesTest() {
|
||||||
if (System.getSecurityManager() == null) {
|
if (System.getSecurityManager() == null) {
|
||||||
// pass vacuously
|
// pass vacuously
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ScriptEngineManager m = new ScriptEngineManager();
|
final ScriptEngineManager m = new ScriptEngineManager();
|
||||||
|
@ -64,6 +68,7 @@ public class ScriptEngineSecurityTest {
|
||||||
public void securityJavaTypeTest() {
|
public void securityJavaTypeTest() {
|
||||||
if (System.getSecurityManager() == null) {
|
if (System.getSecurityManager() == null) {
|
||||||
// pass vacuously
|
// pass vacuously
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ScriptEngineManager m = new ScriptEngineManager();
|
final ScriptEngineManager m = new ScriptEngineManager();
|
||||||
|
@ -84,6 +89,7 @@ public class ScriptEngineSecurityTest {
|
||||||
public void securityClassForNameTest() {
|
public void securityClassForNameTest() {
|
||||||
if (System.getSecurityManager() == null) {
|
if (System.getSecurityManager() == null) {
|
||||||
// pass vacuously
|
// pass vacuously
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ScriptEngineManager m = new ScriptEngineManager();
|
final ScriptEngineManager m = new ScriptEngineManager();
|
||||||
|
@ -104,6 +110,7 @@ public class ScriptEngineSecurityTest {
|
||||||
public void securitySystemExit() {
|
public void securitySystemExit() {
|
||||||
if (System.getSecurityManager() == null) {
|
if (System.getSecurityManager() == null) {
|
||||||
// pass vacuously
|
// pass vacuously
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ScriptEngineManager m = new ScriptEngineManager();
|
final ScriptEngineManager m = new ScriptEngineManager();
|
||||||
|
@ -124,6 +131,7 @@ public class ScriptEngineSecurityTest {
|
||||||
public void securitySystemLoadLibrary() {
|
public void securitySystemLoadLibrary() {
|
||||||
if (System.getSecurityManager() == null) {
|
if (System.getSecurityManager() == null) {
|
||||||
// pass vacuously
|
// pass vacuously
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ScriptEngineManager m = new ScriptEngineManager();
|
final ScriptEngineManager m = new ScriptEngineManager();
|
||||||
|
@ -139,4 +147,40 @@ public class ScriptEngineSecurityTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
/**
|
||||||
|
* Check that script can't implement sensitive package interfaces.
|
||||||
|
*/
|
||||||
|
public void checkSensitiveInterfaceImplTest() throws ScriptException {
|
||||||
|
if (System.getSecurityManager() == null) {
|
||||||
|
// pass vacuously
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final ScriptEngineManager m = new ScriptEngineManager();
|
||||||
|
final ScriptEngine e = m.getEngineByName("nashorn");
|
||||||
|
final Object[] holder = new Object[1];
|
||||||
|
e.put("holder", holder);
|
||||||
|
// put an empty script object into array
|
||||||
|
e.eval("holder[0] = {}");
|
||||||
|
// holder[0] is an object of some subclass of ScriptObject
|
||||||
|
Class ScriptObjectClass = holder[0].getClass().getSuperclass();
|
||||||
|
Class PropertyAccessClass = ScriptObjectClass.getInterfaces()[0];
|
||||||
|
// implementation methods for PropertyAccess class
|
||||||
|
e.eval("function set() {}; function get() {}; function getInt(){} " +
|
||||||
|
"function getDouble(){}; function getLong() {}; " +
|
||||||
|
"this.delete = function () {}; function has() {}; " +
|
||||||
|
"function hasOwnProperty() {}");
|
||||||
|
|
||||||
|
// get implementation of a restricted package interface
|
||||||
|
try {
|
||||||
|
log(Objects.toString(((Invocable)e).getInterface((Class<?>)PropertyAccessClass)));
|
||||||
|
fail("should have thrown SecurityException");
|
||||||
|
} catch (final Exception exp) {
|
||||||
|
if (! (exp instanceof SecurityException)) {
|
||||||
|
fail("SecurityException expected, got " + exp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -945,35 +945,4 @@ public class ScriptEngineTest {
|
||||||
Assert.assertEquals(itf.test1(42, "a", "b"), "i == 42, strings instanceof java.lang.String[] == true, strings == [a, b]");
|
Assert.assertEquals(itf.test1(42, "a", "b"), "i == 42, strings instanceof java.lang.String[] == true, strings == [a, b]");
|
||||||
Assert.assertEquals(itf.test2(44, "c", "d", "e"), "arguments[0] == 44, arguments[1] instanceof java.lang.String[] == true, arguments[1] == [c, d, e]");
|
Assert.assertEquals(itf.test2(44, "c", "d", "e"), "arguments[0] == 44, arguments[1] instanceof java.lang.String[] == true, arguments[1] == [c, d, e]");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
/**
|
|
||||||
* Check that script can't implement sensitive package interfaces.
|
|
||||||
*/
|
|
||||||
public void checkSensitiveInterfaceImplTest() throws ScriptException {
|
|
||||||
final ScriptEngineManager m = new ScriptEngineManager();
|
|
||||||
final ScriptEngine e = m.getEngineByName("nashorn");
|
|
||||||
final Object[] holder = new Object[1];
|
|
||||||
e.put("holder", holder);
|
|
||||||
// put an empty script object into array
|
|
||||||
e.eval("holder[0] = {}");
|
|
||||||
// holder[0] is an object of some subclass of ScriptObject
|
|
||||||
Class ScriptObjectClass = holder[0].getClass().getSuperclass();
|
|
||||||
Class PropertyAccessClass = ScriptObjectClass.getInterfaces()[0];
|
|
||||||
// implementation methods for PropertyAccess class
|
|
||||||
e.eval("function set() {}; function get() {}; function getInt(){} " +
|
|
||||||
"function getDouble(){}; function getLong() {}; " +
|
|
||||||
"this.delete = function () {}; function has() {}; " +
|
|
||||||
"function hasOwnProperty() {}");
|
|
||||||
|
|
||||||
// get implementation of a restricted package interface
|
|
||||||
try {
|
|
||||||
log(Objects.toString(((Invocable)e).getInterface((Class<?>)PropertyAccessClass)));
|
|
||||||
fail("should have thrown SecurityException");
|
|
||||||
} catch (final Exception exp) {
|
|
||||||
if (! (exp instanceof SecurityException)) {
|
|
||||||
fail("SecurityException expected, got " + exp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue