1/* 2 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#include "config.h" 32 33#include "platform/CrossThreadCopier.h" 34 35#include "platform/network/ResourceError.h" 36#include "platform/network/ResourceRequest.h" 37#include "platform/network/ResourceResponse.h" 38#include "platform/weborigin/KURL.h" 39#include "wtf/text/WTFString.h" 40 41namespace blink { 42 43CrossThreadCopierBase<false, false, false, KURL>::Type CrossThreadCopierBase<false, false, false, KURL>::copy(const KURL& url) 44{ 45 return url.copy(); 46} 47 48CrossThreadCopierBase<false, false, false, String>::Type CrossThreadCopierBase<false, false, false, String>::copy(const String& str) 49{ 50 return str.isolatedCopy(); 51} 52 53CrossThreadCopierBase<false, false, false, ResourceError>::Type CrossThreadCopierBase<false, false, false, ResourceError>::copy(const ResourceError& error) 54{ 55 return error.copy(); 56} 57 58CrossThreadCopierBase<false, false, false, ResourceRequest>::Type CrossThreadCopierBase<false, false, false, ResourceRequest>::copy(const ResourceRequest& request) 59{ 60 return request.copyData(); 61} 62 63CrossThreadCopierBase<false, false, false, ResourceResponse>::Type CrossThreadCopierBase<false, false, false, ResourceResponse>::copy(const ResourceResponse& response) 64{ 65 return response.copyData(); 66} 67 68// Test CrossThreadCopier using COMPILE_ASSERT. 69 70// Verify that ThreadSafeRefCounted objects get handled correctly. 71class CopierThreadSafeRefCountedTest : public ThreadSafeRefCounted<CopierThreadSafeRefCountedTest> { 72}; 73 74COMPILE_ASSERT((WTF::IsSameType< 75 PassRefPtr<CopierThreadSafeRefCountedTest>, 76 CrossThreadCopier<PassRefPtr<CopierThreadSafeRefCountedTest> >::Type 77 >::value), 78 PassRefPtrTest); 79COMPILE_ASSERT((WTF::IsSameType< 80 PassRefPtr<CopierThreadSafeRefCountedTest>, 81 CrossThreadCopier<RefPtr<CopierThreadSafeRefCountedTest> >::Type 82 >::value), 83 RefPtrTest); 84COMPILE_ASSERT((WTF::IsSameType< 85 PassRefPtr<CopierThreadSafeRefCountedTest>, 86 CrossThreadCopier<CopierThreadSafeRefCountedTest*>::Type 87 >::value), 88 RawPointerTest); 89 90 91// Add a generic specialization which will let's us verify that no other template matches. 92template<typename T> struct CrossThreadCopierBase<false, false, false, T> { 93 typedef int Type; 94}; 95 96// Verify that RefCounted objects only match our generic template which exposes Type as int. 97class CopierRefCountedTest : public RefCounted<CopierRefCountedTest> { 98}; 99 100COMPILE_ASSERT((WTF::IsSameType< 101 int, 102 CrossThreadCopier<PassRefPtr<CopierRefCountedTest> >::Type 103 >::value), 104 PassRefPtrRefCountedTest); 105 106COMPILE_ASSERT((WTF::IsSameType< 107 int, 108 CrossThreadCopier<RefPtr<CopierRefCountedTest> >::Type 109 >::value), 110 RefPtrRefCountedTest); 111 112COMPILE_ASSERT((WTF::IsSameType< 113 int, 114 CrossThreadCopier<CopierRefCountedTest*>::Type 115 >::value), 116 RawPointerRefCountedTest); 117 118// Verify that PassOwnPtr gets passed through. 119COMPILE_ASSERT((WTF::IsSameType< 120 PassOwnPtr<float>, 121 CrossThreadCopier<PassOwnPtr<float> >::Type 122 >::value), 123 PassOwnPtrTest); 124 125// Verify that PassOwnPtr does not get passed through. 126COMPILE_ASSERT((WTF::IsSameType< 127 int, 128 CrossThreadCopier<OwnPtr<float> >::Type 129 >::value), 130 OwnPtrTest); 131 132} // namespace blink 133