Chromium Code Reviews| Index: src/d8.cc |
| diff --git a/src/d8.cc b/src/d8.cc |
| index 9466ab7d3a727c2fe12d70ac977df0b0cac57f35..460380594956eb1ccfff37278bc94e5de02d2d08 100644 |
| --- a/src/d8.cc |
| +++ b/src/d8.cc |
| @@ -548,6 +548,32 @@ void Shell::RealmCreate(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| args.GetReturnValue().Set(index); |
| } |
| +// Realm.createAllowCrossRealmAccess(i) jreates a new realm with the same |
|
adamk
2016/05/19 19:23:20
s/jreates/creates/
Dan Ehrenberg
2016/05/27 13:51:39
Done
|
| +// security token as the current realm. |
| +void Shell::RealmCreateAllowCrossRealmAccess( |
|
rossberg
2016/05/19 06:07:00
I wouldn't mind factoring out the commonalities be
adamk
2016/05/19 19:23:20
Agreed, the fewer places we have to write 'delete[
Dan Ehrenberg
2016/05/27 13:51:39
Done
|
| + const v8::FunctionCallbackInfo<v8::Value>& args) { |
| + Isolate* isolate = args.GetIsolate(); |
| + TryCatch try_catch(isolate); |
| + PerIsolateData* data = PerIsolateData::Get(isolate); |
| + Global<Context>* old_realms = data->realms_; |
| + int index = data->realm_count_; |
| + data->realms_ = new Global<Context>[++data->realm_count_]; |
| + for (int i = 0; i < index; ++i) { |
| + data->realms_[i].Reset(isolate, old_realms[i]); |
| + old_realms[i].Reset(); |
| + } |
| + delete[] old_realms; |
| + Local<ObjectTemplate> global_template = CreateGlobalTemplate(isolate); |
| + Local<Context> context = Context::New(isolate, NULL, global_template); |
| + if (context.IsEmpty()) { |
| + DCHECK(try_catch.HasCaught()); |
| + try_catch.ReThrow(); |
| + return; |
| + } |
| + context->SetSecurityToken(isolate->GetEnteredContext()->GetSecurityToken()); |
| + data->realms_[index].Reset(isolate, context); |
| + args.GetReturnValue().Set(index); |
| +} |
| // Realm.dispose(i) disposes the reference to the realm i. |
| void Shell::RealmDispose(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| @@ -1136,6 +1162,11 @@ Local<ObjectTemplate> Shell::CreateGlobalTemplate(Isolate* isolate) { |
| .ToLocalChecked(), |
| FunctionTemplate::New(isolate, RealmCreate)); |
| realm_template->Set( |
| + String::NewFromUtf8(isolate, "createAllowCrossRealmAccess", |
| + NewStringType::kNormal) |
| + .ToLocalChecked(), |
| + FunctionTemplate::New(isolate, RealmCreateAllowCrossRealmAccess)); |
| + realm_template->Set( |
| String::NewFromUtf8(isolate, "dispose", NewStringType::kNormal) |
| .ToLocalChecked(), |
| FunctionTemplate::New(isolate, RealmDispose)); |