| Index: Source/platform/CrossThreadCopier.h
|
| diff --git a/Source/platform/CrossThreadCopier.h b/Source/platform/CrossThreadCopier.h
|
| index 7c0e48c4fb73243adf4adda8645dee495d0ac9ab..5860309cfdb16b1359235d82e9ee675ac816cf00 100644
|
| --- a/Source/platform/CrossThreadCopier.h
|
| +++ b/Source/platform/CrossThreadCopier.h
|
| @@ -32,6 +32,7 @@
|
| #define CrossThreadCopier_h
|
|
|
| #include "platform/PlatformExport.h"
|
| +#include "platform/heap/Handle.h"
|
| #include "wtf/Assertions.h"
|
| #include "wtf/Forward.h"
|
| #include "wtf/PassOwnPtr.h"
|
| @@ -61,28 +62,28 @@ namespace WebCore {
|
| }
|
| };
|
|
|
| - template<bool isConvertibleToInteger, bool isThreadSafeRefCounted, typename T> struct CrossThreadCopierBase;
|
| + template<bool isConvertibleToInteger, bool isThreadSafeRefCounted, bool isGarbageCollected, typename T> struct CrossThreadCopierBase;
|
|
|
| // Integers get passed through without any changes.
|
| - template<typename T> struct CrossThreadCopierBase<true, false, T> : public CrossThreadCopierPassThrough<T> {
|
| + template<typename T> struct CrossThreadCopierBase<true, false, false, T> : public CrossThreadCopierPassThrough<T> {
|
| };
|
|
|
| // To allow a type to be passed across threads using its copy constructor, add a forward declaration of the type and
|
| // a CopyThreadCopierBase<false, false, TypeName> : public CrossThreadCopierPassThrough<TypeName> { }; to this file.
|
| - template<> struct CrossThreadCopierBase<false, false, ThreadableLoaderOptions> : public CrossThreadCopierPassThrough<ThreadableLoaderOptions> {
|
| + template<> struct CrossThreadCopierBase<false, false, false, ThreadableLoaderOptions> : public CrossThreadCopierPassThrough<ThreadableLoaderOptions> {
|
| };
|
|
|
| - template<> struct CrossThreadCopierBase<false, false, ResourceLoaderOptions> : public CrossThreadCopierPassThrough<ResourceLoaderOptions> {
|
| + template<> struct CrossThreadCopierBase<false, false, false, ResourceLoaderOptions> : public CrossThreadCopierPassThrough<ResourceLoaderOptions> {
|
| };
|
|
|
| - template<> struct CrossThreadCopierBase<false, false, IntRect> : public CrossThreadCopierPassThrough<IntRect> {
|
| + template<> struct CrossThreadCopierBase<false, false, false, IntRect> : public CrossThreadCopierPassThrough<IntRect> {
|
| };
|
|
|
| - template<> struct CrossThreadCopierBase<false, false, IntSize> : public CrossThreadCopierPassThrough<IntSize> {
|
| + template<> struct CrossThreadCopierBase<false, false, false, IntSize> : public CrossThreadCopierPassThrough<IntSize> {
|
| };
|
|
|
| // Custom copy methods.
|
| - template<typename T> struct CrossThreadCopierBase<false, true, T> {
|
| + template<typename T> struct CrossThreadCopierBase<false, true, false, T> {
|
| typedef typename WTF::RemoveTemplate<T, RefPtr>::Type TypeWithoutRefPtr;
|
| typedef typename WTF::RemoveTemplate<TypeWithoutRefPtr, PassRefPtr>::Type TypeWithoutPassRefPtr;
|
| typedef typename WTF::RemovePointer<TypeWithoutPassRefPtr>::Type RefCountedType;
|
| @@ -100,7 +101,7 @@ namespace WebCore {
|
| }
|
| };
|
|
|
| - template<typename T> struct CrossThreadCopierBase<false, false, PassOwnPtr<T> > {
|
| + template<typename T> struct CrossThreadCopierBase<false, false, false, PassOwnPtr<T> > {
|
| typedef PassOwnPtr<T> Type;
|
| static Type copy(Type ownPtr)
|
| {
|
| @@ -108,36 +109,46 @@ namespace WebCore {
|
| }
|
| };
|
|
|
| - template<> struct CrossThreadCopierBase<false, false, KURL> {
|
| + template<> struct CrossThreadCopierBase<false, false, false, KURL> {
|
| typedef KURL Type;
|
| PLATFORM_EXPORT static Type copy(const KURL&);
|
| };
|
|
|
| - template<> struct CrossThreadCopierBase<false, false, String> {
|
| + template<> struct CrossThreadCopierBase<false, false, false, String> {
|
| typedef String Type;
|
| PLATFORM_EXPORT static Type copy(const String&);
|
| };
|
|
|
| - template<> struct CrossThreadCopierBase<false, false, ResourceError> {
|
| + template<> struct CrossThreadCopierBase<false, false, false, ResourceError> {
|
| typedef ResourceError Type;
|
| PLATFORM_EXPORT static Type copy(const ResourceError&);
|
| };
|
|
|
| - template<> struct CrossThreadCopierBase<false, false, ResourceRequest> {
|
| + template<> struct CrossThreadCopierBase<false, false, false, ResourceRequest> {
|
| typedef PassOwnPtr<CrossThreadResourceRequestData> Type;
|
| PLATFORM_EXPORT static Type copy(const ResourceRequest&);
|
| };
|
|
|
| - template<> struct CrossThreadCopierBase<false, false, ResourceResponse> {
|
| + template<> struct CrossThreadCopierBase<false, false, false, ResourceResponse> {
|
| typedef PassOwnPtr<CrossThreadResourceResponseData> Type;
|
| PLATFORM_EXPORT static Type copy(const ResourceResponse&);
|
| };
|
|
|
| + template<typename T> struct CrossThreadCopierBase<false, false, true, T> {
|
| + typedef typename WTF::RemovePointer<T>::Type TypeWithoutPointer;
|
| + typedef PassRefPtrWillBeRawPtr<TypeWithoutPointer> Type;
|
| + static Type copy(const T& ptr)
|
| + {
|
| + return ptr;
|
| + }
|
| + };
|
| +
|
| template<typename T> struct CrossThreadCopier : public CrossThreadCopierBase<WTF::IsConvertibleToInteger<T>::value,
|
| - WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, RefPtr>::Type, ThreadSafeRefCounted>::value
|
| - || WTF::IsSubclassOfTemplate<typename WTF::RemovePointer<T>::Type, ThreadSafeRefCounted>::value
|
| - || WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, PassRefPtr>::Type, ThreadSafeRefCounted>::value,
|
| - T> {
|
| + WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, RefPtr>::Type, ThreadSafeRefCounted>::value
|
| + || WTF::IsSubclassOfTemplate<typename WTF::RemovePointer<T>::Type, ThreadSafeRefCounted>::value
|
| + || WTF::IsSubclassOfTemplate<typename WTF::RemoveTemplate<T, PassRefPtr>::Type, ThreadSafeRefCounted>::value,
|
| + WTF::IsSubclassOfTemplate<typename WTF::RemovePointer<T>::Type, GarbageCollected>::value,
|
| + T> {
|
| };
|
|
|
| template<typename T> struct AllowCrossThreadAccessWrapper {
|
| @@ -148,7 +159,7 @@ namespace WebCore {
|
| T* m_value;
|
| };
|
|
|
| - template<typename T> struct CrossThreadCopierBase<false, false, AllowCrossThreadAccessWrapper<T> > {
|
| + template<typename T> struct CrossThreadCopierBase<false, false, false, AllowCrossThreadAccessWrapper<T> > {
|
| typedef T* Type;
|
| static Type copy(const AllowCrossThreadAccessWrapper<T>& wrapper) { return wrapper.value(); }
|
| };
|
| @@ -168,7 +179,7 @@ namespace WebCore {
|
| T* m_value;
|
| };
|
|
|
| - template<typename T> struct CrossThreadCopierBase<false, false, AllowAccessLaterWrapper<T> > {
|
| + template<typename T> struct CrossThreadCopierBase<false, false, false, AllowAccessLaterWrapper<T> > {
|
| typedef T* Type;
|
| static Type copy(const AllowAccessLaterWrapper<T>& wrapper) { return wrapper.value(); }
|
| };
|
|
|