1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "mojo/public/cpp/bindings/string_traits_wtf.h"
6
7 #include <string.h>
8
9 #include "base/logging.h"
10 #include "mojo/public/cpp/bindings/lib/array_internal.h"
11 #include "third_party/WebKit/Source/wtf/text/StringUTF8Adaptor.h"
12
13 namespace mojo {
14 namespace {
15
16 struct UTF8AdaptorInfo {
UTF8AdaptorInfomojo::__anon651e57a30111::UTF8AdaptorInfo17 explicit UTF8AdaptorInfo(const WTF::String& input) : utf8_adaptor(input) {
18 #if DCHECK_IS_ON()
19 original_size_in_bytes = static_cast<size_t>(input.sizeInBytes());
20 #endif
21 }
22
~UTF8AdaptorInfomojo::__anon651e57a30111::UTF8AdaptorInfo23 ~UTF8AdaptorInfo() {}
24
25 WTF::StringUTF8Adaptor utf8_adaptor;
26
27 #if DCHECK_IS_ON()
28 // For sanity check only.
29 size_t original_size_in_bytes;
30 #endif
31 };
32
ToAdaptor(const WTF::String & input,void * context)33 UTF8AdaptorInfo* ToAdaptor(const WTF::String& input, void* context) {
34 UTF8AdaptorInfo* adaptor = static_cast<UTF8AdaptorInfo*>(context);
35
36 #if DCHECK_IS_ON()
37 DCHECK_EQ(adaptor->original_size_in_bytes,
38 static_cast<size_t>(input.sizeInBytes()));
39 #endif
40 return adaptor;
41 }
42
43 } // namespace
44
45 // static
SetToNull(WTF::String * output)46 void StringTraits<WTF::String>::SetToNull(WTF::String* output) {
47 if (output->isNull())
48 return;
49
50 WTF::String result;
51 output->swap(result);
52 }
53
54 // static
SetUpContext(const WTF::String & input)55 void* StringTraits<WTF::String>::SetUpContext(const WTF::String& input) {
56 return new UTF8AdaptorInfo(input);
57 }
58
59 // static
TearDownContext(const WTF::String & input,void * context)60 void StringTraits<WTF::String>::TearDownContext(const WTF::String& input,
61 void* context) {
62 delete ToAdaptor(input, context);
63 }
64
65 // static
GetSize(const WTF::String & input,void * context)66 size_t StringTraits<WTF::String>::GetSize(const WTF::String& input,
67 void* context) {
68 return ToAdaptor(input, context)->utf8_adaptor.length();
69 }
70
71 // static
GetData(const WTF::String & input,void * context)72 const char* StringTraits<WTF::String>::GetData(const WTF::String& input,
73 void* context) {
74 return ToAdaptor(input, context)->utf8_adaptor.data();
75 }
76
77 // static
Read(StringDataView input,WTF::String * output)78 bool StringTraits<WTF::String>::Read(StringDataView input,
79 WTF::String* output) {
80 WTF::String result = WTF::String::fromUTF8(input.storage(), input.size());
81 output->swap(result);
82 return true;
83 }
84
85 } // namespace mojo
86