Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(921)

Unified Diff: src/api.cc

Issue 2087823002: Optionally invoke an interceptor on failed access checks (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/v8.h ('k') | src/isolate.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index e72abc87de14ecf523fe5d892b694287db3cbc26..131645cbb63684051101274df21dc135a4754876 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -1535,20 +1535,12 @@ void ObjectTemplate::SetAccessor(v8::Local<Name> name,
signature, i::FLAG_disable_old_api_accessors);
}
-
template <typename Getter, typename Setter, typename Query, typename Deleter,
typename Enumerator>
-static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ,
- Getter getter, Setter setter,
- Query query, Deleter remover,
- Enumerator enumerator,
- Local<Value> data,
- PropertyHandlerFlags flags) {
- i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
- ENTER_V8(isolate);
- i::HandleScope scope(isolate);
- auto cons = EnsureConstructor(isolate, templ);
- EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler");
+static i::Handle<i::InterceptorInfo> CreateInterceptorInfo(
+ i::Isolate* isolate, Getter getter, Setter setter, Query query,
+ Deleter remover, Enumerator enumerator, Local<Value> data,
+ PropertyHandlerFlags flags) {
auto obj = i::Handle<i::InterceptorInfo>::cast(
isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
obj->set_flags(0);
@@ -1570,6 +1562,24 @@ static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ,
data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
}
obj->set_data(*Utils::OpenHandle(*data));
+ return obj;
+}
+
+template <typename Getter, typename Setter, typename Query, typename Deleter,
+ typename Enumerator>
+static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ,
+ Getter getter, Setter setter,
+ Query query, Deleter remover,
+ Enumerator enumerator,
+ Local<Value> data,
+ PropertyHandlerFlags flags) {
+ i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
+ ENTER_V8(isolate);
+ i::HandleScope scope(isolate);
+ auto cons = EnsureConstructor(isolate, templ);
+ EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler");
+ auto obj = CreateInterceptorInfo(isolate, getter, setter, query, remover,
+ enumerator, data, flags);
cons->set_named_property_handler(*obj);
}
@@ -1616,6 +1626,8 @@ void ObjectTemplate::SetAccessCheckCallback(AccessCheckCallback callback,
i::Handle<i::AccessCheckInfo>::cast(struct_info);
SET_FIELD_WRAPPED(info, set_callback, callback);
+ info->set_named_interceptor(nullptr);
+ info->set_indexed_interceptor(nullptr);
if (data.IsEmpty()) {
data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
@@ -1626,32 +1638,54 @@ void ObjectTemplate::SetAccessCheckCallback(AccessCheckCallback callback,
cons->set_needs_access_check(true);
}
-void ObjectTemplate::SetHandler(
- const IndexedPropertyHandlerConfiguration& config) {
+void ObjectTemplate::SetAccessCheckCallbackAndHandler(
+ AccessCheckCallback callback,
+ const NamedPropertyHandlerConfiguration& named_handler,
+ const IndexedPropertyHandlerConfiguration& indexed_handler,
+ Local<Value> data) {
i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
ENTER_V8(isolate);
i::HandleScope scope(isolate);
auto cons = EnsureConstructor(isolate, this);
- EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
- auto obj = i::Handle<i::InterceptorInfo>::cast(
- isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE));
- obj->set_flags(0);
+ EnsureNotInstantiated(
+ cons, "v8::ObjectTemplate::SetAccessCheckCallbackWithHandler");
- if (config.getter != 0) SET_FIELD_WRAPPED(obj, set_getter, config.getter);
- if (config.setter != 0) SET_FIELD_WRAPPED(obj, set_setter, config.setter);
- if (config.query != 0) SET_FIELD_WRAPPED(obj, set_query, config.query);
- if (config.deleter != 0) SET_FIELD_WRAPPED(obj, set_deleter, config.deleter);
- if (config.enumerator != 0) {
- SET_FIELD_WRAPPED(obj, set_enumerator, config.enumerator);
- }
- obj->set_all_can_read(static_cast<int>(config.flags) &
- static_cast<int>(PropertyHandlerFlags::kAllCanRead));
+ i::Handle<i::Struct> struct_info =
+ isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE);
+ i::Handle<i::AccessCheckInfo> info =
+ i::Handle<i::AccessCheckInfo>::cast(struct_info);
+
+ SET_FIELD_WRAPPED(info, set_callback, callback);
+ auto named_interceptor = CreateInterceptorInfo(
+ isolate, named_handler.getter, named_handler.setter, named_handler.query,
+ named_handler.deleter, named_handler.enumerator, named_handler.data,
+ named_handler.flags);
+ info->set_named_interceptor(*named_interceptor);
+ auto indexed_interceptor = CreateInterceptorInfo(
+ isolate, indexed_handler.getter, indexed_handler.setter,
+ indexed_handler.query, indexed_handler.deleter,
+ indexed_handler.enumerator, indexed_handler.data, indexed_handler.flags);
+ info->set_indexed_interceptor(*indexed_interceptor);
- v8::Local<v8::Value> data = config.data;
if (data.IsEmpty()) {
data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
}
- obj->set_data(*Utils::OpenHandle(*data));
+ info->set_data(*Utils::OpenHandle(*data));
+
+ cons->set_access_check_info(*info);
+ cons->set_needs_access_check(true);
+}
+
+void ObjectTemplate::SetHandler(
+ const IndexedPropertyHandlerConfiguration& config) {
+ i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
+ ENTER_V8(isolate);
+ i::HandleScope scope(isolate);
+ auto cons = EnsureConstructor(isolate, this);
+ EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
+ auto obj = CreateInterceptorInfo(
+ isolate, config.getter, config.setter, config.query, config.deleter,
+ config.enumerator, config.data, config.flags);
cons->set_indexed_property_handler(*obj);
}
« no previous file with comments | « include/v8.h ('k') | src/isolate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698