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 "mojo/public/cpp/bindings/string_data_view.h" 12 #include "third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h" 13 14 namespace mojo { 15 namespace { 16 17 struct UTF8AdaptorInfo { 18 explicit UTF8AdaptorInfo(const WTF::String& input) : utf8_adaptor(input) { 19 #if DCHECK_IS_ON() 20 original_size_in_bytes = input.CharactersSizeInBytes(); 21 #endif 22 } 23 24 ~UTF8AdaptorInfo() {} 25 26 WTF::StringUTF8Adaptor utf8_adaptor; 27 28 #if DCHECK_IS_ON() 29 // For sanity check only. 30 size_t original_size_in_bytes; 31 #endif 32 }; 33 34 UTF8AdaptorInfo* ToAdaptor(const WTF::String& input, void* context) { 35 UTF8AdaptorInfo* adaptor = static_cast<UTF8AdaptorInfo*>(context); 36 37 #if DCHECK_IS_ON() 38 DCHECK_EQ(adaptor->original_size_in_bytes, input.CharactersSizeInBytes()); 39 #endif 40 return adaptor; 41 } 42 43 } // namespace 44 45 // static 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 55 void* StringTraits<WTF::String>::SetUpContext(const WTF::String& input) { 56 return new UTF8AdaptorInfo(input); 57 } 58 59 // static 60 void StringTraits<WTF::String>::TearDownContext(const WTF::String& input, 61 void* context) { 62 delete ToAdaptor(input, context); 63 } 64 65 // static 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 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 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