From 583ed9487b207982774fcfa11c563b7add77a808 Mon Sep 17 00:00:00 2001 From: yzshen Date: Tue, 15 Mar 2016 11:43:53 -0700 Subject: Mojo C++ bindings: introduce mojo::WTFArray. mojo::WTFArray is a thin wrapper around WTF::Vector. It is move-only and can express null array. You can move WTF::Vector in/out of mojo::WTFArray. If "--for_blink" is specified for the bindings generator, the generator will map mojo array to mojo::WTFArray BUG=583738 Review URL: https://codereview.chromium.org/1766093002 Cr-Commit-Position: refs/heads/master@{#381265} --- mojo/mojo_edk_tests.gyp | 9 + mojo/mojo_public.gyp | 2 + mojo/public/cpp/bindings/BUILD.gn | 2 + mojo/public/cpp/bindings/array.h | 3 +- .../cpp/bindings/lib/array_serialization_traits.h | 3 +- mojo/public/cpp/bindings/lib/connector.cc | 4 +- .../cpp/bindings/lib/serialization_forward.h | 23 ++ mojo/public/cpp/bindings/lib/value_traits.h | 4 + .../cpp/bindings/lib/wtf_array_serialization.h | 43 +++ mojo/public/cpp/bindings/lib/wtf_serialization.h | 1 + mojo/public/cpp/bindings/tests/BUILD.gn | 9 + mojo/public/cpp/bindings/tests/array_common_test.h | 392 ++++++++++++++++++++ mojo/public/cpp/bindings/tests/array_unittest.cc | 393 +-------------------- .../cpp/bindings/tests/wtf_array_unittest.cc | 62 ++++ .../cpp/bindings/tests/wtf_types_unittest.cc | 75 ++-- mojo/public/cpp/bindings/wtf_array.h | 235 ++++++++++++ mojo/public/interfaces/bindings/tests/BUILD.gn | 4 - .../interfaces/bindings/tests/test_wtf_types.mojom | 6 + .../generators/cpp_templates/module.h.tmpl | 3 +- .../bindings/generators/mojom_cpp_generator.py | 12 +- 20 files changed, 872 insertions(+), 413 deletions(-) create mode 100644 mojo/public/cpp/bindings/lib/wtf_array_serialization.h create mode 100644 mojo/public/cpp/bindings/tests/array_common_test.h create mode 100644 mojo/public/cpp/bindings/tests/wtf_array_unittest.cc create mode 100644 mojo/public/cpp/bindings/wtf_array.h (limited to 'mojo') diff --git a/mojo/mojo_edk_tests.gyp b/mojo/mojo_edk_tests.gyp index 539a161..01d01c4 100644 --- a/mojo/mojo_edk_tests.gyp +++ b/mojo/mojo_edk_tests.gyp @@ -57,6 +57,7 @@ 'mojo_public.gyp:mojo_public_test_utils', ], 'sources': [ + 'public/cpp/bindings/tests/array_common_test.h', 'public/cpp/bindings/tests/array_unittest.cc', 'public/cpp/bindings/tests/associated_interface_unittest.cc', 'public/cpp/bindings/tests/binding_callback_unittest.cc', @@ -67,6 +68,7 @@ 'public/cpp/bindings/tests/connector_unittest.cc', 'public/cpp/bindings/tests/constant_unittest.cc', 'public/cpp/bindings/tests/container_test_util.cc', + 'public/cpp/bindings/tests/container_test_util.h', 'public/cpp/bindings/tests/equals_unittest.cc', 'public/cpp/bindings/tests/handle_passing_unittest.cc', 'public/cpp/bindings/tests/interface_ptr_unittest.cc', @@ -98,6 +100,7 @@ 'public/cpp/bindings/tests/type_conversion_unittest.cc', 'public/cpp/bindings/tests/union_unittest.cc', 'public/cpp/bindings/tests/validation_unittest.cc', + 'public/cpp/bindings/tests/variant_test_util.h', ], }, { @@ -107,10 +110,16 @@ 'dependencies': [ '../testing/gtest.gyp:gtest', 'mojo_public.gyp:mojo_cpp_bindings', + 'mojo_public.gyp:mojo_public_test_interfaces', 'mojo_public.gyp:mojo_public_test_wtf_types', 'mojo_public.gyp:mojo_public_test_wtf_types_blink', ], 'sources': [ + 'public/cpp/bindings/tests/array_common_test.h', + 'public/cpp/bindings/tests/container_test_util.cc', + 'public/cpp/bindings/tests/container_test_util.h', + 'public/cpp/bindings/tests/variant_test_util.h', + 'public/cpp/bindings/tests/wtf_array_unittest.cc', 'public/cpp/bindings/tests/wtf_types_unittest.cc', ], }, diff --git a/mojo/mojo_public.gyp b/mojo/mojo_public.gyp index da318ae..bb12a5b 100644 --- a/mojo/mojo_public.gyp +++ b/mojo/mojo_public.gyp @@ -204,9 +204,11 @@ '..' ], 'sources': [ + 'public/cpp/bindings/lib/wtf_array_serialization.h', 'public/cpp/bindings/lib/wtf_serialization.h', 'public/cpp/bindings/lib/wtf_string_serialization.cc', 'public/cpp/bindings/lib/wtf_string_serialization.h', + 'public/cpp/bindings/wtf_array.h', ], 'dependencies': [ 'mojo_cpp_bindings', diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn index 1939ff6..b817de7 100644 --- a/mojo/public/cpp/bindings/BUILD.gn +++ b/mojo/public/cpp/bindings/BUILD.gn @@ -127,9 +127,11 @@ source_set("callback") { source_set("wtf_support") { sources = [ + "lib/wtf_array_serialization.h", "lib/wtf_serialization.h", "lib/wtf_string_serialization.cc", "lib/wtf_string_serialization.h", + "wtf_array.h", ] public_deps = [ diff --git a/mojo/public/cpp/bindings/array.h b/mojo/public/cpp/bindings/array.h index 575ba77..f522faa 100644 --- a/mojo/public/cpp/bindings/array.h +++ b/mojo/public/cpp/bindings/array.h @@ -13,6 +13,7 @@ #include #include +#include "base/move.h" #include "mojo/public/cpp/bindings/lib/array_internal.h" #include "mojo/public/cpp/bindings/lib/bindings_internal.h" #include "mojo/public/cpp/bindings/lib/template_util.h" @@ -221,7 +222,7 @@ class Array { struct CloneTraits { static inline void Clone(const std::vector& src_vec, std::vector* dest_vec) { - dest_vec->clear(); + DCHECK(dest_vec->empty()); dest_vec->reserve(src_vec.size()); for (const auto& element : src_vec) dest_vec->push_back(element.Clone()); diff --git a/mojo/public/cpp/bindings/lib/array_serialization_traits.h b/mojo/public/cpp/bindings/lib/array_serialization_traits.h index 35b12f1..5e0e5af 100644 --- a/mojo/public/cpp/bindings/lib/array_serialization_traits.h +++ b/mojo/public/cpp/bindings/lib/array_serialization_traits.h @@ -194,7 +194,8 @@ struct ArraySerializer< private: template ::value, + bool is_array = IsSpecializationOf::value || + IsSpecializationOf::value, bool is_string = std::is_same::value || std::is_same::value> struct SerializeCaller { diff --git a/mojo/public/cpp/bindings/lib/connector.cc b/mojo/public/cpp/bindings/lib/connector.cc index 065c176..55263a9 100644 --- a/mojo/public/cpp/bindings/lib/connector.cc +++ b/mojo/public/cpp/bindings/lib/connector.cc @@ -287,8 +287,8 @@ void Connector::WaitToReadMore() { // If the watch failed because the handle is invalid or its conditions can // no longer be met, we signal the error asynchronously to avoid reentry. base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, base::Bind(&Connector::OnWatcherHandleReady, - weak_self_, rv)); + FROM_HERE, + base::Bind(&Connector::OnWatcherHandleReady, weak_self_, rv)); } if (register_sync_handle_watch_count_ > 0 && diff --git a/mojo/public/cpp/bindings/lib/serialization_forward.h b/mojo/public/cpp/bindings/lib/serialization_forward.h index 39d046c..b605049 100644 --- a/mojo/public/cpp/bindings/lib/serialization_forward.h +++ b/mojo/public/cpp/bindings/lib/serialization_forward.h @@ -23,6 +23,9 @@ class Array; template class Map; +template +class WTFArray; + namespace internal { template @@ -80,6 +83,26 @@ inline bool Deserialize_(internal::Array_Data* input, internal::SerializationContext* context); // ----------------------------------------------------------------------------- +// Forward declaration for WTFArray. + +template +inline size_t GetSerializedSize_(const WTFArray& input, + internal::SerializationContext* context); + +template +inline void SerializeArray_( + WTFArray input, + internal::Buffer* buf, + internal::Array_Data** output, + const internal::ArrayValidateParams* validate_params, + internal::SerializationContext* context); + +template +inline bool Deserialize_(internal::Array_Data* input, + WTFArray* output, + internal::SerializationContext* context); + +// ----------------------------------------------------------------------------- // Forward declaration for Map. template diff --git a/mojo/public/cpp/bindings/lib/value_traits.h b/mojo/public/cpp/bindings/lib/value_traits.h index d3b295b..56bdf3a 100644 --- a/mojo/public/cpp/bindings/lib/value_traits.h +++ b/mojo/public/cpp/bindings/lib/value_traits.h @@ -36,6 +36,9 @@ class ScopedHandleBase; template class StructPtr; +template +class WTFArray; + namespace internal { template @@ -47,6 +50,7 @@ template struct ValueTraits< T, typename EnableIf::value || + IsSpecializationOf::value || IsSpecializationOf::value || IsSpecializationOf::value || IsSpecializationOf::value>::type> { diff --git a/mojo/public/cpp/bindings/lib/wtf_array_serialization.h b/mojo/public/cpp/bindings/lib/wtf_array_serialization.h new file mode 100644 index 0000000..70edbf1 --- /dev/null +++ b/mojo/public/cpp/bindings/lib/wtf_array_serialization.h @@ -0,0 +1,43 @@ +// 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. + +#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_ARRAY_SERIALIZATION_H_ +#define MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_ARRAY_SERIALIZATION_H_ + +#include + +#include "mojo/public/cpp/bindings/lib/array_serialization_traits.h" +#include "mojo/public/cpp/bindings/wtf_array.h" + +namespace mojo { + +template +inline size_t GetSerializedSize_(const WTFArray& input, + internal::SerializationContext* context) { + return internal::ArraySerializationImpl>::GetSerializedSize( + input, context); +} + +template +inline void SerializeArray_( + WTFArray input, + internal::Buffer* buf, + internal::Array_Data** output, + const internal::ArrayValidateParams* validate_params, + internal::SerializationContext* context) { + return internal::ArraySerializationImpl>::template Serialize( + std::move(input), buf, output, validate_params, context); +} + +template +inline bool Deserialize_(internal::Array_Data* input, + WTFArray* output, + internal::SerializationContext* context) { + return internal::ArraySerializationImpl>::template Deserialize( + input, output, context); +} + +} // namespace mojo + +#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_ARRAY_SERIALIZATION_H_ diff --git a/mojo/public/cpp/bindings/lib/wtf_serialization.h b/mojo/public/cpp/bindings/lib/wtf_serialization.h index 11733ec..318d152 100644 --- a/mojo/public/cpp/bindings/lib/wtf_serialization.h +++ b/mojo/public/cpp/bindings/lib/wtf_serialization.h @@ -5,6 +5,7 @@ #ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_ #define MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_ +#include "mojo/public/cpp/bindings/lib/wtf_array_serialization.h" #include "mojo/public/cpp/bindings/lib/wtf_string_serialization.h" #endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_WTF_SERIALIZATION_H_ diff --git a/mojo/public/cpp/bindings/tests/BUILD.gn b/mojo/public/cpp/bindings/tests/BUILD.gn index 7bbd0bd..043ed74 100644 --- a/mojo/public/cpp/bindings/tests/BUILD.gn +++ b/mojo/public/cpp/bindings/tests/BUILD.gn @@ -8,6 +8,7 @@ source_set("tests") { testonly = true sources = [ + "array_common_test.h", "array_unittest.cc", "associated_interface_unittest.cc", "binding_callback_unittest.cc", @@ -18,6 +19,7 @@ source_set("tests") { "connector_unittest.cc", "constant_unittest.cc", "container_test_util.cc", + "container_test_util.h", "equals_unittest.cc", "handle_passing_unittest.cc", "interface_ptr_unittest.cc", @@ -49,6 +51,7 @@ source_set("tests") { "type_conversion_unittest.cc", "union_unittest.cc", "validation_unittest.cc", + "variant_test_util.h", ] deps = [ @@ -72,6 +75,11 @@ source_set("for_blink_tests") { testonly = true sources = [ + "array_common_test.h", + "container_test_util.cc", + "container_test_util.h", + "variant_test_util.h", + "wtf_array_unittest.cc", "wtf_types_unittest.cc", ] @@ -79,6 +87,7 @@ source_set("for_blink_tests") { "//mojo/public/cpp/bindings", "//mojo/public/cpp/bindings:callback", "//mojo/public/cpp/system", + "//mojo/public/interfaces/bindings/tests:test_interfaces", "//mojo/public/interfaces/bindings/tests:test_wtf_types", "//mojo/public/interfaces/bindings/tests:test_wtf_types_blink", "//testing/gtest", diff --git a/mojo/public/cpp/bindings/tests/array_common_test.h b/mojo/public/cpp/bindings/tests/array_common_test.h new file mode 100644 index 0000000..19c0f6f --- /dev/null +++ b/mojo/public/cpp/bindings/tests/array_common_test.h @@ -0,0 +1,392 @@ +// 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 +#include +#include + +#include "mojo/public/cpp/bindings/lib/array_internal.h" +#include "mojo/public/cpp/bindings/lib/fixed_buffer.h" +#include "mojo/public/cpp/bindings/lib/serialization.h" +#include "mojo/public/cpp/bindings/tests/container_test_util.h" +#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace mojo { +namespace test { + +// Common tests for both mojo::Array and mojo::WTFArray. +template