| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index a228a6f4999b6d02748aaac768944aaf10213f2c..8548b441e990d03ccf85cb79518e57d922791bb5 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -14023,3 +14023,77 @@ TEST(HasOwnProperty) {
|
| CHECK(instance->HasOwnProperty(v8_str("bar")));
|
| }
|
| }
|
| +
|
| +
|
| +void CheckCodeGenerationAllowed() {
|
| + Handle<Value> result = CompileRun("eval('42')");
|
| + CHECK_EQ(42, result->Int32Value());
|
| + result = CompileRun("(function(e) { return e('42'); })(eval)");
|
| + CHECK_EQ(42, result->Int32Value());
|
| + result = CompileRun("execScript('42')");
|
| + CHECK(!result.IsEmpty());
|
| + result = CompileRun("var f = new Function('return 42'); f()");
|
| + CHECK_EQ(42, result->Int32Value());
|
| +}
|
| +
|
| +
|
| +void CheckCodeGenerationDisallowed() {
|
| + TryCatch try_catch;
|
| +
|
| + Handle<Value> result = CompileRun("eval('42')");
|
| + CHECK(result.IsEmpty());
|
| + CHECK(try_catch.HasCaught());
|
| + try_catch.Reset();
|
| +
|
| + result = CompileRun("(function(e) { return e('42'); })(eval)");
|
| + CHECK(result.IsEmpty());
|
| + CHECK(try_catch.HasCaught());
|
| + try_catch.Reset();
|
| +
|
| + result = CompileRun("execScript('42')");
|
| + CHECK(result.IsEmpty());
|
| + CHECK(try_catch.HasCaught());
|
| + try_catch.Reset();
|
| +
|
| + result = CompileRun("var f = new Function('return 42'); f()");
|
| + CHECK(result.IsEmpty());
|
| + CHECK(try_catch.HasCaught());
|
| +}
|
| +
|
| +
|
| +bool CodeGenerationAllowed(Local<Context> context) {
|
| + ApiTestFuzzer::Fuzz();
|
| + return true;
|
| +}
|
| +
|
| +
|
| +bool CodeGenerationDisallowed(Local<Context> context) {
|
| + ApiTestFuzzer::Fuzz();
|
| + return false;
|
| +}
|
| +
|
| +
|
| +THREADED_TEST(AllowCodeGenFromStrings) {
|
| + v8::HandleScope scope;
|
| + LocalContext context;
|
| +
|
| + // eval, execScript and the Function constructor allowed by default.
|
| + CheckCodeGenerationAllowed();
|
| +
|
| + // Disallow eval, execScript and the Function constructor.
|
| + context->AllowCodeGenerationFromStrings(false);
|
| + CheckCodeGenerationDisallowed();
|
| +
|
| + // Allow again.
|
| + context->AllowCodeGenerationFromStrings(true);
|
| + CheckCodeGenerationAllowed();
|
| +
|
| + // Disallow but setting a global callback that will allow the calls.
|
| + context->AllowCodeGenerationFromStrings(false);
|
| + V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationAllowed);
|
| + CheckCodeGenerationAllowed();
|
| +
|
| + // Set a callback that disallows the code generation.
|
| + V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationDisallowed);
|
| + CheckCodeGenerationDisallowed();
|
| +}
|
|
|