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 #ifndef WebString_h
     32 #define WebString_h
     33 
     34 #include "WebCommon.h"
     35 #include "WebPrivatePtr.h"
     36 #include <string>
     37 
     38 #if INSIDE_BLINK
     39 #include "wtf/Forward.h"
     40 #else
     41 #include <base/strings/latin1_string_conversions.h>
     42 #include <base/strings/nullable_string16.h>
     43 #include <base/strings/string16.h>
     44 #endif
     45 
     46 namespace WTF {
     47 class StringImpl;
     48 }
     49 
     50 namespace blink {
     51 
     52 class WebCString;
     53 
     54 // A UTF-16 string container.  It is inexpensive to copy a WebString
     55 // object.
     56 //
     57 // WARNING: It is not safe to pass a WebString across threads!!!
     58 //
     59 class WebString {
     60 public:
     61     ~WebString() { reset(); }
     62 
     63     WebString() { }
     64 
     65     WebString(const WebUChar* data, size_t len)
     66     {
     67         assign(data, len);
     68     }
     69 
     70     WebString(const WebString& s) { assign(s); }
     71 
     72     WebString& operator=(const WebString& s)
     73     {
     74         assign(s);
     75         return *this;
     76     }
     77 
     78     BLINK_COMMON_EXPORT void reset();
     79     BLINK_COMMON_EXPORT void assign(const WebString&);
     80     BLINK_COMMON_EXPORT void assign(const WebUChar* data, size_t len);
     81 
     82     BLINK_COMMON_EXPORT bool equals(const WebString&) const;
     83 
     84     BLINK_COMMON_EXPORT size_t length() const;
     85 
     86     // Caller must check bounds.
     87     BLINK_COMMON_EXPORT WebUChar at(unsigned) const;
     88 
     89     bool isEmpty() const { return !length(); }
     90     bool isNull() const { return m_private.isNull(); }
     91 
     92     BLINK_COMMON_EXPORT std::string utf8() const;
     93 
     94     BLINK_COMMON_EXPORT static WebString fromUTF8(const char* data, size_t length);
     95     BLINK_COMMON_EXPORT static WebString fromUTF8(const char* data);
     96 
     97     static WebString fromUTF8(const std::string& s)
     98     {
     99         return fromUTF8(s.data(), s.length());
    100     }
    101 
    102     BLINK_COMMON_EXPORT std::string latin1() const;
    103 
    104     BLINK_COMMON_EXPORT static WebString fromLatin1(const WebLChar* data, size_t length);
    105 
    106     static WebString fromLatin1(const std::string& s)
    107     {
    108         return fromLatin1(reinterpret_cast<const WebLChar*>(s.data()), s.length());
    109     }
    110 
    111     template <int N> WebString(const char (&data)[N])
    112     {
    113         assign(fromUTF8(data, N - 1));
    114     }
    115 
    116     template <int N> WebString& operator=(const char (&data)[N])
    117     {
    118         assign(fromUTF8(data, N - 1));
    119         return *this;
    120     }
    121 
    122 #if INSIDE_BLINK
    123     BLINK_COMMON_EXPORT WebString(const WTF::String&);
    124     BLINK_COMMON_EXPORT WebString& operator=(const WTF::String&);
    125     BLINK_COMMON_EXPORT operator WTF::String() const;
    126 
    127     BLINK_COMMON_EXPORT WebString(const WTF::AtomicString&);
    128     BLINK_COMMON_EXPORT WebString& operator=(const WTF::AtomicString&);
    129     BLINK_COMMON_EXPORT operator WTF::AtomicString() const;
    130 #else
    131     WebString(const base::string16& s)
    132     {
    133         assign(s.data(), s.length());
    134     }
    135 
    136     WebString& operator=(const base::string16& s)
    137     {
    138         assign(s.data(), s.length());
    139         return *this;
    140     }
    141 
    142     operator base::string16() const
    143     {
    144         return base::Latin1OrUTF16ToUTF16(length(), data8(), data16());
    145     }
    146 
    147     WebString(const base::NullableString16& s)
    148     {
    149         if (s.is_null())
    150             reset();
    151         else
    152             assign(s.string().data(), s.string().length());
    153     }
    154 
    155     WebString& operator=(const base::NullableString16& s)
    156     {
    157         if (s.is_null())
    158             reset();
    159         else
    160             assign(s.string().data(), s.string().length());
    161         return *this;
    162     }
    163 
    164     operator base::NullableString16() const
    165     {
    166         return base::NullableString16(operator base::string16(), m_private.isNull());
    167     }
    168 #endif
    169 
    170 private:
    171     BLINK_COMMON_EXPORT bool is8Bit() const;
    172     BLINK_COMMON_EXPORT const WebLChar* data8() const;
    173     BLINK_COMMON_EXPORT const WebUChar* data16() const;
    174 
    175     BLINK_COMMON_EXPORT void assign(WTF::StringImpl*);
    176 
    177     WebPrivatePtr<WTF::StringImpl> m_private;
    178 };
    179 
    180 inline bool operator==(const WebString& a, const WebString& b)
    181 {
    182     return a.equals(b);
    183 }
    184 
    185 inline bool operator!=(const WebString& a, const WebString& b)
    186 {
    187     return !(a == b);
    188 }
    189 
    190 } // namespace blink
    191 
    192 #endif
    193