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

Unified Diff: third_party/WebKit/Source/bindings/core/v8/V8PrivateProperty.h

Issue 2781443002: [Bindings] Specialize WindowDocument symbol in V8PrivateProperty (Closed)
Patch Set: Rebase Created 3 years, 9 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 | « no previous file | third_party/WebKit/Source/bindings/core/v8/V8PrivateProperty.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/bindings/core/v8/V8PrivateProperty.h
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8PrivateProperty.h b/third_party/WebKit/Source/bindings/core/v8/V8PrivateProperty.h
index 6a531408976851c245bfad299b314daece3832b6..e6a1fdff4e79929855e6928f685656811909c5c3 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8PrivateProperty.h
+++ b/third_party/WebKit/Source/bindings/core/v8/V8PrivateProperty.h
@@ -43,8 +43,7 @@ class ScriptWrappable;
X(SameObject, NotificationData) \
X(SameObject, NotificationVibrate) \
X(SameObject, PerformanceLongTaskTimingAttribution) \
- X(V8NodeFilterCondition, Filter) \
- X(Window, DocumentCachedAccessor)
+ X(V8NodeFilterCondition, Filter)
// The getter's name for a private property.
#define V8_PRIVATE_PROPERTY_GETTER_NAME(InterfaceName, PrivateKeyName) \
@@ -62,16 +61,14 @@ class ScriptWrappable;
//
// Usage 1) Fast path to use a pre-registered symbol.
// auto private = V8PrivateProperty::getMessageEventCachedData(isolate);
-// v8::Local<v8::Context> context = ...;
// v8::Local<v8::Object> object = ...;
-// v8::Local<v8::Value> value = private.get(context, object);
+// v8::Local<v8::Value> value = private.getOrUndefined(object);
// value = ...;
-// private.set(context, object, value);
+// private.set(object, value);
//
// Usage 2) Slow path to create a global private symbol.
// const char symbolName[] = "Interface#PrivateKeyName";
-// auto private = V8PrivateProperty::createSymbol(isolate, symbolName,
-// sizeof symbolName);
+// auto private = V8PrivateProperty::createSymbol(isolate, symbolName);
// ...
class CORE_EXPORT V8PrivateProperty {
USING_FAST_MALLOC(V8PrivateProperty);
@@ -136,38 +133,64 @@ class CORE_EXPORT V8PrivateProperty {
return WTF::wrapUnique(new V8PrivateProperty());
}
-#define V8_PRIVATE_PROPERTY_DEFINE_GETTER(InterfaceName, KeyName) \
- static Symbol V8_PRIVATE_PROPERTY_GETTER_NAME(/* // NOLINT */ \
- InterfaceName, KeyName)( \
- v8::Isolate * isolate) { \
- V8PrivateProperty* privateProp = \
- V8PerIsolateData::from(isolate)->privateProperty(); \
- v8::Eternal<v8::Private>& propertyHandle = \
- privateProp->V8_PRIVATE_PROPERTY_MEMBER_NAME(InterfaceName, KeyName); \
- if (UNLIKELY(propertyHandle.IsEmpty())) { \
- static constexpr char kSymbolName[] = \
- V8_PRIVATE_PROPERTY_SYMBOL_STRING(InterfaceName, KeyName); \
- propertyHandle.Set(isolate, createV8Private(isolate, kSymbolName, \
- sizeof(kSymbolName))); \
- } \
- return Symbol(isolate, propertyHandle.Get(isolate)); \
+#define V8_PRIVATE_PROPERTY_DEFINE_GETTER(InterfaceName, KeyName) \
+ static Symbol V8_PRIVATE_PROPERTY_GETTER_NAME(/* // NOLINT */ \
+ InterfaceName, KeyName)( \
+ v8::Isolate * isolate) { \
+ V8PrivateProperty* privateProp = \
+ V8PerIsolateData::from(isolate)->privateProperty(); \
+ v8::Eternal<v8::Private>& propertyHandle = \
+ privateProp->V8_PRIVATE_PROPERTY_MEMBER_NAME(InterfaceName, KeyName); \
+ if (UNLIKELY(propertyHandle.IsEmpty())) { \
+ propertyHandle.Set( \
+ isolate, createV8Private(isolate, V8_PRIVATE_PROPERTY_SYMBOL_STRING( \
+ InterfaceName, KeyName))); \
+ } \
+ return Symbol(isolate, propertyHandle.Get(isolate)); \
}
V8_PRIVATE_PROPERTY_FOR_EACH(V8_PRIVATE_PROPERTY_DEFINE_GETTER)
#undef V8_PRIVATE_PROPERTY_DEFINE_GETTER
+ // TODO(peria): Do not use this specialized hack. See a TODO comment
+ // on m_symbolWindowDocumentCachedAccessor.
+ static Symbol getWindowDocumentCachedAccessor(v8::Isolate* isolate) {
+ V8PrivateProperty* privateProp =
+ V8PerIsolateData::from(isolate)->privateProperty();
+ if (UNLIKELY(privateProp->m_symbolWindowDocumentCachedAccessor.isEmpty())) {
+ privateProp->m_symbolWindowDocumentCachedAccessor.set(
+ isolate, createCachedV8Private(
+ isolate, V8_PRIVATE_PROPERTY_SYMBOL_STRING(
+ "Window", "DocumentCachedAccessor")));
+ }
+ return Symbol(
+ isolate,
+ privateProp->m_symbolWindowDocumentCachedAccessor.newLocal(isolate));
+ }
+
+ static Symbol createSymbol(v8::Isolate* isolate, const char* symbol) {
+ return Symbol(isolate, createCachedV8Private(isolate, symbol));
+ }
+
private:
V8PrivateProperty() {}
static v8::Local<v8::Private> createV8Private(v8::Isolate*,
- const char* symbol,
- size_t length);
+ const char* symbol);
+ static v8::Local<v8::Private> createCachedV8Private(v8::Isolate*,
+ const char* symbol);
#define V8_PRIVATE_PROPERTY_DECLARE_MEMBER(InterfaceName, KeyName) \
v8::Eternal<v8::Private> V8_PRIVATE_PROPERTY_MEMBER_NAME( \
InterfaceName, KeyName); // NOLINT(readability/naming/underscores)
V8_PRIVATE_PROPERTY_FOR_EACH(V8_PRIVATE_PROPERTY_DECLARE_MEMBER)
#undef V8_PRIVATE_PROPERTY_DECLARE_MEMBER
+
+ // TODO(peria): Do not use this specialized hack for
+ // Window#DocumentCachedAccessor. This is required to put v8::Private key in
+ // a snapshot, and it cannot be a v8::Eternal<> due to V8 serializer's
+ // requirement.
+ ScopedPersistent<v8::Private> m_symbolWindowDocumentCachedAccessor;
};
} // namespace blink
« no previous file with comments | « no previous file | third_party/WebKit/Source/bindings/core/v8/V8PrivateProperty.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698