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

Unified Diff: third_party/WebKit/Source/wtf/Functional.h

Issue 2091713002: Specialize base::IsWeakReceiver for Blink weak pointers to support base::Bind (1/5) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: +#include for build fix 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
Index: third_party/WebKit/Source/wtf/Functional.h
diff --git a/third_party/WebKit/Source/wtf/Functional.h b/third_party/WebKit/Source/wtf/Functional.h
index b87042a121c566ec002724f8e26e2819ef4cb58d..3cfa5c133fb9824cec5cc89f3d2c2a7bb7c8678e 100644
--- a/third_party/WebKit/Source/wtf/Functional.h
+++ b/third_party/WebKit/Source/wtf/Functional.h
@@ -43,6 +43,13 @@ namespace blink {
template<typename T> class CrossThreadPersistent;
}
+namespace base {
+
+template <typename T>
+struct IsWeakReceiver<WTF::WeakPtr<T>> : std::true_type {};
+
+}
+
namespace WTF {
// Functional.h provides a very simple way to bind a function pointer and arguments together into a function object
@@ -190,25 +197,15 @@ public:
{
}
- template <typename... IncomingParameters>
- R operator()(C* c, IncomingParameters&&... parameters)
+ template <typename Receiver, typename... IncomingParameters>
+ R operator()(Receiver&& receiver, IncomingParameters&&... parameters)
{
- return (c->*m_function)(std::forward<IncomingParameters>(parameters)...);
- }
-
- template <typename... IncomingParameters>
- R operator()(const std::unique_ptr<C>& c, IncomingParameters&&... parameters)
- {
- return (c.get()->*m_function)(std::forward<IncomingParameters>(parameters)...);
- }
-
- template <typename... IncomingParameters>
- R operator()(const WeakPtr<C>& c, IncomingParameters&&... parameters)
- {
- C* obj = c.get();
- if (!obj)
+ if (base::IsWeakReceiver<typename std::decay<Receiver>::type>::value && !receiver) {
return R();
- return (obj->*m_function)(std::forward<IncomingParameters>(parameters)...);
+ }
+
+ C& c = *receiver;
+ return (c.*m_function)(std::forward<IncomingParameters>(parameters)...);
}
private:

Powered by Google App Engine
This is Rietveld 408576698