Home | History | Annotate | Download | only in platform
      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 
     41 namespace blink {
     42 
     43 CrossThreadCopierBase<false, false, false, KURL>::Type CrossThreadCopierBase<false, false, false, KURL>::copy(const KURL& url)
     44 {
     45     return url.copy();
     46 }
     47 
     48 CrossThreadCopierBase<false, false, false, String>::Type CrossThreadCopierBase<false, false, false, String>::copy(const String& str)
     49 {
     50     return str.isolatedCopy();
     51 }
     52 
     53 CrossThreadCopierBase<false, false, false, ResourceError>::Type CrossThreadCopierBase<false, false, false, ResourceError>::copy(const ResourceError& error)
     54 {
     55     return error.copy();
     56 }
     57 
     58 CrossThreadCopierBase<false, false, false, ResourceRequest>::Type CrossThreadCopierBase<false, false, false, ResourceRequest>::copy(const ResourceRequest& request)
     59 {
     60     return request.copyData();
     61 }
     62 
     63 CrossThreadCopierBase<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.
     71 class CopierThreadSafeRefCountedTest : public ThreadSafeRefCounted<CopierThreadSafeRefCountedTest> {
     72 };
     73 
     74 COMPILE_ASSERT((WTF::IsSameType<
     75                   PassRefPtr<CopierThreadSafeRefCountedTest>,
     76                   CrossThreadCopier<PassRefPtr<CopierThreadSafeRefCountedTest> >::Type
     77                   >::value),
     78                PassRefPtrTest);
     79 COMPILE_ASSERT((WTF::IsSameType<
     80                   PassRefPtr<CopierThreadSafeRefCountedTest>,
     81                   CrossThreadCopier<RefPtr<CopierThreadSafeRefCountedTest> >::Type
     82                   >::value),
     83                RefPtrTest);
     84 COMPILE_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.
     92 template<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.
     97 class CopierRefCountedTest : public RefCounted<CopierRefCountedTest> {
     98 };
     99 
    100 COMPILE_ASSERT((WTF::IsSameType<
    101                   int,
    102                   CrossThreadCopier<PassRefPtr<CopierRefCountedTest> >::Type
    103                   >::value),
    104                PassRefPtrRefCountedTest);
    105 
    106 COMPILE_ASSERT((WTF::IsSameType<
    107                   int,
    108                   CrossThreadCopier<RefPtr<CopierRefCountedTest> >::Type
    109                   >::value),
    110                RefPtrRefCountedTest);
    111 
    112 COMPILE_ASSERT((WTF::IsSameType<
    113                   int,
    114                   CrossThreadCopier<CopierRefCountedTest*>::Type
    115                   >::value),
    116                RawPointerRefCountedTest);
    117 
    118 // Verify that PassOwnPtr gets passed through.
    119 COMPILE_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.
    126 COMPILE_ASSERT((WTF::IsSameType<
    127                   int,
    128                   CrossThreadCopier<OwnPtr<float> >::Type
    129                   >::value),
    130                OwnPtrTest);
    131 
    132 } // namespace blink
    133