@@ -51,6 +51,7 @@ using v8::FunctionTemplate;
5151using v8::HandleScope;
5252using v8::IndexedPropertyHandlerConfiguration;
5353using v8::Int32;
54+ using v8::Integer;
5455using v8::Intercepted;
5556using v8::Isolate;
5657using v8::Just;
@@ -176,20 +177,22 @@ void ContextifyContext::InitializeGlobalTemplates(IsolateData* isolate_data) {
176177 NamedPropertyHandlerConfiguration config (
177178 PropertyGetterCallback,
178179 PropertySetterCallback,
179- PropertyDescriptorCallback ,
180+ PropertyQueryCallback ,
180181 PropertyDeleterCallback,
181182 PropertyEnumeratorCallback,
182183 PropertyDefinerCallback,
184+ PropertyDescriptorCallback,
183185 {},
184186 PropertyHandlerFlags::kHasNoSideEffect );
185187
186188 IndexedPropertyHandlerConfiguration indexed_config (
187189 IndexedPropertyGetterCallback,
188190 IndexedPropertySetterCallback,
189- IndexedPropertyDescriptorCallback ,
191+ IndexedPropertyQueryCallback ,
190192 IndexedPropertyDeleterCallback,
191193 PropertyEnumeratorCallback,
192194 IndexedPropertyDefinerCallback,
195+ IndexedPropertyDescriptorCallback,
193196 {},
194197 PropertyHandlerFlags::kHasNoSideEffect );
195198
@@ -354,12 +357,14 @@ void ContextifyContext::RegisterExternalReferences(
354357 ExternalReferenceRegistry* registry) {
355358 registry->Register (MakeContext);
356359 registry->Register (CompileFunction);
360+ registry->Register (PropertyQueryCallback);
357361 registry->Register (PropertyGetterCallback);
358362 registry->Register (PropertySetterCallback);
359363 registry->Register (PropertyDescriptorCallback);
360364 registry->Register (PropertyDeleterCallback);
361365 registry->Register (PropertyEnumeratorCallback);
362366 registry->Register (PropertyDefinerCallback);
367+ registry->Register (IndexedPropertyQueryCallback);
363368 registry->Register (IndexedPropertyGetterCallback);
364369 registry->Register (IndexedPropertySetterCallback);
365370 registry->Register (IndexedPropertyDescriptorCallback);
@@ -458,6 +463,51 @@ bool ContextifyContext::IsStillInitializing(const ContextifyContext* ctx) {
458463 return ctx == nullptr || ctx->context_ .IsEmpty ();
459464}
460465
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+
461511// static
462512Intercepted ContextifyContext::PropertyGetterCallback (
463513 Local<Name> property, const PropertyCallbackInfo<Value>& args) {
@@ -709,6 +759,20 @@ void ContextifyContext::PropertyEnumeratorCallback(
709759 args.GetReturnValue ().Set (properties);
710760}
711761
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+
712776// static
713777Intercepted ContextifyContext::IndexedPropertyGetterCallback (
714778 uint32_t index, const PropertyCallbackInfo<Value>& args) {
0 commit comments