Index: third_party/WebKit/public/platform/WebPrivatePtr.h |
diff --git a/third_party/WebKit/public/platform/WebPrivatePtr.h b/third_party/WebKit/public/platform/WebPrivatePtr.h |
index b4b9a2887859e4d44c3788fcadc314219ac55d1d..4bb771e07ad13d246f2f13f77f3eb1eb1014165f 100644 |
--- a/third_party/WebKit/public/platform/WebPrivatePtr.h |
+++ b/third_party/WebKit/public/platform/WebPrivatePtr.h |
@@ -53,6 +53,14 @@ enum WebPrivatePtrDestruction { |
WebPrivatePtrDestructionCrossThread, |
}; |
+// The WebPrivatePtr<> holds by default a strong reference to its Blink object, |
+// but Blink GC managed objects also support keeping a weak reference by |
+// way of WebPrivatePtr<>. |
+enum class WebPrivatePtrStrength { |
+ Normal, |
+ Weak, |
+}; |
+ |
#if INSIDE_BLINK |
enum LifetimeManagementType { |
RefCountedLifetime, |
@@ -70,17 +78,18 @@ public: |
isRefCountedGarbageCollected ? RefCountedGarbageCollectedLifetime : GarbageCollectedLifetime; |
}; |
-template<typename T, WebPrivatePtrDestruction crossThreadDestruction, LifetimeManagementType lifetime> |
+template<typename T, WebPrivatePtrDestruction crossThreadDestruction, WebPrivatePtrStrength strongOrWeak, LifetimeManagementType lifetime> |
class PtrStorageImpl; |
-template<typename T, WebPrivatePtrDestruction crossThreadDestruction> |
-class PtrStorageImpl<T, crossThreadDestruction, RefCountedLifetime> { |
+template<typename T, WebPrivatePtrDestruction crossThreadDestruction, WebPrivatePtrStrength strongOrWeak> |
+class PtrStorageImpl<T, crossThreadDestruction, strongOrWeak, RefCountedLifetime> { |
public: |
typedef PassRefPtr<T> BlinkPtrType; |
void assign(const BlinkPtrType& val) |
{ |
static_assert(crossThreadDestruction == WebPrivatePtrDestructionSameThread || WTF::IsSubclassOfTemplate<T, WTF::ThreadSafeRefCounted>::value, "Cross thread destructible class must derive from ThreadSafeRefCounted<>"); |
+ static_assert(strongOrWeak == WebPrivatePtrStrength::Normal, "Ref-counted classes do not support weak WebPrivatePtr<> references"); |
release(); |
m_ptr = val.leakRef(); |
} |
@@ -112,20 +121,32 @@ private: |
T* m_ptr; |
}; |
-template <typename T, WebPrivatePtrDestruction> |
+template <typename T, WebPrivatePtrDestruction, WebPrivatePtrStrength> |
struct WebPrivatePtrPersistentStorageType { |
public: |
using Type = Persistent<T>; |
}; |
template <typename T> |
-struct WebPrivatePtrPersistentStorageType<T, WebPrivatePtrDestructionCrossThread> { |
+struct WebPrivatePtrPersistentStorageType<T, WebPrivatePtrDestructionSameThread, WebPrivatePtrStrength::Weak> { |
+public: |
+ using Type = WeakPersistent<T>; |
+}; |
+ |
+template <typename T> |
+struct WebPrivatePtrPersistentStorageType<T, WebPrivatePtrDestructionCrossThread, WebPrivatePtrStrength::Normal> { |
public: |
using Type = CrossThreadPersistent<T>; |
}; |
-template<typename T, WebPrivatePtrDestruction crossThreadDestruction> |
-class PtrStorageImpl<T, crossThreadDestruction, GarbageCollectedLifetime> { |
+template <typename T> |
+struct WebPrivatePtrPersistentStorageType<T, WebPrivatePtrDestructionCrossThread, WebPrivatePtrStrength::Weak> { |
+public: |
+ using Type = CrossThreadWeakPersistent<T>; |
+}; |
+ |
+template<typename T, WebPrivatePtrDestruction crossThreadDestruction, WebPrivatePtrStrength strongOrWeak> |
+class PtrStorageImpl<T, crossThreadDestruction, strongOrWeak, GarbageCollectedLifetime> { |
public: |
void assign(const RawPtr<T>& val) |
{ |
@@ -135,7 +156,7 @@ public: |
} |
if (!m_handle) |
- m_handle = new (typename WebPrivatePtrPersistentStorageType<T, crossThreadDestruction>::Type)(); |
+ m_handle = new (typename WebPrivatePtrPersistentStorageType<T, crossThreadDestruction, strongOrWeak>::Type)(); |
(*m_handle) = val; |
} |
@@ -161,19 +182,19 @@ public: |
} |
private: |
- typename WebPrivatePtrPersistentStorageType<T, crossThreadDestruction>::Type* m_handle; |
+ typename WebPrivatePtrPersistentStorageType<T, crossThreadDestruction, strongOrWeak>::Type* m_handle; |
}; |
-template<typename T, WebPrivatePtrDestruction crossThreadDestruction> |
-class PtrStorageImpl<T, crossThreadDestruction, RefCountedGarbageCollectedLifetime> : public PtrStorageImpl<T, crossThreadDestruction, GarbageCollectedLifetime> { |
+template<typename T, WebPrivatePtrDestruction crossThreadDestruction, WebPrivatePtrStrength strongOrWeak> |
+class PtrStorageImpl<T, crossThreadDestruction, strongOrWeak, RefCountedGarbageCollectedLifetime> : public PtrStorageImpl<T, crossThreadDestruction, strongOrWeak, GarbageCollectedLifetime> { |
public: |
- void assign(const PassRefPtrWillBeRawPtr<T>& val) { PtrStorageImpl<T, crossThreadDestruction, GarbageCollectedLifetime>::assign(val.get()); } |
+ void assign(const PassRefPtrWillBeRawPtr<T>& val) { PtrStorageImpl<T, crossThreadDestruction, strongOrWeak, GarbageCollectedLifetime>::assign(val.get()); } |
- void assign(const PtrStorageImpl& other) { PtrStorageImpl<T, crossThreadDestruction, GarbageCollectedLifetime>::assign(other.get()); } |
+ void assign(const PtrStorageImpl& other) { PtrStorageImpl<T, crossThreadDestruction, strongOrWeak, GarbageCollectedLifetime>::assign(other.get()); } |
}; |
-template<typename T, WebPrivatePtrDestruction crossThreadDestruction> |
-class PtrStorage : public PtrStorageImpl<T, crossThreadDestruction, LifetimeOf<T>::value> { |
+template<typename T, WebPrivatePtrDestruction crossThreadDestruction, WebPrivatePtrStrength strongOrWeak> |
+class PtrStorage : public PtrStorageImpl<T, crossThreadDestruction, strongOrWeak, LifetimeOf<T>::value> { |
public: |
static PtrStorage& fromSlot(void** slot) |
{ |
@@ -230,7 +251,7 @@ private: |
// WebFoo::~WebFoo() { m_private.reset(); } |
// void WebFoo::assign(const WebFoo& other) { ... } |
// |
-template <typename T, WebPrivatePtrDestruction crossThreadDestruction = WebPrivatePtrDestructionSameThread> |
+template <typename T, WebPrivatePtrDestruction crossThreadDestruction = WebPrivatePtrDestructionSameThread, WebPrivatePtrStrength strongOrWeak = WebPrivatePtrStrength::Normal> |
class WebPrivatePtr { |
public: |
WebPrivatePtr() : m_storage(0) { } |
@@ -291,8 +312,8 @@ public: |
private: |
#if INSIDE_BLINK |
- PtrStorage<T, crossThreadDestruction>& storage() { return PtrStorage<T, crossThreadDestruction>::fromSlot(&m_storage); } |
- const PtrStorage<T, crossThreadDestruction>& storage() const { return PtrStorage<T, crossThreadDestruction>::fromSlot(&m_storage); } |
+ PtrStorage<T, crossThreadDestruction, strongOrWeak>& storage() { return PtrStorage<T, crossThreadDestruction, strongOrWeak>::fromSlot(&m_storage); } |
+ const PtrStorage<T, crossThreadDestruction, strongOrWeak>& storage() const { return PtrStorage<T, crossThreadDestruction, strongOrWeak>::fromSlot(&m_storage); } |
#endif |
#if !INSIDE_BLINK |
@@ -311,4 +332,4 @@ private: |
} // namespace blink |
-#endif |
+#endif // WebPrivatePtr_h |