Add threading assertion to WeakPtrFactory::createWeakPtr()
https://bugs.webkit.org/show_bug.cgi?id=199639

Reviewed by Ryosuke Niwa.

Source/WebCore:

* platform/ScrollableArea.cpp:
* rendering/RenderObject.cpp:

Source/WTF:

Add threading assertion to WeakPtrFactory::createWeakPtr() to make sure it
is called on the same thread where the WeakPtrFactory wad constructed.

* wtf/WeakPtr.h:
(WTF::WeakPtrFactory::WeakPtrFactory):
(WTF::WeakPtrFactory::createWeakPtr const):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@247425 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WTF/ChangeLog b/Source/WTF/ChangeLog
index 88ed0b9..0ffc55c 100644
--- a/Source/WTF/ChangeLog
+++ b/Source/WTF/ChangeLog
@@ -1,3 +1,17 @@
+2019-07-14  Chris Dumez  <cdumez@apple.com>
+
+        Add threading assertion to WeakPtrFactory::createWeakPtr()
+        https://bugs.webkit.org/show_bug.cgi?id=199639
+
+        Reviewed by Ryosuke Niwa.
+
+        Add threading assertion to WeakPtrFactory::createWeakPtr() to make sure it
+        is called on the same thread where the WeakPtrFactory wad constructed.
+
+        * wtf/WeakPtr.h:
+        (WTF::WeakPtrFactory::WeakPtrFactory):
+        (WTF::WeakPtrFactory::createWeakPtr const):
+
 2019-07-14  Dean Jackson  <dino@apple.com>
 
         WebGL not supported on WKWebView on UIKit for Mac
diff --git a/Source/WTF/wtf/WeakPtr.h b/Source/WTF/wtf/WeakPtr.h
index 7f108a7..715e904 100644
--- a/Source/WTF/wtf/WeakPtr.h
+++ b/Source/WTF/wtf/WeakPtr.h
@@ -26,6 +26,7 @@
 
 #pragma once
 
+#include <wtf/MainThread.h>
 #include <wtf/Noncopyable.h>
 #include <wtf/Ref.h>
 #include <wtf/ThreadSafeRefCounted.h>
@@ -114,7 +115,13 @@
     WTF_MAKE_NONCOPYABLE(WeakPtrFactory<T>);
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    WeakPtrFactory() = default;
+    WeakPtrFactory()
+#if !ASSERT_DISABLED
+        : m_wasConstructedOnMainThread(isMainThread())
+#endif
+    {
+    }
+
     ~WeakPtrFactory()
     {
         if (!m_impl)
@@ -124,6 +131,7 @@
 
     WeakPtr<T> createWeakPtr(T& object) const
     {
+        ASSERT(m_wasConstructedOnMainThread == isMainThread());
         if (!m_impl)
             m_impl = WeakPtrImpl::create(&object);
 
@@ -133,6 +141,7 @@
 
     WeakPtr<const T> createWeakPtr(const T& object) const
     {
+        ASSERT(m_wasConstructedOnMainThread == isMainThread());
         if (!m_impl)
             m_impl = WeakPtrImpl::create(const_cast<T*>(&object));
 
@@ -153,6 +162,9 @@
     template<typename> friend class WeakHashSet;
 
     mutable RefPtr<WeakPtrImpl> m_impl;
+#if !ASSERT_DISABLED
+    bool m_wasConstructedOnMainThread;
+#endif
 };
 
 template<typename T> class CanMakeWeakPtr {
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 130c7f6..9e7b1a5 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,13 @@
+2019-07-14  Chris Dumez  <cdumez@apple.com>
+
+        Add threading assertion to WeakPtrFactory::createWeakPtr()
+        https://bugs.webkit.org/show_bug.cgi?id=199639
+
+        Reviewed by Ryosuke Niwa.
+
+        * platform/ScrollableArea.cpp:
+        * rendering/RenderObject.cpp:
+
 2019-07-14  Dean Jackson  <dino@apple.com>
 
         WebGL not supported on WKWebView on UIKit for Mac
diff --git a/Source/WebCore/platform/ScrollableArea.cpp b/Source/WebCore/platform/ScrollableArea.cpp
index c8882ee..c62ad834 100644
--- a/Source/WebCore/platform/ScrollableArea.cpp
+++ b/Source/WebCore/platform/ScrollableArea.cpp
@@ -47,6 +47,9 @@
 
 struct SameSizeAsScrollableArea {
     virtual ~SameSizeAsScrollableArea();
+#if !ASSERT_DISABLED
+    bool weakPtrFactorWasConstructedOnMainThread;
+#endif
 #if ENABLE(CSS_SCROLL_SNAP)
     void* pointers[3];
     unsigned currentIndices[2];
diff --git a/Source/WebCore/rendering/RenderObject.cpp b/Source/WebCore/rendering/RenderObject.cpp
index 78c0958..4da3bd7 100644
--- a/Source/WebCore/rendering/RenderObject.cpp
+++ b/Source/WebCore/rendering/RenderObject.cpp
@@ -102,6 +102,9 @@
 
 struct SameSizeAsRenderObject {
     virtual ~SameSizeAsRenderObject() = default; // Allocate vtable pointer.
+#if !ASSERT_DISABLED
+    bool weakPtrFactorWasConstructedOnMainThread;
+#endif
     void* pointers[5];
 #ifndef NDEBUG
     unsigned m_debugBitfields : 2;