Chromium Code Reviews| Index: Source/bindings/core/v8/CallbackPromiseAdapter.h |
| diff --git a/Source/bindings/core/v8/CallbackPromiseAdapter.h b/Source/bindings/core/v8/CallbackPromiseAdapter.h |
| index 8f26b5c07451677a0735b2392e3c2dae058699fe..a93c7971381785adde080cb481fe9d53fc202927 100644 |
| --- a/Source/bindings/core/v8/CallbackPromiseAdapter.h |
| +++ b/Source/bindings/core/v8/CallbackPromiseAdapter.h |
| @@ -33,47 +33,52 @@ |
| #include "bindings/core/v8/ScriptPromiseResolver.h" |
| #include "public/platform/WebCallbacks.h" |
| +#include "public/platform/WebPassOwnPtr.h" |
| +#include "wtf/OwnPtr.h" |
| +#include "wtf/PassOwnPtr.h" |
| namespace blink { |
| -// This class provides an easy way to convert from a Script-exposed |
| -// class (i.e. a class that has a toV8() overload) that uses Promises |
| -// to a WebKit API class that uses WebCallbacks. You can define |
| -// separate Success and Error classes, but this example just uses one |
| -// object for both. |
| -// |
| -// To use: |
| -// |
| -// class MyClass ... { |
| -// typedef blink::WebMyClass WebType; |
| -// |
| -// // Takes ownership of |webInstance|. |
| -// static PassRefPtr<MyClass> take(ScriptPromiseResolver* resolver, |
| -// PassOwnPtr<blink::WebMyClass> webInstance) { |
| -// // convert/create as appropriate, but often it's just: |
| -// return MyClass::create(webInstance); |
| -// |
| -// // Since promise resolving is done as an async task, it's not |
| -// // guaranteed that the script context has seen the promise resolve |
| -// // immediately after calling onSuccess/onError. You can use the |
| -// // ScriptPromise from the resolver to schedule a task that executes |
| -// // after resolving: |
| -// ScriptState::Scope scope(resolver->scriptState()); |
| -// resolver->promise().then(...); |
| -// } |
| -// |
| -// Now when calling into a WebKit API that requires a WebCallbacks<blink::WebMyClass, blink::WebMyClass>*: |
| -// |
| -// // call signature: callSomeMethod(WebCallbacks<MyClass, MyClass>* callbacks) |
| -// webObject->callSomeMethod(new CallbackPromiseAdapter<MyClass, MyClass>(resolver, scriptExecutionContext)); |
| -// |
| -// Note: |
| -// - This class does not manage its own lifetime. In this example that ownership |
| -// of the WebCallbacks instance is being passed in and it is up to the callee |
| -// to free the WebCallbacks instance. |
| -// - onSuccess and onError take ownership of the given WebType instance. |
| +class CallbackPromiseAdapterBase { |
| +public: |
| + // The following templates should be gone once the repositories are merged |
| + // and we can use C++11 libraries. |
| + template <typename T> |
| + struct PassTypeImpl { |
| + using Type = T; |
| + }; |
| + template <typename T> |
| + struct PassTypeImpl<OwnPtr<T>> { |
| + using Type = PassOwnPtr<T>; |
| + }; |
| + |
| + template <typename T> |
| + struct WebPassTypeImpl { |
| + using Type = T; |
| + }; |
| + template <typename T> |
| + struct WebPassTypeImpl<OwnPtr<T>> { |
| + using Type = WebPassOwnPtr<T>; |
| + }; |
| + template <typename T> |
| + using PassType = typename PassTypeImpl<T>::Type; |
| + template <typename T> |
| + using WebPassType = typename WebPassTypeImpl<T>::Type; |
| + template <typename T> |
| + static T& adopt(T& x) { return x; } |
| + template <typename T> |
| + static PassOwnPtr<T> adopt(WebPassOwnPtr<T>& x) { return x.release(); } |
| + template <typename T> |
| + static PassType<T> pass(T& x) { return x; } |
| + template <typename T> |
| + static PassOwnPtr<T> pass(OwnPtr<T>& x) { return x.release(); } |
| +}; |
| + |
| + |
| +// TODO(yhirano): Add comments. |
|
haraken
2015/07/27 12:48:31
Can we add a comment in this CL?
yhirano
2015/07/29 04:01:53
I will add comments at the third CL - Is that enou
|
| template<typename S, typename T> |
| -class CallbackPromiseAdapter final : public WebCallbacks<typename S::WebType*, typename T::WebType*> { |
| +class CallbackPromiseAdapter final |
| + : public WebCallbacks<typename CallbackPromiseAdapterBase::WebPassType<typename S::WebType>, typename CallbackPromiseAdapterBase::WebPassType<typename T::WebType>>, public CallbackPromiseAdapterBase { |
| WTF_MAKE_NONCOPYABLE(CallbackPromiseAdapter); |
| public: |
| explicit CallbackPromiseAdapter(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver) |
| @@ -83,22 +88,20 @@ public: |
| } |
| ~CallbackPromiseAdapter() override { } |
| - // Takes ownership of |result|. |
| - void onSuccess(typename S::WebType* result) override |
| + void onSuccess(WebPassType<typename S::WebType> r) override |
| { |
| - OwnPtr<typename S::WebType> ownPtr = adoptPtr(result); |
| + typename S::WebType result(adopt(r)); |
| if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) |
| return; |
| - m_resolver->resolve(S::take(m_resolver.get(), ownPtr.release())); |
| + m_resolver->resolve(S::take(m_resolver.get(), pass(result))); |
| } |
| - // Takes ownership of |error|. |
| - void onError(typename T::WebType* error) override |
| + void onError(WebPassType<typename T::WebType> e) override |
| { |
| - OwnPtr<typename T::WebType> ownPtr = adoptPtr(error); |
| + typename T::WebType error(adopt(e)); |
| if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) |
| return; |
| - m_resolver->reject(T::take(m_resolver.get(), ownPtr.release())); |
| + m_resolver->reject(T::take(m_resolver.get(), pass(error))); |
| } |
| private: |
| @@ -106,7 +109,7 @@ private: |
| }; |
| template<typename T> |
| -class CallbackPromiseAdapter<void, T> final : public WebCallbacks<void, typename T::WebType*> { |
| +class CallbackPromiseAdapter<void, T> final : public WebCallbacks<void, typename CallbackPromiseAdapterBase::WebPassType<typename T::WebType>>, public CallbackPromiseAdapterBase { |
| WTF_MAKE_NONCOPYABLE(CallbackPromiseAdapter); |
| public: |
| explicit CallbackPromiseAdapter(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver) |
| @@ -123,13 +126,12 @@ public: |
| m_resolver->resolve(); |
| } |
| - // Takes ownership of |error|. |
| - void onError(typename T::WebType* error) override |
| + void onError(WebPassType<typename T::WebType> e) override |
| { |
| - OwnPtr<typename T::WebType> ownPtr = adoptPtr(error); |
| + typename T::WebType error(adopt(e)); |
| if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) |
| return; |
| - m_resolver->reject(T::take(m_resolver.get(), ownPtr.release())); |
| + m_resolver->reject(T::take(m_resolver.get(), pass(error))); |
| } |
| private: |
| @@ -137,7 +139,7 @@ private: |
| }; |
| template<typename S> |
| -class CallbackPromiseAdapter<S, void> final : public WebCallbacks<typename S::WebType*, void> { |
| +class CallbackPromiseAdapter<S, void> final : public WebCallbacks<typename CallbackPromiseAdapterBase::WebPassType<typename S::WebType>, void>, public CallbackPromiseAdapterBase { |
| WTF_MAKE_NONCOPYABLE(CallbackPromiseAdapter); |
| public: |
| explicit CallbackPromiseAdapter(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver) |
| @@ -147,13 +149,12 @@ public: |
| } |
| ~CallbackPromiseAdapter() override { } |
| - // Takes ownership of |result|. |
| - void onSuccess(typename S::WebType* result) override |
| + void onSuccess(WebPassType<typename S::WebType> r) override |
| { |
| - OwnPtr<typename S::WebType> ownPtr = adoptPtr(result); |
| + typename S::WebType result(adopt(r)); |
| if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) |
| return; |
| - m_resolver->resolve(S::take(m_resolver.get(), ownPtr.release())); |
| + m_resolver->resolve(S::take(m_resolver.get(), pass(result))); |
| } |
| void onError() override |
| @@ -168,7 +169,7 @@ private: |
| }; |
| template<typename T> |
| -class CallbackPromiseAdapter<bool, T> final : public WebCallbacks<bool*, typename T::WebType*> { |
| +class CallbackPromiseAdapter<bool, T> final : public WebCallbacks<bool*, typename CallbackPromiseAdapterBase::WebPassType<typename T::WebType>>, public CallbackPromiseAdapterBase { |
| WTF_MAKE_NONCOPYABLE(CallbackPromiseAdapter); |
| public: |
| explicit CallbackPromiseAdapter(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver) |
| @@ -187,13 +188,12 @@ public: |
| m_resolver->resolve(*result); |
| } |
| - // Takes ownership of |error|. |
| - void onError(typename T::WebType* error) override |
| + void onError(WebPassType<typename T::WebType> e) override |
| { |
| - OwnPtr<typename T::WebType> ownPtr = adoptPtr(error); |
| + typename T::WebType error(adopt(e)); |
| if (!m_resolver->executionContext() || m_resolver->executionContext()->activeDOMObjectsAreStopped()) |
| return; |
| - m_resolver->reject(T::take(m_resolver.get(), ownPtr.release())); |
| + m_resolver->reject(T::take(m_resolver.get(), pass(error))); |
| } |
| private: |
| @@ -201,7 +201,7 @@ private: |
| }; |
| template<> |
| -class CallbackPromiseAdapter<void, void> final : public WebCallbacks<void, void> { |
| +class CallbackPromiseAdapter<void, void> final : public WebCallbacks<void, void>, public CallbackPromiseAdapterBase { |
| WTF_MAKE_NONCOPYABLE(CallbackPromiseAdapter); |
| public: |
| explicit CallbackPromiseAdapter(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver) |
| @@ -230,7 +230,7 @@ private: |
| }; |
| template<> |
| -class CallbackPromiseAdapter<bool, void> final : public WebCallbacks<bool*, void> { |
| +class CallbackPromiseAdapter<bool, void> final : public WebCallbacks<bool*, void>, public CallbackPromiseAdapterBase { |
| WTF_MAKE_NONCOPYABLE(CallbackPromiseAdapter); |
| public: |
| explicit CallbackPromiseAdapter(PassRefPtrWillBeRawPtr<ScriptPromiseResolver> resolver) |