summaryrefslogtreecommitdiff
path: root/mojo/public/cpp/bindings/lib/string_traits_wtf.cc
blob: 71b758c49c135c1a2a4a57dee51498a6dd8b55d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "mojo/public/cpp/bindings/string_traits_wtf.h"

#include <string.h>

#include "base/logging.h"
#include "mojo/public/cpp/bindings/lib/array_internal.h"
#include "mojo/public/cpp/bindings/string_data_view.h"
#include "third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h"

namespace mojo {
namespace {

struct UTF8AdaptorInfo {
  explicit UTF8AdaptorInfo(const WTF::String& input) : utf8_adaptor(input) {
#if DCHECK_IS_ON()
    original_size_in_bytes = input.CharactersSizeInBytes();
#endif
  }

  ~UTF8AdaptorInfo() {}

  WTF::StringUTF8Adaptor utf8_adaptor;

#if DCHECK_IS_ON()
  // For sanity check only.
  size_t original_size_in_bytes;
#endif
};

UTF8AdaptorInfo* ToAdaptor(const WTF::String& input, void* context) {
  UTF8AdaptorInfo* adaptor = static_cast<UTF8AdaptorInfo*>(context);

#if DCHECK_IS_ON()
  DCHECK_EQ(adaptor->original_size_in_bytes, input.CharactersSizeInBytes());
#endif
  return adaptor;
}

}  // namespace

// static
void StringTraits<WTF::String>::SetToNull(WTF::String* output) {
  if (output->IsNull())
    return;

  WTF::String result;
  output->swap(result);
}

// static
void* StringTraits<WTF::String>::SetUpContext(const WTF::String& input) {
  return new UTF8AdaptorInfo(input);
}

// static
void StringTraits<WTF::String>::TearDownContext(const WTF::String& input,
                                                void* context) {
  delete ToAdaptor(input, context);
}

// static
size_t StringTraits<WTF::String>::GetSize(const WTF::String& input,
                                          void* context) {
  return ToAdaptor(input, context)->utf8_adaptor.length();
}

// static
const char* StringTraits<WTF::String>::GetData(const WTF::String& input,
                                               void* context) {
  return ToAdaptor(input, context)->utf8_adaptor.Data();
}

// static
bool StringTraits<WTF::String>::Read(StringDataView input,
                                     WTF::String* output) {
  WTF::String result = WTF::String::FromUTF8(input.storage(), input.size());
  output->swap(result);
  return true;
}

}  // namespace mojo