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 |