@@ -51,6 +51,7 @@ using v8::FunctionTemplate;
51
51
using v8::HandleScope;
52
52
using v8::IndexedPropertyHandlerConfiguration;
53
53
using v8::Int32;
54
+ using v8::Integer;
54
55
using v8::Intercepted;
55
56
using v8::Isolate;
56
57
using v8::Just;
@@ -176,20 +177,22 @@ void ContextifyContext::InitializeGlobalTemplates(IsolateData* isolate_data) {
176
177
NamedPropertyHandlerConfiguration config (
177
178
PropertyGetterCallback,
178
179
PropertySetterCallback,
179
- PropertyDescriptorCallback ,
180
+ PropertyQueryCallback ,
180
181
PropertyDeleterCallback,
181
182
PropertyEnumeratorCallback,
182
183
PropertyDefinerCallback,
184
+ PropertyDescriptorCallback,
183
185
{},
184
186
PropertyHandlerFlags::kHasNoSideEffect );
185
187
186
188
IndexedPropertyHandlerConfiguration indexed_config (
187
189
IndexedPropertyGetterCallback,
188
190
IndexedPropertySetterCallback,
189
- IndexedPropertyDescriptorCallback ,
191
+ IndexedPropertyQueryCallback ,
190
192
IndexedPropertyDeleterCallback,
191
193
PropertyEnumeratorCallback,
192
194
IndexedPropertyDefinerCallback,
195
+ IndexedPropertyDescriptorCallback,
193
196
{},
194
197
PropertyHandlerFlags::kHasNoSideEffect );
195
198
@@ -354,12 +357,14 @@ void ContextifyContext::RegisterExternalReferences(
354
357
ExternalReferenceRegistry* registry) {
355
358
registry->Register (MakeContext);
356
359
registry->Register (CompileFunction);
360
+ registry->Register (PropertyQueryCallback);
357
361
registry->Register (PropertyGetterCallback);
358
362
registry->Register (PropertySetterCallback);
359
363
registry->Register (PropertyDescriptorCallback);
360
364
registry->Register (PropertyDeleterCallback);
361
365
registry->Register (PropertyEnumeratorCallback);
362
366
registry->Register (PropertyDefinerCallback);
367
+ registry->Register (IndexedPropertyQueryCallback);
363
368
registry->Register (IndexedPropertyGetterCallback);
364
369
registry->Register (IndexedPropertySetterCallback);
365
370
registry->Register (IndexedPropertyDescriptorCallback);
@@ -458,6 +463,51 @@ bool ContextifyContext::IsStillInitializing(const ContextifyContext* ctx) {
458
463
return ctx == nullptr || ctx->context_ .IsEmpty ();
459
464
}
460
465
466
+ // static
467
+ Intercepted ContextifyContext::PropertyQueryCallback (
468
+ Local<Name> property, const PropertyCallbackInfo<Integer>& args) {
469
+ ContextifyContext* ctx = ContextifyContext::Get (args);
470
+
471
+ // Still initializing
472
+ if (IsStillInitializing (ctx)) {
473
+ return Intercepted::kNo ;
474
+ }
475
+
476
+ Local<Context> context = ctx->context ();
477
+ Local<Object> sandbox = ctx->sandbox ();
478
+
479
+ PropertyAttribute attr;
480
+
481
+ Maybe<bool > maybe_has = sandbox->HasRealNamedProperty (context, property);
482
+ if (maybe_has.IsNothing ()) {
483
+ return Intercepted::kNo ;
484
+ } else if (maybe_has.FromJust ()) {
485
+ Maybe<PropertyAttribute> maybe_attr =
486
+ sandbox->GetRealNamedPropertyAttributes (context, property);
487
+ if (!maybe_attr.To (&attr)) {
488
+ return Intercepted::kNo ;
489
+ }
490
+ args.GetReturnValue ().Set (attr);
491
+ return Intercepted::kYes ;
492
+ } else {
493
+ maybe_has = ctx->global_proxy ()->HasRealNamedProperty (context, property);
494
+ if (maybe_has.IsNothing ()) {
495
+ return Intercepted::kNo ;
496
+ } else if (maybe_has.FromJust ()) {
497
+ Maybe<PropertyAttribute> maybe_attr =
498
+ ctx->global_proxy ()->GetRealNamedPropertyAttributes (context,
499
+ property);
500
+ if (!maybe_attr.To (&attr)) {
501
+ return Intercepted::kNo ;
502
+ }
503
+ args.GetReturnValue ().Set (attr);
504
+ return Intercepted::kYes ;
505
+ }
506
+ }
507
+
508
+ return Intercepted::kNo ;
509
+ }
510
+
461
511
// static
462
512
Intercepted ContextifyContext::PropertyGetterCallback (
463
513
Local<Name> property, const PropertyCallbackInfo<Value>& args) {
@@ -709,6 +759,20 @@ void ContextifyContext::PropertyEnumeratorCallback(
709
759
args.GetReturnValue ().Set (properties);
710
760
}
711
761
762
+ // static
763
+ Intercepted ContextifyContext::IndexedPropertyQueryCallback (
764
+ uint32_t index, const PropertyCallbackInfo<Integer>& args) {
765
+ ContextifyContext* ctx = ContextifyContext::Get (args);
766
+
767
+ // Still initializing
768
+ if (IsStillInitializing (ctx)) {
769
+ return Intercepted::kNo ;
770
+ }
771
+
772
+ return ContextifyContext::PropertyQueryCallback (
773
+ Uint32ToName (ctx->context (), index), args);
774
+ }
775
+
712
776
// static
713
777
Intercepted ContextifyContext::IndexedPropertyGetterCallback (
714
778
uint32_t index, const PropertyCallbackInfo<Value>& args) {
0 commit comments