Avoid allocations in Object.observe access check tests
BUG=v8:2907 R=mstarzinger@chromium.org Review URL: https://codereview.chromium.org/24999007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17090 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
7f6270dbf2
commit
e5f2d0f7bd
@ -34,11 +34,6 @@
|
|||||||
# BUG(382): Weird test. Can't guarantee that it never times out.
|
# BUG(382): Weird test. Can't guarantee that it never times out.
|
||||||
'test-api/ApplyInterruption': [PASS, TIMEOUT],
|
'test-api/ApplyInterruption': [PASS, TIMEOUT],
|
||||||
|
|
||||||
# BUG(2907): Allocation while in DisallowHeapAllocation scope.
|
|
||||||
'test-object-observe/NamedAccessCheck': [SKIP],
|
|
||||||
'test-object-observe/DisallowAllForAccessKeys': [SKIP],
|
|
||||||
'test-object-observe/AccessCheckDisallowApiModifications': [SKIP],
|
|
||||||
|
|
||||||
# TODO(mstarzinger): Fail gracefully on multiple V8::Dispose calls.
|
# TODO(mstarzinger): Fail gracefully on multiple V8::Dispose calls.
|
||||||
'test-api/InitializeAndDisposeOnce': [SKIP],
|
'test-api/InitializeAndDisposeOnce': [SKIP],
|
||||||
'test-api/InitializeAndDisposeMultiple': [SKIP],
|
'test-api/InitializeAndDisposeMultiple': [SKIP],
|
||||||
|
@ -465,34 +465,32 @@ static bool IndexedAccessAlwaysAllowed(Local<Object>, uint32_t, AccessType,
|
|||||||
|
|
||||||
|
|
||||||
static AccessType g_access_block_type = ACCESS_GET;
|
static AccessType g_access_block_type = ACCESS_GET;
|
||||||
|
static const uint32_t kBlockedContextIndex = 1337;
|
||||||
|
|
||||||
|
|
||||||
static bool NamedAccessAllowUnlessBlocked(Local<Object> host,
|
static bool NamedAccessAllowUnlessBlocked(Local<Object> host,
|
||||||
Local<Value> key,
|
Local<Value> key,
|
||||||
AccessType type,
|
AccessType type,
|
||||||
Local<Value>) {
|
Local<Value> data) {
|
||||||
if (type != g_access_block_type) return true;
|
if (type != g_access_block_type) return true;
|
||||||
v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(
|
v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(
|
||||||
Utils::OpenHandle(*host)->GetIsolate());
|
Utils::OpenHandle(*host)->GetIsolate());
|
||||||
Handle<Object> global = isolate->GetCurrentContext()->Global();
|
Handle<Object> global = isolate->GetCurrentContext()->Global();
|
||||||
Handle<Value> blacklist = global->Get(String::New("blacklist"));
|
if (!global->Has(kBlockedContextIndex)) return true;
|
||||||
if (!blacklist->IsObject()) return true;
|
return !key->IsString() || !key->Equals(data);
|
||||||
if (key->IsString()) return !blacklist.As<Object>()->Has(key);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool IndexedAccessAllowUnlessBlocked(Local<Object> host,
|
static bool IndexedAccessAllowUnlessBlocked(Local<Object> host,
|
||||||
uint32_t index,
|
uint32_t index,
|
||||||
AccessType type,
|
AccessType type,
|
||||||
Local<Value>) {
|
Local<Value> data) {
|
||||||
if (type != ACCESS_GET) return true;
|
if (type != g_access_block_type) return true;
|
||||||
v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(
|
v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(
|
||||||
Utils::OpenHandle(*host)->GetIsolate());
|
Utils::OpenHandle(*host)->GetIsolate());
|
||||||
Handle<Object> global = isolate->GetCurrentContext()->Global();
|
Handle<Object> global = isolate->GetCurrentContext()->Global();
|
||||||
Handle<Value> blacklist = global->Get(String::New("blacklist"));
|
if (!global->Has(kBlockedContextIndex)) return true;
|
||||||
if (!blacklist->IsObject()) return true;
|
return index != data->Uint32Value();
|
||||||
return !blacklist.As<Object>()->Has(index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -501,20 +499,20 @@ static bool BlockAccessKeys(Local<Object> host, Local<Value> key,
|
|||||||
v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(
|
v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(
|
||||||
Utils::OpenHandle(*host)->GetIsolate());
|
Utils::OpenHandle(*host)->GetIsolate());
|
||||||
Handle<Object> global = isolate->GetCurrentContext()->Global();
|
Handle<Object> global = isolate->GetCurrentContext()->Global();
|
||||||
Handle<Value> blacklist = global->Get(String::New("blacklist"));
|
return type != ACCESS_KEYS || !global->Has(kBlockedContextIndex);
|
||||||
if (!blacklist->IsObject()) return true;
|
|
||||||
return type != ACCESS_KEYS ||
|
|
||||||
!blacklist.As<Object>()->Has(String::New("__block_access_keys"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static Handle<Object> CreateAccessCheckedObject(
|
static Handle<Object> CreateAccessCheckedObject(
|
||||||
NamedSecurityCallback namedCallback,
|
NamedSecurityCallback namedCallback,
|
||||||
IndexedSecurityCallback indexedCallback) {
|
IndexedSecurityCallback indexedCallback,
|
||||||
|
Handle<Value> data = Handle<Value>()) {
|
||||||
Handle<ObjectTemplate> tmpl = ObjectTemplate::New();
|
Handle<ObjectTemplate> tmpl = ObjectTemplate::New();
|
||||||
tmpl->SetAccessCheckCallbacks(namedCallback, indexedCallback);
|
tmpl->SetAccessCheckCallbacks(namedCallback, indexedCallback, data);
|
||||||
Handle<Object> instance = tmpl->NewInstance();
|
Handle<Object> instance = tmpl->NewInstance();
|
||||||
instance->CreationContext()->Global()->Set(String::New("obj"), instance);
|
Handle<Object> global = instance->CreationContext()->Global();
|
||||||
|
global->Set(String::New("obj"), instance);
|
||||||
|
global->Set(kBlockedContextIndex, v8::True());
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -527,10 +525,11 @@ TEST(NamedAccessCheck) {
|
|||||||
LocalContext context(isolate.GetIsolate());
|
LocalContext context(isolate.GetIsolate());
|
||||||
g_access_block_type = types[i];
|
g_access_block_type = types[i];
|
||||||
Handle<Object> instance = CreateAccessCheckedObject(
|
Handle<Object> instance = CreateAccessCheckedObject(
|
||||||
NamedAccessAllowUnlessBlocked, IndexedAccessAlwaysAllowed);
|
NamedAccessAllowUnlessBlocked,
|
||||||
|
IndexedAccessAlwaysAllowed,
|
||||||
|
String::New("foo"));
|
||||||
CompileRun("var records = null;"
|
CompileRun("var records = null;"
|
||||||
"var objNoCheck = {};"
|
"var objNoCheck = {};"
|
||||||
"var blacklist = {foo: true};"
|
|
||||||
"var observer = function(r) { records = r };"
|
"var observer = function(r) { records = r };"
|
||||||
"Object.observe(obj, observer);"
|
"Object.observe(obj, observer);"
|
||||||
"Object.observe(objNoCheck, observer);");
|
"Object.observe(objNoCheck, observer);");
|
||||||
@ -574,10 +573,10 @@ TEST(IndexedAccessCheck) {
|
|||||||
LocalContext context(isolate.GetIsolate());
|
LocalContext context(isolate.GetIsolate());
|
||||||
g_access_block_type = types[i];
|
g_access_block_type = types[i];
|
||||||
Handle<Object> instance = CreateAccessCheckedObject(
|
Handle<Object> instance = CreateAccessCheckedObject(
|
||||||
NamedAccessAlwaysAllowed, IndexedAccessAllowUnlessBlocked);
|
NamedAccessAlwaysAllowed, IndexedAccessAllowUnlessBlocked,
|
||||||
|
Number::New(7));
|
||||||
CompileRun("var records = null;"
|
CompileRun("var records = null;"
|
||||||
"var objNoCheck = {};"
|
"var objNoCheck = {};"
|
||||||
"var blacklist = {7: true};"
|
|
||||||
"var observer = function(r) { records = r };"
|
"var observer = function(r) { records = r };"
|
||||||
"Object.observe(obj, observer);"
|
"Object.observe(obj, observer);"
|
||||||
"Object.observe(objNoCheck, observer);");
|
"Object.observe(objNoCheck, observer);");
|
||||||
@ -619,12 +618,12 @@ TEST(SpliceAccessCheck) {
|
|||||||
LocalContext context(isolate.GetIsolate());
|
LocalContext context(isolate.GetIsolate());
|
||||||
g_access_block_type = ACCESS_GET;
|
g_access_block_type = ACCESS_GET;
|
||||||
Handle<Object> instance = CreateAccessCheckedObject(
|
Handle<Object> instance = CreateAccessCheckedObject(
|
||||||
NamedAccessAlwaysAllowed, IndexedAccessAllowUnlessBlocked);
|
NamedAccessAlwaysAllowed, IndexedAccessAllowUnlessBlocked,
|
||||||
|
Number::New(1));
|
||||||
CompileRun("var records = null;"
|
CompileRun("var records = null;"
|
||||||
"obj[1] = 'foo';"
|
"obj[1] = 'foo';"
|
||||||
"obj.length = 2;"
|
"obj.length = 2;"
|
||||||
"var objNoCheck = {1: 'bar', length: 2};"
|
"var objNoCheck = {1: 'bar', length: 2};"
|
||||||
"var blacklist = {1: true};"
|
|
||||||
"observer = function(r) { records = r };"
|
"observer = function(r) { records = r };"
|
||||||
"Array.observe(obj, observer);"
|
"Array.observe(obj, observer);"
|
||||||
"Array.observe(objNoCheck, observer);");
|
"Array.observe(objNoCheck, observer);");
|
||||||
@ -667,7 +666,6 @@ TEST(DisallowAllForAccessKeys) {
|
|||||||
CompileRun("var records = null;"
|
CompileRun("var records = null;"
|
||||||
"var objNoCheck = {};"
|
"var objNoCheck = {};"
|
||||||
"var observer = function(r) { records = r };"
|
"var observer = function(r) { records = r };"
|
||||||
"var blacklist = {__block_access_keys: true};"
|
|
||||||
"Object.observe(obj, observer);"
|
"Object.observe(obj, observer);"
|
||||||
"Object.observe(objNoCheck, observer);");
|
"Object.observe(objNoCheck, observer);");
|
||||||
Handle<Value> obj_no_check = CompileRun("objNoCheck");
|
Handle<Value> obj_no_check = CompileRun("objNoCheck");
|
||||||
@ -704,7 +702,6 @@ TEST(AccessCheckDisallowApiModifications) {
|
|||||||
BlockAccessKeys, IndexedAccessAlwaysAllowed);
|
BlockAccessKeys, IndexedAccessAlwaysAllowed);
|
||||||
CompileRun("var records = null;"
|
CompileRun("var records = null;"
|
||||||
"var observer = function(r) { records = r };"
|
"var observer = function(r) { records = r };"
|
||||||
"var blacklist = {__block_access_keys: true};"
|
|
||||||
"Object.observe(obj, observer);");
|
"Object.observe(obj, observer);");
|
||||||
{
|
{
|
||||||
LocalContext context2(isolate.GetIsolate());
|
LocalContext context2(isolate.GetIsolate());
|
||||||
|
Loading…
Reference in New Issue
Block a user