summaryrefslogtreecommitdiffstats
path: root/third_party
diff options
context:
space:
mode:
authorrockot <rockot@chromium.org>2015-05-13 19:07:14 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-14 02:07:24 +0000
commitd24477996ef10584ced040a13f82e7c7dc0216b1 (patch)
tree909956d053475acad41999ee93e75241468ef90c /third_party
parent32bef8c15d2a2055cf7cee0b186c3350a97d7c91 (diff)
downloadchromium_src-d24477996ef10584ced040a13f82e7c7dc0216b1.zip
chromium_src-d24477996ef10584ced040a13f82e7c7dc0216b1.tar.gz
chromium_src-d24477996ef10584ced040a13f82e7c7dc0216b1.tar.bz2
Update mojo sdk to rev f84766d3b6420b7cf6a113d9d65d73cb5fe18d90
Noteworthy in this roll is that InterfacePtrs may no longer be bound-to or passed-as simple pipe handles, but instead as InterfacePtrInfos. This requires updating several call sites of InterfacePtr's Bind and PassMessagePipe. BUG= TBR=ben@chromium.org Review URL: https://codereview.chromium.org/1127293003 Cr-Commit-Position: refs/heads/master@{#329783}
Diffstat (limited to 'third_party')
-rw-r--r--third_party/mojo/mojo_public.gyp57
-rw-r--r--third_party/mojo/mojom_bindings_generator.gypi3
-rw-r--r--third_party/mojo/mojom_bindings_generator_explicit.gypi9
-rw-r--r--third_party/mojo/src/mojo/public/VERSION2
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/BUILD.gn8
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/application_connection.h25
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/application_impl.h1
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/connect.h2
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/application_impl.cc2
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/application_test_base.cc2
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/interface_factory_connector.h37
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/service_connector.cc18
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/service_connector.h55
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/service_connector_registry.cc59
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/service_connector_registry.h62
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/service_provider_impl.cc36
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.cc51
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.h17
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/service_connector.h30
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/service_provider_impl.h25
-rw-r--r--third_party/mojo/src/mojo/public/cpp/application/tests/service_registry_unittest.cc31
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/BUILD.gn5
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h3
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/interface_ptr.h52
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h2
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_internal.h7
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.cc8
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.h4
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/connector.cc5
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.cc82
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.h42
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.cc104
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.h38
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/interface_ptr_internal.h28
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/map_data_internal.h8
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/map_serialization.h2
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/message_builder.cc8
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/message_header_validator.cc12
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.cc23
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.h5
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/message.h2
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/tests/BUILD.gn52
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/tests/constant_unittest.cc42
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc73
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc227
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/tests/validation_unittest.cc4
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/tests/versioning_apptest.cc121
-rw-r--r--third_party/mojo/src/mojo/public/cpp/bindings/tests/versioning_test_service.cc125
-rw-r--r--third_party/mojo/src/mojo/public/cpp/environment/logging.h2
-rw-r--r--third_party/mojo/src/mojo/public/cpp/system/macros.h23
-rw-r--r--third_party/mojo/src/mojo/public/dart/src/codec.dart4
-rw-r--r--third_party/mojo/src/mojo/public/dart/src/message.dart8
-rw-r--r--third_party/mojo/src/mojo/public/go/application/application_impl.go13
-rw-r--r--third_party/mojo/src/mojo/public/go/application/connection.go6
-rw-r--r--third_party/mojo/src/mojo/public/go/bindings/connector.go27
-rw-r--r--third_party/mojo/src/mojo/public/go/bindings/decoder.go2
-rw-r--r--third_party/mojo/src/mojo/public/go/bindings/encoder.go2
-rw-r--r--third_party/mojo/src/mojo/public/go/bindings/message.go20
-rw-r--r--third_party/mojo/src/mojo/public/go/bindings/router.go11
-rw-r--r--third_party/mojo/src/mojo/public/go/bindings/util.go3
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/interface_control_messages.mojom1
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/BUILD.gn15
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data4
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data4
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data4
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data4
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data4
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data4
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data4
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data4
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data4
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data2
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/sample_service.mojom10
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_constants.mojom53
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_structs.mojom14
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_unions.mojom14
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom34
-rw-r--r--third_party/mojo/src/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom38
-rw-r--r--third_party/mojo/src/mojo/public/java/BUILD.gn3
-rw-r--r--third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationDelegate.java4
-rw-r--r--third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationImpl.java3
-rw-r--r--third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java2
-rw-r--r--third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java18
-rw-r--r--third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java8
-rw-r--r--third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java5
-rw-r--r--third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java92
-rw-r--r--third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java89
-rw-r--r--third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java4
-rw-r--r--third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java73
-rw-r--r--third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java21
-rw-r--r--third_party/mojo/src/mojo/public/js/codec.js14
-rw-r--r--third_party/mojo/src/mojo/public/js/codec_unittests.js6
-rw-r--r--third_party/mojo/src/mojo/public/js/struct_unittests.js23
-rw-r--r--third_party/mojo/src/mojo/public/js/validator.js12
-rw-r--r--third_party/mojo/src/mojo/public/python/BUILD.gn35
-rw-r--r--third_party/mojo/src/mojo/public/python/mojo_bindings/descriptor.py19
-rw-r--r--third_party/mojo/src/mojo/public/python/mojo_bindings/interface_reflection.py466
-rw-r--r--third_party/mojo/src/mojo/public/python/mojo_bindings/messaging.py22
-rw-r--r--third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py360
-rw-r--r--third_party/mojo/src/mojo/public/tools/BUILD.gn4
-rw-r--r--third_party/mojo/src/mojo/public/tools/NETWORK_SERVICE_VERSION2
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl18
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl38
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl7
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl1
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl13
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl64
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl17
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl2
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl8
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl16
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl33
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl23
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl14
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl2
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl10
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/struct.tmpl2
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl18
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/struct_definition.tmpl16
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_cpp_generator.py36
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_dart_generator.py1
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_go_generator.py2
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_java_generator.py3
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/generators/python_templates/module.py.tmpl6
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/mojom.gni46
-rw-r--r--third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/generate/module.py41
-rwxr-xr-xthird_party/mojo/src/mojo/public/tools/gn/unzip.py46
200 files changed, 2880 insertions, 988 deletions
diff --git a/third_party/mojo/mojo_public.gyp b/third_party/mojo/mojo_public.gyp
index 673e1c4..08a3410 100644
--- a/third_party/mojo/mojo_public.gyp
+++ b/third_party/mojo/mojo_public.gyp
@@ -100,6 +100,10 @@
'src/mojo/public/cpp/bindings/lib/callback_internal.h',
'src/mojo/public/cpp/bindings/lib/connector.cc',
'src/mojo/public/cpp/bindings/lib/connector.h',
+ 'src/mojo/public/cpp/bindings/lib/control_message_handler.cc',
+ 'src/mojo/public/cpp/bindings/lib/control_message_handler.h',
+ 'src/mojo/public/cpp/bindings/lib/control_message_proxy.cc',
+ 'src/mojo/public/cpp/bindings/lib/control_message_proxy.h',
'src/mojo/public/cpp/bindings/lib/filter_chain.cc',
'src/mojo/public/cpp/bindings/lib/filter_chain.h',
'src/mojo/public/cpp/bindings/lib/fixed_buffer.cc',
@@ -129,6 +133,11 @@
'src/mojo/public/cpp/bindings/lib/validation_errors.h',
'src/mojo/public/cpp/bindings/lib/validation_util.cc',
'src/mojo/public/cpp/bindings/lib/validation_util.h',
+ # This comes from the mojo_interface_bindings_cpp_sources dependency.
+ '>@(mojom_generated_sources)',
+ ],
+ 'dependencies': [
+ 'mojo_interface_bindings_cpp_sources',
],
},
{
@@ -239,11 +248,13 @@
'src/mojo/public/cpp/application/lib/application_connection.cc',
'src/mojo/public/cpp/application/lib/application_delegate.cc',
'src/mojo/public/cpp/application/lib/application_impl.cc',
+ 'src/mojo/public/cpp/application/lib/interface_factory_connector.h',
+ 'src/mojo/public/cpp/application/lib/service_connector_registry.cc',
+ 'src/mojo/public/cpp/application/lib/service_connector_registry.h',
'src/mojo/public/cpp/application/lib/service_provider_impl.cc',
- 'src/mojo/public/cpp/application/lib/service_connector.cc',
- 'src/mojo/public/cpp/application/lib/service_connector.h',
'src/mojo/public/cpp/application/lib/service_registry.cc',
'src/mojo/public/cpp/application/lib/service_registry.h',
+ 'src/mojo/public/cpp/application/service_connector.h',
'src/mojo/public/cpp/application/service_provider_impl.h',
],
'dependencies': [
@@ -254,7 +265,7 @@
],
},
{
- # GN version: //mojo/public/cpp/application:standalone"
+ # GN version: //mojo/public/cpp/application:standalone
'target_name': 'mojo_application_standalone',
'type': 'static_library',
'sources': [
@@ -270,6 +281,34 @@
],
},
{
+ 'target_name': 'mojo_interface_bindings_mojom',
+ 'type': 'none',
+ 'variables': {
+ 'require_interface_bindings': 0,
+ 'mojom_files': [
+ 'src/mojo/public/interfaces/bindings/interface_control_messages.mojom',
+ ],
+ },
+ 'includes': [ 'mojom_bindings_generator_explicit.gypi' ],
+ },
+ {
+ 'target_name': 'mojo_interface_bindings_cpp_sources',
+ 'type': 'none',
+ 'dependencies': [
+ 'mojo_interface_bindings_mojom',
+ ],
+ },
+ {
+ # This target can be used to introduce a dependency on interface bindings
+ # generation without introducing any side-effects in the dependent
+ # target's configuration.
+ 'target_name': 'mojo_interface_bindings_generation',
+ 'type': 'none',
+ 'dependencies': [
+ 'mojo_interface_bindings_cpp_sources',
+ ],
+ },
+ {
# GN version: //mojo/public/c/test_support
'target_name': 'mojo_test_support',
'defines': [
@@ -369,7 +408,7 @@
['OS == "android"', {
'targets': [
{
- # GN version: //mojo/public/java_system
+ # GN version: //mojo/public/java:system
'target_name': 'mojo_public_java',
'type': 'none',
'variables': {
@@ -378,13 +417,21 @@
'includes': [ '../../build/java.gypi' ],
},
{
- # GN version: //mojo/public/java_bindings
+ 'target_name': 'mojo_interface_bindings_java_sources',
+ 'type': 'none',
+ 'dependencies': [
+ 'mojo_interface_bindings_mojom',
+ ],
+ },
+ {
+ # GN version: //mojo/public/java:bindings
'target_name': 'mojo_bindings_java',
'type': 'none',
'variables': {
'java_in_dir': 'src/mojo/public/java/bindings',
},
'dependencies': [
+ 'mojo_interface_bindings_java_sources',
'mojo_public_java',
],
'includes': [ '../../build/java.gypi' ],
diff --git a/third_party/mojo/mojom_bindings_generator.gypi b/third_party/mojo/mojom_bindings_generator.gypi
index 948ce059..c9743ff 100644
--- a/third_party/mojo/mojom_bindings_generator.gypi
+++ b/third_party/mojo/mojom_bindings_generator.gypi
@@ -63,6 +63,9 @@
'process_outputs_as_sources': 1,
}
],
+ 'dependencies': [
+ '<(DEPTH)/third_party/mojo/mojo_public.gyp:mojo_interface_bindings_generation',
+ ],
'include_dirs': [
'<(DEPTH)',
'<(DEPTH)/third_party/mojo/src',
diff --git a/third_party/mojo/mojom_bindings_generator_explicit.gypi b/third_party/mojo/mojom_bindings_generator_explicit.gypi
index 3d2d80b..6f129b5 100644
--- a/third_party/mojo/mojom_bindings_generator_explicit.gypi
+++ b/third_party/mojo/mojom_bindings_generator_explicit.gypi
@@ -12,6 +12,7 @@
'mojom_generated_outputs': [
'<!@(python <(DEPTH)/third_party/mojo/src/mojo/public/tools/bindings/mojom_list_outputs.py --basedir <(mojom_base_output_dir) <@(mojom_files))',
],
+ 'require_interface_bindings%': 1,
},
# Given mojom files as inputs, generate sources. These sources will be
# exported to another target (via dependent_settings) to be compiled. This
@@ -65,6 +66,13 @@
'message': 'Generating Mojo bindings from <@(mojom_files)',
}
],
+ 'conditions': [
+ ['require_interface_bindings==1', {
+ 'dependencies': [
+ '<(DEPTH)/third_party/mojo/mojo_public.gyp:mojo_interface_bindings_generation',
+ ],
+ }],
+ ],
# Prevent the generated sources from being injected into the "all" target by
# preventing the code generator from being directly depended on by the "all"
# target.
@@ -102,6 +110,7 @@
'<@(mojom_bindings_generator_sources)',
'<@(mojom_files)',
],
+ 'mojom_generated_sources': [ '<@(mojom_generated_outputs)' ],
},
}
},
diff --git a/third_party/mojo/src/mojo/public/VERSION b/third_party/mojo/src/mojo/public/VERSION
index d6b3e50..c314df0 100644
--- a/third_party/mojo/src/mojo/public/VERSION
+++ b/third_party/mojo/src/mojo/public/VERSION
@@ -1 +1 @@
-e7270700d671fa8e458b4d8c9e47f7bcfb65da0b \ No newline at end of file
+f84766d3b6420b7cf6a113d9d65d73cb5fe18d90 \ No newline at end of file
diff --git a/third_party/mojo/src/mojo/public/cpp/application/BUILD.gn b/third_party/mojo/src/mojo/public/cpp/application/BUILD.gn
index 05708c7..c3a9fc9 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/BUILD.gn
+++ b/third_party/mojo/src/mojo/public/cpp/application/BUILD.gn
@@ -11,17 +11,19 @@ mojo_sdk_source_set("application") {
"application_delegate.h",
"application_impl.h",
"connect.h",
- "service_provider_impl.h",
"interface_factory.h",
"interface_factory_impl.h",
"lib/application_connection.cc",
"lib/application_delegate.cc",
"lib/application_impl.cc",
+ "lib/interface_factory_connector.h",
+ "lib/service_connector_registry.cc",
+ "lib/service_connector_registry.h",
"lib/service_provider_impl.cc",
- "lib/service_connector.cc",
- "lib/service_connector.h",
"lib/service_registry.cc",
"lib/service_registry.h",
+ "service_connector.h",
+ "service_provider_impl.h",
]
mojo_sdk_deps = [
diff --git a/third_party/mojo/src/mojo/public/cpp/application/application_connection.h b/third_party/mojo/src/mojo/public/cpp/application/application_connection.h
index 8406235..6673b7a 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/application_connection.h
+++ b/third_party/mojo/src/mojo/public/cpp/application/application_connection.h
@@ -7,11 +7,13 @@
#include <string>
-#include "mojo/public/cpp/application/lib/service_connector.h"
+#include "mojo/public/cpp/application/lib/interface_factory_connector.h"
#include "mojo/public/interfaces/application/service_provider.mojom.h"
namespace mojo {
+class ServiceConnector;
+
// Represents a connection to another application. An instance of this class is
// passed to ApplicationDelegate's ConfigureIncomingConnection() method each
// time a connection is made to this app, and to ApplicationDelegate's
@@ -31,16 +33,27 @@ namespace mojo {
// connection->AddService<Bar>(&my_foo_and_bar_factory_);
//
// The InterfaceFactory must outlive the ApplicationConnection.
+//
+// Additionally you specify a ServiceConnector. If a ServiceConnector has
+// been set and an InterfaceFactory has not been registered for the interface
+// request, than the interface request is sent to the ServiceConnector.
+//
+// Just as with InterfaceFactory, ServiceConnector must outlive
+// ApplicationConnection.
class ApplicationConnection {
public:
virtual ~ApplicationConnection();
+ // See class description for details.
+ virtual void SetServiceConnector(ServiceConnector* connector) = 0;
+
// Makes Interface available as a service to the remote application.
// |factory| will create implementations of Interface on demand.
template <typename Interface>
void AddService(InterfaceFactory<Interface>* factory) {
- AddServiceConnector(
- new internal::InterfaceFactoryConnector<Interface>(factory));
+ SetServiceConnectorForName(
+ new internal::InterfaceFactoryConnector<Interface>(factory),
+ Interface::Name_);
}
// Binds |ptr| to an implemention of Interface in the remote application.
@@ -50,7 +63,7 @@ class ApplicationConnection {
void ConnectToService(InterfacePtr<Interface>* ptr) {
if (ServiceProvider* sp = GetServiceProvider()) {
MessagePipe pipe;
- ptr->Bind(pipe.handle0.Pass());
+ ptr->Bind(InterfacePtrInfo<Interface>(pipe.handle0.Pass(), 0u));
sp->ConnectToService(Interface::Name_, pipe.handle1.Pass());
}
}
@@ -76,8 +89,8 @@ class ApplicationConnection {
virtual ServiceProvider* GetServiceProvider() = 0;
private:
- virtual void AddServiceConnector(
- internal::ServiceConnectorBase* service_connector) = 0;
+ virtual void SetServiceConnectorForName(ServiceConnector* service_connector,
+ const std::string& name) = 0;
};
} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/application/application_impl.h b/third_party/mojo/src/mojo/public/cpp/application/application_impl.h
index 2822008..294cfff 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/application_impl.h
+++ b/third_party/mojo/src/mojo/public/cpp/application/application_impl.h
@@ -8,7 +8,6 @@
#include "mojo/public/cpp/application/application_connection.h"
#include "mojo/public/cpp/application/application_delegate.h"
-#include "mojo/public/cpp/application/lib/service_connector.h"
#include "mojo/public/cpp/application/lib/service_registry.h"
#include "mojo/public/cpp/system/core.h"
#include "mojo/public/interfaces/application/application.mojom.h"
diff --git a/third_party/mojo/src/mojo/public/cpp/application/connect.h b/third_party/mojo/src/mojo/public/cpp/application/connect.h
index 79762e2..e427ce6 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/connect.h
+++ b/third_party/mojo/src/mojo/public/cpp/application/connect.h
@@ -14,7 +14,7 @@ template <typename Interface>
inline void ConnectToService(ServiceProvider* service_provider,
InterfacePtr<Interface>* ptr) {
MessagePipe pipe;
- ptr->Bind(pipe.handle0.Pass());
+ ptr->Bind(InterfacePtrInfo<Interface>(pipe.handle0.Pass(), 0u));
service_provider->ConnectToService(Interface::Name_, pipe.handle1.Pass());
}
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/application_impl.cc b/third_party/mojo/src/mojo/public/cpp/application/lib/application_impl.cc
index 17678ce..731c562 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/lib/application_impl.cc
+++ b/third_party/mojo/src/mojo/public/cpp/application/lib/application_impl.cc
@@ -92,7 +92,7 @@ void ApplicationImpl::UnbindConnections(
InterfaceRequest<Application>* application_request,
ShellPtr* shell) {
*application_request = binding_.Unbind();
- shell->Bind(shell_.PassMessagePipe());
+ shell->Bind(shell_.PassInterface());
}
void ApplicationImpl::AcceptConnection(
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/application_test_base.cc b/third_party/mojo/src/mojo/public/cpp/application/lib/application_test_base.cc
index af6e13a2..c4ec87a 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/lib/application_test_base.cc
+++ b/third_party/mojo/src/mojo/public/cpp/application/lib/application_test_base.cc
@@ -115,7 +115,7 @@ MojoResult RunAllTests(MojoHandle application_request_handle) {
// Shut down our message pipes before exiting.
(void)g_application_request.PassMessagePipe();
- (void)g_shell.PassMessagePipe();
+ (void)g_shell.PassInterface();
return (result == 0) ? MOJO_RESULT_OK : MOJO_RESULT_UNKNOWN;
}
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/interface_factory_connector.h b/third_party/mojo/src/mojo/public/cpp/application/lib/interface_factory_connector.h
new file mode 100644
index 0000000..9b8f4ba
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/application/lib/interface_factory_connector.h
@@ -0,0 +1,37 @@
+// Copyright 2014 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_APPLICATION_LIB_INTERFACE_FACTORY_CONNECTOR_H_
+#define MOJO_PUBLIC_CPP_APPLICATION_LIB_INTERFACE_FACTORY_CONNECTOR_H_
+
+#include "mojo/public/cpp/application/interface_factory.h"
+#include "mojo/public/cpp/application/service_connector.h"
+#include "mojo/public/cpp/bindings/interface_request.h"
+
+namespace mojo {
+namespace internal {
+
+template <typename Interface>
+class InterfaceFactoryConnector : public ServiceConnector {
+ public:
+ explicit InterfaceFactoryConnector(InterfaceFactory<Interface>* factory)
+ : factory_(factory) {}
+ ~InterfaceFactoryConnector() override {}
+
+ void ConnectToService(ApplicationConnection* application_connection,
+ const std::string& interface_name,
+ ScopedMessagePipeHandle client_handle) override {
+ factory_->Create(application_connection,
+ MakeRequest<Interface>(client_handle.Pass()));
+ }
+
+ private:
+ InterfaceFactory<Interface>* factory_;
+ MOJO_DISALLOW_COPY_AND_ASSIGN(InterfaceFactoryConnector);
+};
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_CPP_APPLICATION_LIB_INTERFACE_FACTORY_CONNECTOR_H_
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector.cc b/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector.cc
deleted file mode 100644
index ada5d9c..0000000
--- a/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2014 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/application/lib/service_connector.h"
-
-namespace mojo {
-namespace internal {
-
-ServiceConnectorBase::ServiceConnectorBase(const std::string& name)
- : name_(name), application_connection_(nullptr) {
-}
-
-ServiceConnectorBase::~ServiceConnectorBase() {
-}
-
-} // namespace internal
-} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector.h b/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector.h
deleted file mode 100644
index 70c1380..0000000
--- a/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 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_APPLICATION_LIB_SERVICE_CONNECTOR_H_
-#define MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_H_
-
-#include "mojo/public/cpp/application/interface_factory.h"
-#include "mojo/public/cpp/bindings/interface_request.h"
-
-namespace mojo {
-class ApplicationConnection;
-
-namespace internal {
-
-class ServiceConnectorBase {
- public:
- ServiceConnectorBase(const std::string& name);
- virtual ~ServiceConnectorBase();
- virtual void ConnectToService(const std::string& name,
- ScopedMessagePipeHandle client_handle) = 0;
- std::string name() const { return name_; }
- void set_application_connection(ApplicationConnection* connection) {
- application_connection_ = connection;
- }
-
- protected:
- std::string name_;
- ApplicationConnection* application_connection_;
-
- MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnectorBase);
-};
-
-template <typename Interface>
-class InterfaceFactoryConnector : public ServiceConnectorBase {
- public:
- explicit InterfaceFactoryConnector(InterfaceFactory<Interface>* factory)
- : ServiceConnectorBase(Interface::Name_), factory_(factory) {}
- virtual ~InterfaceFactoryConnector() {}
-
- virtual void ConnectToService(const std::string& name,
- ScopedMessagePipeHandle client_handle) {
- factory_->Create(application_connection_,
- MakeRequest<Interface>(client_handle.Pass()));
- }
-
- private:
- InterfaceFactory<Interface>* factory_;
- MOJO_DISALLOW_COPY_AND_ASSIGN(InterfaceFactoryConnector);
-};
-
-} // namespace internal
-} // namespace mojo
-
-#endif // MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_H_
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector_registry.cc b/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector_registry.cc
new file mode 100644
index 0000000..7c216cd
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector_registry.cc
@@ -0,0 +1,59 @@
+// Copyright 2015 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/application/lib/service_connector_registry.h"
+
+#include "mojo/public/cpp/application/service_connector.h"
+
+namespace mojo {
+namespace internal {
+
+ServiceConnectorRegistry::ServiceConnectorRegistry()
+ : service_connector_(nullptr) {
+}
+
+ServiceConnectorRegistry::~ServiceConnectorRegistry() {
+ for (NameToServiceConnectorMap::iterator i =
+ name_to_service_connector_.begin();
+ i != name_to_service_connector_.end(); ++i) {
+ delete i->second;
+ }
+ name_to_service_connector_.clear();
+}
+
+void ServiceConnectorRegistry::SetServiceConnectorForName(
+ ServiceConnector* service_connector,
+ const std::string& interface_name) {
+ RemoveServiceConnectorForName(interface_name);
+ name_to_service_connector_[interface_name] = service_connector;
+}
+
+void ServiceConnectorRegistry::RemoveServiceConnectorForName(
+ const std::string& interface_name) {
+ NameToServiceConnectorMap::iterator it =
+ name_to_service_connector_.find(interface_name);
+ if (it == name_to_service_connector_.end())
+ return;
+ delete it->second;
+ name_to_service_connector_.erase(it);
+}
+
+void ServiceConnectorRegistry::ConnectToService(
+ ApplicationConnection* application_connection,
+ const std::string& interface_name,
+ ScopedMessagePipeHandle client_handle) {
+ auto iter = name_to_service_connector_.find(interface_name);
+ if (iter != name_to_service_connector_.end()) {
+ iter->second->ConnectToService(application_connection, interface_name,
+ client_handle.Pass());
+ return;
+ }
+ if (service_connector_) {
+ service_connector_->ConnectToService(application_connection, interface_name,
+ client_handle.Pass());
+ }
+}
+
+} // namespace internal
+} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector_registry.h b/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector_registry.h
new file mode 100644
index 0000000..cc09aca
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/application/lib/service_connector_registry.h
@@ -0,0 +1,62 @@
+// Copyright 2015 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_APPLICATION_LIB_SERVICE_CONNECTOR_REGISTRY_H_
+#define MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_REGISTRY_H_
+
+#include <map>
+#include <string>
+
+#include "mojo/public/cpp/system/message_pipe.h"
+
+namespace mojo {
+
+class ApplicationConnection;
+class ServiceConnector;
+
+namespace internal {
+
+// ServiceConnectorRegistry maintains a default ServiceConnector as well as at
+// most one ServiceConnector per interface name. When ConnectToService() is
+// invoked the ServiceConnector registered by name is given the request. If
+// a ServiceConnector has not been registered by name than the default
+// ServiceConnector is given the request.
+class ServiceConnectorRegistry {
+ public:
+ ServiceConnectorRegistry();
+ ~ServiceConnectorRegistry();
+
+ // Sets the default ServiceConnector. ServiceConnectorRegistry does *not*
+ // take ownership of |service_connector|.
+ void set_service_connector(ServiceConnector* service_connector) {
+ service_connector_ = service_connector;
+ }
+
+ // Returns true if non ServiceConnectors have been registered by name.
+ bool empty() const { return name_to_service_connector_.empty(); }
+
+ // Sets a ServiceConnector by name. This deletes the existing ServiceConnector
+ // and takes ownership of |service_connector|.
+ void SetServiceConnectorForName(ServiceConnector* service_connector,
+ const std::string& interface_name);
+ void RemoveServiceConnectorForName(const std::string& interface_name);
+
+ void ConnectToService(ApplicationConnection* application_connection,
+ const std::string& interface_name,
+ ScopedMessagePipeHandle client_handle);
+
+ private:
+ using NameToServiceConnectorMap = std::map<std::string, ServiceConnector*>;
+
+ ServiceConnector* service_connector_;
+
+ NameToServiceConnectorMap name_to_service_connector_;
+
+ MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnectorRegistry);
+};
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_CONNECTOR_REGISTRY_H_
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/service_provider_impl.cc b/third_party/mojo/src/mojo/public/cpp/application/lib/service_provider_impl.cc
index 693169a..39191cd 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/lib/service_provider_impl.cc
+++ b/third_party/mojo/src/mojo/public/cpp/application/lib/service_provider_impl.cc
@@ -4,7 +4,7 @@
#include "mojo/public/cpp/application/service_provider_impl.h"
-#include "mojo/public/cpp/application/lib/service_connector.h"
+#include "mojo/public/cpp/application/service_connector.h"
#include "mojo/public/cpp/environment/logging.h"
namespace mojo {
@@ -32,33 +32,17 @@ void ServiceProviderImpl::Close() {
void ServiceProviderImpl::ConnectToService(
const String& service_name,
ScopedMessagePipeHandle client_handle) {
- if (service_connectors_.find(service_name) == service_connectors_.end()) {
- client_handle.reset();
- return;
- }
-
- internal::ServiceConnectorBase* service_connector =
- service_connectors_[service_name];
- return service_connector->ConnectToService(service_name,
- client_handle.Pass());
-}
-
-void ServiceProviderImpl::AddServiceConnector(
- internal::ServiceConnectorBase* service_connector) {
- RemoveServiceConnector(service_connector);
- service_connectors_[service_connector->name()] = service_connector;
- // TODO(beng): perhaps take app connection thru ctor??
- service_connector->set_application_connection(nullptr);
+ // TODO(beng): perhaps take app connection thru ctor so that we can pass
+ // ApplicationConnection through?
+ service_connector_registry_.ConnectToService(nullptr, service_name,
+ client_handle.Pass());
}
-void ServiceProviderImpl::RemoveServiceConnector(
- internal::ServiceConnectorBase* service_connector) {
- NameToServiceConnectorMap::iterator it =
- service_connectors_.find(service_connector->name());
- if (it == service_connectors_.end())
- return;
- delete it->second;
- service_connectors_.erase(it);
+void ServiceProviderImpl::SetServiceConnectorForName(
+ ServiceConnector* service_connector,
+ const std::string& interface_name) {
+ service_connector_registry_.SetServiceConnectorForName(service_connector,
+ interface_name);
}
} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.cc b/third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.cc
index 337d8e0..17238bb 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.cc
+++ b/third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.cc
@@ -6,7 +6,7 @@
#include "mojo/public/cpp/application/application_connection.h"
#include "mojo/public/cpp/application/application_impl.h"
-#include "mojo/public/cpp/application/lib/service_connector.h"
+#include "mojo/public/cpp/application/service_connector.h"
namespace mojo {
namespace internal {
@@ -31,38 +31,24 @@ ServiceRegistry::ServiceRegistry()
}
ServiceRegistry::~ServiceRegistry() {
- for (NameToServiceConnectorMap::iterator i =
- name_to_service_connector_.begin();
- i != name_to_service_connector_.end();
- ++i) {
- delete i->second;
- }
- name_to_service_connector_.clear();
}
-void ServiceRegistry::AddServiceConnector(
- ServiceConnectorBase* service_connector) {
- RemoveServiceConnectorInternal(service_connector);
- name_to_service_connector_[service_connector->name()] = service_connector;
- service_connector->set_application_connection(this);
+void ServiceRegistry::SetServiceConnector(ServiceConnector* connector) {
+ service_connector_registry_.set_service_connector(connector);
}
-void ServiceRegistry::RemoveServiceConnector(
- ServiceConnectorBase* service_connector) {
- RemoveServiceConnectorInternal(service_connector);
- if (name_to_service_connector_.empty())
- remote_service_provider_.reset();
+void ServiceRegistry::SetServiceConnectorForName(
+ ServiceConnector* service_connector,
+ const std::string& interface_name) {
+ service_connector_registry_.SetServiceConnectorForName(service_connector,
+ interface_name);
}
-bool ServiceRegistry::RemoveServiceConnectorInternal(
- ServiceConnectorBase* service_connector) {
- NameToServiceConnectorMap::iterator it =
- name_to_service_connector_.find(service_connector->name());
- if (it == name_to_service_connector_.end())
- return false;
- delete it->second;
- name_to_service_connector_.erase(it);
- return true;
+void ServiceRegistry::RemoveServiceConnectorForName(
+ const std::string& interface_name) {
+ service_connector_registry_.RemoveServiceConnectorForName(interface_name);
+ if (service_connector_registry_.empty())
+ remote_service_provider_.reset();
}
const std::string& ServiceRegistry::GetConnectionURL() {
@@ -79,15 +65,8 @@ ServiceProvider* ServiceRegistry::GetServiceProvider() {
void ServiceRegistry::ConnectToService(const mojo::String& service_name,
ScopedMessagePipeHandle client_handle) {
- if (name_to_service_connector_.find(service_name) ==
- name_to_service_connector_.end()) {
- client_handle.reset();
- return;
- }
- internal::ServiceConnectorBase* service_connector =
- name_to_service_connector_[service_name];
- return service_connector->ConnectToService(service_name,
- client_handle.Pass());
+ service_connector_registry_.ConnectToService(this, service_name,
+ client_handle.Pass());
}
} // namespace internal
diff --git a/third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.h b/third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.h
index 6126c104..b303911 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.h
+++ b/third_party/mojo/src/mojo/public/cpp/application/lib/service_registry.h
@@ -5,7 +5,10 @@
#ifndef MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_REGISTRY_H_
#define MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_REGISTRY_H_
+#include <string>
+
#include "mojo/public/cpp/application/application_connection.h"
+#include "mojo/public/cpp/application/lib/service_connector_registry.h"
#include "mojo/public/interfaces/application/service_provider.mojom.h"
namespace mojo {
@@ -15,8 +18,6 @@ class ApplicationImpl;
namespace internal {
-class ServiceConnectorBase;
-
// A ServiceRegistry represents each half of a connection between two
// applications, allowing customization of which services are published to the
// other.
@@ -31,12 +32,14 @@ class ServiceRegistry : public ServiceProvider, public ApplicationConnection {
~ServiceRegistry() override;
// ApplicationConnection overrides.
- void AddServiceConnector(ServiceConnectorBase* service_connector) override;
+ void SetServiceConnector(ServiceConnector* service_connector) override;
+ void SetServiceConnectorForName(ServiceConnector* service_connector,
+ const std::string& interface_name) override;
const std::string& GetConnectionURL() override;
const std::string& GetRemoteApplicationURL() override;
ServiceProvider* GetServiceProvider() override;
- virtual void RemoveServiceConnector(ServiceConnectorBase* service_connector);
+ void RemoveServiceConnectorForName(const std::string& interface_name);
private:
// ServiceProvider method.
@@ -48,14 +51,12 @@ class ServiceRegistry : public ServiceProvider, public ApplicationConnection {
const std::string remote_url_;
private:
- bool RemoveServiceConnectorInternal(ServiceConnectorBase* service_connector);
+ void RemoveServiceConnectorForNameInternal(const std::string& interface_name);
Application* application_;
- typedef std::map<std::string, ServiceConnectorBase*>
- NameToServiceConnectorMap;
- NameToServiceConnectorMap name_to_service_connector_;
Binding<ServiceProvider> local_binding_;
ServiceProviderPtr remote_service_provider_;
+ ServiceConnectorRegistry service_connector_registry_;
MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceRegistry);
};
diff --git a/third_party/mojo/src/mojo/public/cpp/application/service_connector.h b/third_party/mojo/src/mojo/public/cpp/application/service_connector.h
new file mode 100644
index 0000000..6dd6c86
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/application/service_connector.h
@@ -0,0 +1,30 @@
+// Copyright 2015 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_APPLICATION_SERVICE_CONNECTOR_H_
+#define MOJO_PUBLIC_APPLICATION_SERVICE_CONNECTOR_H_
+
+#include <string>
+
+#include "mojo/public/cpp/system/message_pipe.h"
+
+namespace mojo {
+
+class ApplicationConnection;
+
+class ServiceConnector {
+ public:
+ virtual ~ServiceConnector() {}
+
+ // Asks the ServiceConnector to connect to the specified service. If the
+ // ServiceConnector connects to the service it should take ownership of
+ // the handle in |handle|.
+ virtual void ConnectToService(ApplicationConnection* application_connection,
+ const std::string& interface_name,
+ ScopedMessagePipeHandle handle) = 0;
+};
+
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_APPLICATION_SERVICE_CONNECTOR_H_
diff --git a/third_party/mojo/src/mojo/public/cpp/application/service_provider_impl.h b/third_party/mojo/src/mojo/public/cpp/application/service_provider_impl.h
index 5ef5854..ed4de3a 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/service_provider_impl.h
+++ b/third_party/mojo/src/mojo/public/cpp/application/service_provider_impl.h
@@ -5,14 +5,14 @@
#ifndef MOJO_PUBLIC_APPLICATION_SERVICE_PROVIDER_IMPL_H_
#define MOJO_PUBLIC_APPLICATION_SERVICE_PROVIDER_IMPL_H_
-#include "mojo/public/cpp/application/lib/service_connector.h"
+#include <string>
+
+#include "mojo/public/cpp/application/lib/interface_factory_connector.h"
+#include "mojo/public/cpp/application/lib/service_connector_registry.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "mojo/public/interfaces/application/service_provider.mojom.h"
namespace mojo {
-namespace internal {
-class ServiceConnectorBase;
-}
// Implements a registry that can be used to expose services to another app.
class ServiceProviderImpl : public ServiceProvider {
@@ -28,26 +28,23 @@ class ServiceProviderImpl : public ServiceProvider {
template <typename Interface>
void AddService(InterfaceFactory<Interface>* factory) {
- AddServiceConnector(
- new internal::InterfaceFactoryConnector<Interface>(factory));
+ SetServiceConnectorForName(
+ new internal::InterfaceFactoryConnector<Interface>(factory),
+ Interface::Name_);
}
private:
- typedef std::map<std::string, internal::ServiceConnectorBase*>
- NameToServiceConnectorMap;
-
// Overridden from ServiceProvider:
void ConnectToService(const String& service_name,
ScopedMessagePipeHandle client_handle) override;
- void AddServiceConnector(internal::ServiceConnectorBase* service_connector);
- void RemoveServiceConnector(
- internal::ServiceConnectorBase* service_connector);
-
- NameToServiceConnectorMap service_connectors_;
+ void SetServiceConnectorForName(ServiceConnector* service_connector,
+ const std::string& interface_name);
Binding<ServiceProvider> binding_;
+ internal::ServiceConnectorRegistry service_connector_registry_;
+
MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceProviderImpl);
};
diff --git a/third_party/mojo/src/mojo/public/cpp/application/tests/service_registry_unittest.cc b/third_party/mojo/src/mojo/public/cpp/application/tests/service_registry_unittest.cc
index 283bf14..e0c5a9d 100644
--- a/third_party/mojo/src/mojo/public/cpp/application/tests/service_registry_unittest.cc
+++ b/third_party/mojo/src/mojo/public/cpp/application/tests/service_registry_unittest.cc
@@ -4,19 +4,19 @@
#include "mojo/public/cpp/application/lib/service_registry.h"
-#include "mojo/public/cpp/application/lib/service_connector.h"
+#include "mojo/public/cpp/application/service_connector.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace mojo {
namespace internal {
namespace {
-class TestConnector : public ServiceConnectorBase {
+class TestConnector : public ServiceConnector {
public:
- TestConnector(const std::string& name, int* delete_count)
- : ServiceConnectorBase(name), delete_count_(delete_count) {}
+ explicit TestConnector(int* delete_count) : delete_count_(delete_count) {}
~TestConnector() override { (*delete_count_)++; }
- void ConnectToService(const std::string& name,
+ void ConnectToService(ApplicationConnection* application_connection,
+ const std::string& interface_name,
ScopedMessagePipeHandle client_handle) override {}
private:
@@ -29,32 +29,37 @@ TEST(ServiceRegistryTest, Ownership) {
// Destruction.
{
ServiceRegistry registry;
- registry.AddServiceConnector(new TestConnector("TC1", &delete_count));
+ registry.SetServiceConnectorForName(new TestConnector(&delete_count),
+ "TC1");
}
EXPECT_EQ(1, delete_count);
// Removal.
{
ServiceRegistry registry;
- ServiceConnectorBase* c = new TestConnector("TC1", &delete_count);
- registry.AddServiceConnector(c);
- registry.RemoveServiceConnector(c);
+ ServiceConnector* c = new TestConnector(&delete_count);
+ registry.SetServiceConnectorForName(c, "TC1");
+ registry.RemoveServiceConnectorForName("TC1");
EXPECT_EQ(2, delete_count);
}
// Multiple.
{
ServiceRegistry registry;
- registry.AddServiceConnector(new TestConnector("TC1", &delete_count));
- registry.AddServiceConnector(new TestConnector("TC2", &delete_count));
+ registry.SetServiceConnectorForName(new TestConnector(&delete_count),
+ "TC1");
+ registry.SetServiceConnectorForName(new TestConnector(&delete_count),
+ "TC2");
}
EXPECT_EQ(4, delete_count);
// Re-addition.
{
ServiceRegistry registry;
- registry.AddServiceConnector(new TestConnector("TC1", &delete_count));
- registry.AddServiceConnector(new TestConnector("TC1", &delete_count));
+ registry.SetServiceConnectorForName(new TestConnector(&delete_count),
+ "TC1");
+ registry.SetServiceConnectorForName(new TestConnector(&delete_count),
+ "TC1");
EXPECT_EQ(5, delete_count);
}
EXPECT_EQ(6, delete_count);
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/BUILD.gn b/third_party/mojo/src/mojo/public/cpp/bindings/BUILD.gn
index 7de82a5..05e92be 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/BUILD.gn
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/BUILD.gn
@@ -23,6 +23,10 @@ mojo_sdk_source_set("bindings") {
"lib/buffer.h",
"lib/connector.cc",
"lib/connector.h",
+ "lib/control_message_handler.cc",
+ "lib/control_message_handler.h",
+ "lib/control_message_proxy.cc",
+ "lib/control_message_proxy.h",
"lib/filter_chain.cc",
"lib/filter_chain.h",
"lib/fixed_buffer.cc",
@@ -68,6 +72,7 @@ mojo_sdk_source_set("bindings") {
mojo_sdk_deps = [
"mojo/public/cpp/environment",
"mojo/public/cpp/system",
+ "mojo/public/interfaces/bindings:bindings_cpp_sources",
]
}
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h b/third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h
index b5191ef..c65f6e3 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h
@@ -6,6 +6,7 @@
#define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_IMPL_H_
#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/interface_ptr_info.h"
#include "mojo/public/cpp/bindings/interface_request.h"
#include "mojo/public/cpp/environment/environment.h"
#include "mojo/public/cpp/system/macros.h"
@@ -141,7 +142,7 @@ Impl* WeakBindToProxy(
InterfacePtr<Interface>* ptr,
const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
MessagePipe pipe;
- ptr->Bind(pipe.handle0.Pass(), waiter);
+ ptr->Bind(InterfacePtrInfo<Interface>(pipe.handle0.Pass(), 0u), waiter);
instance->BindToHandle(pipe.handle1.Pass(), waiter);
return instance;
}
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/interface_ptr.h b/third_party/mojo/src/mojo/public/cpp/bindings/interface_ptr.h
index 7c4a3fe..f7323e8 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/interface_ptr.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/interface_ptr.h
@@ -73,16 +73,6 @@ class InterfacePtr {
internal_state_.Bind(info.Pass(), waiter);
}
- // Similar to the previous method, but takes a message pipe handle as input.
- //
- // TODO(yzshen): Remove this method and change call sites to use the other
- // Bind().
- void Bind(
- ScopedMessagePipeHandle handle,
- const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
- Bind(InterfacePtrInfo<Interface>(handle.Pass(), 0u), waiter);
- }
-
// Returns a raw pointer to the local proxy. Caller does not take ownership.
// Note that the local proxy is thread hostile, as stated above.
Interface* get() const { return internal_state_.instance(); }
@@ -94,6 +84,24 @@ class InterfacePtr {
// Returns the version number of the interface that the remote side supports.
uint32_t version() const { return internal_state_.version(); }
+ // Queries the max version that the remote side supports. On completion, the
+ // result will be returned as the input of |callback|. The version number of
+ // this interface pointer will also be updated.
+ void QueryVersion(const Callback<void(uint32_t)>& callback) {
+ internal_state_.QueryVersion(callback);
+ }
+
+ // If the remote side doesn't support the specified version, it will close its
+ // end of the message pipe asynchronously. This does nothing if it's already
+ // known that the remote side supports the specified version, i.e., if
+ // |version <= this->version()|.
+ //
+ // After calling RequireVersion() with a version not supported by the remote
+ // side, all subsequent calls to interface methods will be ignored.
+ void RequireVersion(uint32_t version) {
+ internal_state_.RequireVersion(version);
+ }
+
// Closes the bound message pipe (if any) and returns the pointer to the
// unbound state.
void reset() {
@@ -137,15 +145,6 @@ class InterfacePtr {
return state.PassInterface();
}
- // Similar to the previous method but returns the previously bound message
- // pipe (if any).
- //
- // TODO(yzshen): Remove this method and change call sites to use
- // PassInterface().
- ScopedMessagePipeHandle PassMessagePipe() {
- return PassInterface().PassHandle();
- }
-
// DO NOT USE. Exposed only for internal use and for testing.
internal::InterfacePtrState<Interface>* internal_state() {
return &internal_state_;
@@ -167,19 +166,16 @@ class InterfacePtr {
mutable State internal_state_;
};
-// If the specified message pipe handle is valid, returns an InterfacePtr bound
-// to it. Otherwise, returns an unbound InterfacePtr. The specified |waiter|
-// will be used as in the InterfacePtr::Bind() method.
-//
-// TODO(yzshen): Either remove it or change to use InterfacePtrInfo as the first
-// parameter.
+// If |info| is valid (containing a valid message pipe handle), returns an
+// InterfacePtr bound to it. Otherwise, returns an unbound InterfacePtr. The
+// specified |waiter| will be used as in the InterfacePtr::Bind() method.
template <typename Interface>
InterfacePtr<Interface> MakeProxy(
- ScopedMessagePipeHandle handle,
+ InterfacePtrInfo<Interface> info,
const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
InterfacePtr<Interface> ptr;
- if (handle.is_valid())
- ptr.Bind(handle.Pass(), waiter);
+ if (info.is_valid())
+ ptr.Bind(info.Pass(), waiter);
return ptr.Pass();
}
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h b/third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h
index 488b679..c139306 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h
@@ -109,7 +109,7 @@ InterfaceRequest<Interface> MakeRequest(ScopedMessagePipeHandle handle) {
template <typename Interface>
InterfaceRequest<Interface> GetProxy(InterfacePtr<Interface>* ptr) {
MessagePipe pipe;
- ptr->Bind(pipe.handle0.Pass());
+ ptr->Bind(InterfacePtrInfo<Interface>(pipe.handle0.Pass(), 0u));
return MakeRequest<Interface>(pipe.handle1.Pass());
}
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_internal.h b/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_internal.h
index c8322df..6e6afde 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_internal.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_internal.h
@@ -62,6 +62,13 @@ struct Interface_Data {
};
static_assert(sizeof(Interface_Data) == 8, "Bad_sizeof(Interface_Data)");
+template <typename T>
+union UnionPointer {
+ uint64_t offset;
+ T* ptr;
+};
+static_assert(sizeof(UnionPointer<char>) == 8, "Bad_sizeof(UnionPointer)");
+
#pragma pack(pop)
template <typename T>
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.cc b/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.cc
index 9bfbd69..791afe2 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.cc
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.cc
@@ -64,6 +64,10 @@ void EncodeHandle(Interface_Data* data, std::vector<Handle>* handles) {
EncodeHandle(&data->handle, handles);
}
+void EncodeHandle(MojoHandle* handle, std::vector<Handle>* handles) {
+ EncodeHandle(reinterpret_cast<Handle*>(handle), handles);
+}
+
void DecodeHandle(Handle* handle, std::vector<Handle>* handles) {
if (handle->value() == kEncodedInvalidHandleValue) {
*handle = Handle();
@@ -78,5 +82,9 @@ void DecodeHandle(Interface_Data* data, std::vector<Handle>* handles) {
DecodeHandle(&data->handle, handles);
}
+void DecodeHandle(MojoHandle* handle, std::vector<Handle>* handles) {
+ DecodeHandle(reinterpret_cast<Handle*>(handle), handles);
+}
+
} // namespace internal
} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.h b/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.h
index 609a380..5e2f9a7 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/bindings_serialization.h
@@ -46,9 +46,11 @@ inline void DecodePointer(const uint64_t* offset, T** ptr) {
void EncodeHandle(Handle* handle, std::vector<Handle>* handles);
void EncodeHandle(Interface_Data* data, std::vector<Handle>* handles);
-// Note: The following two functions don't validate the encoded handle value.
+void EncodeHandle(MojoHandle* handle, std::vector<Handle>* handles);
+// Note: The following three functions don't validate the encoded handle value.
void DecodeHandle(Handle* handle, std::vector<Handle>* handles);
void DecodeHandle(Interface_Data* data, std::vector<Handle>* handles);
+void DecodeHandle(MojoHandle* handle, std::vector<Handle>* handles);
// The following 2 functions are used to encode/decode all objects (structs and
// arrays) in a consistent manner.
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/connector.cc b/third_party/mojo/src/mojo/public/cpp/bindings/lib/connector.cc
index ebdcf38..89499dc 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/connector.cc
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/connector.cc
@@ -62,11 +62,10 @@ bool Connector::WaitForIncomingMessage(MojoDeadline deadline) {
}
bool Connector::Accept(Message* message) {
- MOJO_CHECK(message_pipe_.is_valid());
-
if (error_)
return false;
+ MOJO_CHECK(message_pipe_.is_valid());
if (drop_writes_)
return true;
@@ -198,7 +197,7 @@ void Connector::CancelWait() {
void Connector::NotifyError() {
error_ = true;
- CancelWait();
+ CloseMessagePipe();
if (error_handler_)
error_handler_->OnConnectionError();
}
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.cc b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.cc
new file mode 100644
index 0000000..00cd3f5
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.cc
@@ -0,0 +1,82 @@
+// Copyright 2015 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/lib/control_message_handler.h"
+
+#include "mojo/public/cpp/bindings/lib/message_builder.h"
+#include "mojo/public/cpp/environment/logging.h"
+#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
+
+namespace mojo {
+namespace internal {
+
+// static
+bool ControlMessageHandler::IsControlMessage(const Message* message) {
+ return message->header()->name == kRunMessageId ||
+ message->header()->name == kRunOrClosePipeMessageId;
+}
+
+ControlMessageHandler::ControlMessageHandler(uint32_t interface_version)
+ : interface_version_(interface_version) {
+}
+
+ControlMessageHandler::~ControlMessageHandler() {
+}
+
+bool ControlMessageHandler::Accept(Message* message) {
+ if (message->header()->name == kRunOrClosePipeMessageId)
+ return RunOrClosePipe(message);
+
+ MOJO_NOTREACHED();
+ return false;
+}
+
+bool ControlMessageHandler::AcceptWithResponder(
+ Message* message,
+ MessageReceiverWithStatus* responder) {
+ if (message->header()->name == kRunMessageId)
+ return Run(message, responder);
+
+ MOJO_NOTREACHED();
+ return false;
+}
+
+bool ControlMessageHandler::Run(Message* message,
+ MessageReceiverWithStatus* responder) {
+ RunResponseMessageParamsPtr response_params_ptr(
+ RunResponseMessageParams::New());
+ response_params_ptr->reserved0 = 16u;
+ response_params_ptr->reserved1 = 0u;
+ response_params_ptr->query_version_result = QueryVersionResult::New();
+ response_params_ptr->query_version_result->version = interface_version_;
+
+ size_t size = GetSerializedSize_(response_params_ptr);
+ ResponseMessageBuilder builder(kRunMessageId, size, message->request_id());
+
+ RunResponseMessageParams_Data* response_params = nullptr;
+ Serialize_(response_params_ptr.Pass(), builder.buffer(), &response_params);
+ Message response_message;
+ response_params->EncodePointersAndHandles(response_message.mutable_handles());
+ builder.Finish(&response_message);
+ bool ok = responder->Accept(&response_message);
+ MOJO_ALLOW_UNUSED_LOCAL(ok);
+ delete responder;
+
+ return true;
+}
+
+bool ControlMessageHandler::RunOrClosePipe(Message* message) {
+ RunOrClosePipeMessageParams_Data* params =
+ reinterpret_cast<RunOrClosePipeMessageParams_Data*>(
+ message->mutable_payload());
+ params->DecodePointersAndHandles(message->mutable_handles());
+
+ RunOrClosePipeMessageParamsPtr params_ptr;
+ Deserialize_(params, &params_ptr);
+
+ return interface_version_ >= params_ptr->require_version->version;
+}
+
+} // namespace internal
+} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.h b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.h
new file mode 100644
index 0000000..4a2fed5
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_handler.h
@@ -0,0 +1,42 @@
+// Copyright 2015 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_CONTROL_MESSAGE_HANDLER_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_HANDLER_H_
+
+#include <stdint.h>
+
+#include "mojo/public/cpp/bindings/message.h"
+#include "mojo/public/cpp/system/macros.h"
+
+namespace mojo {
+namespace internal {
+
+// Handlers for request messages defined in interface_control_messages.mojom.
+class ControlMessageHandler : public MessageReceiverWithResponderStatus {
+ public:
+ static bool IsControlMessage(const Message* message);
+
+ explicit ControlMessageHandler(uint32_t interface_version);
+ ~ControlMessageHandler() override;
+
+ // Call the following methods only if IsControlMessage() returned true.
+ bool Accept(Message* message) override;
+ // Takes ownership of |responder|.
+ bool AcceptWithResponder(Message* message,
+ MessageReceiverWithStatus* responder) override;
+
+ private:
+ bool Run(Message* message, MessageReceiverWithStatus* responder);
+ bool RunOrClosePipe(Message* message);
+
+ uint32_t interface_version_;
+
+ MOJO_DISALLOW_COPY_AND_ASSIGN(ControlMessageHandler);
+};
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_HANDLER_H_
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.cc b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.cc
new file mode 100644
index 0000000..11bfce9
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.cc
@@ -0,0 +1,104 @@
+// Copyright 2015 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/lib/control_message_proxy.h"
+
+#include "mojo/public/cpp/bindings/lib/message_builder.h"
+#include "mojo/public/cpp/bindings/message.h"
+#include "mojo/public/cpp/system/macros.h"
+#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
+
+namespace mojo {
+namespace internal {
+
+namespace {
+
+using RunCallback = Callback<void(QueryVersionResultPtr)>;
+
+class RunResponseForwardToCallback : public MessageReceiver {
+ public:
+ RunResponseForwardToCallback(const RunCallback& callback)
+ : callback_(callback) {}
+ bool Accept(Message* message) override;
+
+ private:
+ RunCallback callback_;
+ MOJO_DISALLOW_COPY_AND_ASSIGN(RunResponseForwardToCallback);
+};
+
+bool RunResponseForwardToCallback::Accept(Message* message) {
+ RunResponseMessageParams_Data* params =
+ reinterpret_cast<RunResponseMessageParams_Data*>(
+ message->mutable_payload());
+ params->DecodePointersAndHandles(message->mutable_handles());
+
+ RunResponseMessageParamsPtr params_ptr;
+ Deserialize_(params, &params_ptr);
+
+ callback_.Run(params_ptr->query_version_result.Pass());
+ return true;
+}
+
+void SendRunMessage(MessageReceiverWithResponder* receiver,
+ QueryVersionPtr query_version,
+ const RunCallback& callback) {
+ RunMessageParamsPtr params_ptr(RunMessageParams::New());
+ params_ptr->reserved0 = 16u;
+ params_ptr->reserved1 = 0u;
+ params_ptr->query_version = query_version.Pass();
+
+ size_t size = GetSerializedSize_(params_ptr);
+ RequestMessageBuilder builder(kRunMessageId, size);
+
+ RunMessageParams_Data* params = nullptr;
+ Serialize_(params_ptr.Pass(), builder.buffer(), &params);
+ Message message;
+ params->EncodePointersAndHandles(message.mutable_handles());
+ builder.Finish(&message);
+ MessageReceiver* responder = new RunResponseForwardToCallback(callback);
+ if (!receiver->AcceptWithResponder(&message, responder))
+ delete responder;
+}
+
+void SendRunOrClosePipeMessage(MessageReceiverWithResponder* receiver,
+ RequireVersionPtr require_version) {
+ RunOrClosePipeMessageParamsPtr params_ptr(RunOrClosePipeMessageParams::New());
+ params_ptr->reserved0 = 16u;
+ params_ptr->reserved1 = 0u;
+ params_ptr->require_version = require_version.Pass();
+
+ size_t size = GetSerializedSize_(params_ptr);
+ MessageBuilder builder(kRunOrClosePipeMessageId, size);
+
+ RunOrClosePipeMessageParams_Data* params = nullptr;
+ Serialize_(params_ptr.Pass(), builder.buffer(), &params);
+ Message message;
+ params->EncodePointersAndHandles(message.mutable_handles());
+ builder.Finish(&message);
+ bool ok = receiver->Accept(&message);
+ MOJO_ALLOW_UNUSED_LOCAL(ok);
+}
+
+} // namespace
+
+ControlMessageProxy::ControlMessageProxy(MessageReceiverWithResponder* receiver)
+ : receiver_(receiver) {
+}
+
+void ControlMessageProxy::QueryVersion(
+ const Callback<void(uint32_t)>& callback) {
+ auto run_callback = [callback](QueryVersionResultPtr query_version_result) {
+ callback.Run(query_version_result->version);
+ };
+ SendRunMessage(receiver_, QueryVersion::New(), run_callback);
+}
+
+void ControlMessageProxy::RequireVersion(uint32_t version) {
+ RequireVersionPtr require_version(RequireVersion::New());
+ require_version->version = version;
+ SendRunOrClosePipeMessage(receiver_, require_version.Pass());
+}
+
+} // namespace internal
+} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.h b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.h
new file mode 100644
index 0000000..5b0f018
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/control_message_proxy.h
@@ -0,0 +1,38 @@
+// Copyright 2015 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_CONTROL_MESSAGE_PROXY_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_PROXY_H_
+
+#include <stdint.h>
+
+#include "mojo/public/cpp/bindings/callback.h"
+#include "mojo/public/cpp/system/macros.h"
+
+namespace mojo {
+
+class MessageReceiverWithResponder;
+
+namespace internal {
+
+// Proxy for request messages defined in interface_control_messages.mojom.
+class ControlMessageProxy {
+ public:
+ // Doesn't take ownership of |receiver|. It must outlive this object.
+ explicit ControlMessageProxy(MessageReceiverWithResponder* receiver);
+
+ void QueryVersion(const Callback<void(uint32_t)>& callback);
+ void RequireVersion(uint32_t version);
+
+ protected:
+ // Not owned.
+ MessageReceiverWithResponder* receiver_;
+
+ MOJO_DISALLOW_COPY_AND_ASSIGN(ControlMessageProxy);
+};
+
+} // namespace internal
+} // namespace mojo
+
+#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_CONTROL_MESSAGE_PROXY_H_
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/interface_ptr_internal.h b/third_party/mojo/src/mojo/public/cpp/bindings/lib/interface_ptr_internal.h
index 2778eef..cd3803fd 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/interface_ptr_internal.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/interface_ptr_internal.h
@@ -8,6 +8,7 @@
#include <algorithm> // For |std::swap()|.
#include "mojo/public/cpp/bindings/interface_ptr_info.h"
+#include "mojo/public/cpp/bindings/lib/control_message_proxy.h"
#include "mojo/public/cpp/bindings/lib/filter_chain.h"
#include "mojo/public/cpp/bindings/lib/message_header_validator.h"
#include "mojo/public/cpp/bindings/lib/router.h"
@@ -41,6 +42,33 @@ class InterfacePtrState {
uint32_t version() const { return version_; }
+ void QueryVersion(const Callback<void(uint32_t)>& callback) {
+ ConfigureProxyIfNecessary();
+
+ // It is safe to capture |this| because the callback won't be run after this
+ // object goes away.
+ auto callback_wrapper = [this, callback](uint32_t version) {
+ this->version_ = version;
+ callback.Run(version);
+ };
+
+ // Do a static cast in case the interface contains methods with the same
+ // name.
+ static_cast<ControlMessageProxy*>(proxy_)->QueryVersion(callback_wrapper);
+ }
+
+ void RequireVersion(uint32_t version) {
+ ConfigureProxyIfNecessary();
+
+ if (version <= version_)
+ return;
+
+ version_ = version;
+ // Do a static cast in case the interface contains methods with the same
+ // name.
+ static_cast<ControlMessageProxy*>(proxy_)->RequireVersion(version);
+ }
+
void Swap(InterfacePtrState* other) {
using std::swap;
swap(other->proxy_, proxy_);
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/map_data_internal.h b/third_party/mojo/src/mojo/public/cpp/bindings/lib/map_data_internal.h
index 97554b7..6d629b4 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/map_data_internal.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/map_data_internal.h
@@ -66,10 +66,8 @@ class Map_Data {
return false;
const Map_Data* object = static_cast<const Map_Data*>(data);
- // TODO(yzshen): In order to work with other bindings which still interprets
- // the |version| field as |num_fields|, |version| is set to 2.
if (object->header_.num_bytes != sizeof(Map_Data) ||
- object->header_.version != 2) {
+ object->header_.version != 0) {
ReportValidationError(VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
return false;
}
@@ -134,9 +132,7 @@ class Map_Data {
private:
Map_Data() {
header_.num_bytes = sizeof(*this);
- // TODO(yzshen): In order to work with other bindings which still interprets
- // the |version| field as |num_fields|, set it to version 2 for now.
- header_.version = 2;
+ header_.version = 0;
}
~Map_Data() = delete;
};
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/map_serialization.h b/third_party/mojo/src/mojo/public/cpp/bindings/lib/map_serialization.h
index 632da5d..6014b36 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/map_serialization.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/map_serialization.h
@@ -53,7 +53,7 @@ struct MapSerializer<ScopedHandleBase<H>, H, true, false> {
static size_t GetBaseArraySize(size_t count) {
return Align(count * sizeof(H));
}
- static size_t GetItemSize(const H& item) { return 0; }
+ static size_t GetItemSize(const ScopedHandleBase<H>& item) { return 0; }
};
// This template must only apply to pointer mojo entity (structs and arrays).
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/message_builder.cc b/third_party/mojo/src/mojo/public/cpp/bindings/lib/message_builder.cc
index 837ac81..003aba5 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/message_builder.cc
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/message_builder.cc
@@ -19,9 +19,7 @@ MessageBuilder::MessageBuilder(uint32_t name, size_t payload_size)
: buf_(sizeof(MessageHeader) + payload_size) {
MessageHeader* header;
Allocate(&buf_, &header);
- // TODO(yzshen): In order to work with other bindings which still interprets
- // the |version| field as |num_fields|, set it to version 2 for now.
- header->version = 2;
+ header->version = 0;
header->name = name;
}
@@ -43,9 +41,7 @@ MessageWithRequestIDBuilder::MessageWithRequestIDBuilder(uint32_t name,
: MessageBuilder(sizeof(MessageHeaderWithRequestID) + payload_size) {
MessageHeaderWithRequestID* header;
Allocate(&buf_, &header);
- // TODO(yzshen): In order to work with other bindings which still interprets
- // the |version| field as |num_fields|, set it to version 3 for now.
- header->version = 3;
+ header->version = 1;
header->name = name;
header->flags = flags;
header->request_id = request_id;
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/message_header_validator.cc b/third_party/mojo/src/mojo/public/cpp/bindings/lib/message_header_validator.cc
index ff507f3..940b15c 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/message_header_validator.cc
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/message_header_validator.cc
@@ -17,21 +17,17 @@ bool IsValidMessageHeader(const MessageHeader* header) {
// header. If we encounter fields we do not understand, we must ignore them.
// Extra validation of the struct header:
- if (header->version < 2) {
- ReportValidationError(VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
- return false;
- }
- if (header->version == 2) {
+ if (header->version == 0) {
if (header->num_bytes != sizeof(MessageHeader)) {
ReportValidationError(VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
return false;
}
- } else if (header->version == 3) {
+ } else if (header->version == 1) {
if (header->num_bytes != sizeof(MessageHeaderWithRequestID)) {
ReportValidationError(VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
return false;
}
- } else if (header->version > 3) {
+ } else if (header->version > 1) {
if (header->num_bytes < sizeof(MessageHeaderWithRequestID)) {
ReportValidationError(VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER);
return false;
@@ -41,7 +37,7 @@ bool IsValidMessageHeader(const MessageHeader* header) {
// Validate flags (allow unknown bits):
// These flags require a RequestID.
- if (header->version < 3 && ((header->flags & kMessageExpectsResponse) ||
+ if (header->version < 1 && ((header->flags & kMessageExpectsResponse) ||
(header->flags & kMessageIsResponse))) {
ReportValidationError(VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID);
return false;
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.cc b/third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.cc
index 5614cca..d8a1e68 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.cc
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.cc
@@ -7,6 +7,7 @@
#include "mojo/public/cpp/bindings/lib/bindings_serialization.h"
#include "mojo/public/cpp/bindings/lib/message_internal.h"
#include "mojo/public/cpp/bindings/lib/validation_errors.h"
+#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
namespace mojo {
namespace internal {
@@ -70,5 +71,27 @@ bool ValidateMessageIsResponse(const Message* message) {
return true;
}
+bool ValidateControlRequest(const Message* message) {
+ switch (message->header()->name) {
+ case kRunMessageId:
+ return ValidateMessageIsRequestExpectingResponse(message) &&
+ ValidateMessagePayload<RunMessageParams_Data>(message);
+ case kRunOrClosePipeMessageId:
+ return ValidateMessageIsRequestWithoutResponse(message) &&
+ ValidateMessagePayload<RunOrClosePipeMessageParams_Data>(message);
+ }
+ return false;
+}
+
+bool ValidateControlResponse(const Message* message) {
+ if (!ValidateMessageIsResponse(message))
+ return false;
+ switch (message->header()->name) {
+ case kRunMessageId:
+ return ValidateMessagePayload<RunResponseMessageParams_Data>(message);
+ }
+ return false;
+}
+
} // namespace internal
} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.h b/third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.h
index 1b80a5b1..6853f45 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/lib/validation_util.h
@@ -42,6 +42,11 @@ bool ValidateMessagePayload(const Message* message) {
return ParamsType::Validate(message->payload(), &bounds_checker);
}
+// The following methods validate control messages defined in
+// interface_control_messages.mojom.
+bool ValidateControlRequest(const Message* message);
+bool ValidateControlResponse(const Message* message);
+
} // namespace internal
} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/message.h b/third_party/mojo/src/mojo/public/cpp/bindings/message.h
index b763d9a..d8e3859 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/message.h
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/message.h
@@ -43,7 +43,7 @@ class Message {
bool has_flag(uint32_t flag) const { return !!(data_->header.flags & flag); }
// Access the request_id field (if present).
- bool has_request_id() const { return data_->header.version >= 3; }
+ bool has_request_id() const { return data_->header.version >= 1; }
uint64_t request_id() const {
MOJO_DCHECK(has_request_id());
return static_cast<const internal::MessageHeaderWithRequestID*>(
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/BUILD.gn b/third_party/mojo/src/mojo/public/cpp/bindings/tests/BUILD.gn
index 46c2e50..c38d27e 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/tests/BUILD.gn
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/BUILD.gn
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("../../../mojo_application.gni")
import("../../../mojo_sdk.gni")
mojo_sdk_source_set("tests") {
@@ -15,6 +16,7 @@ mojo_sdk_source_set("tests") {
"buffer_unittest.cc",
"callback_unittest.cc",
"connector_unittest.cc",
+ "constant_unittest.cc",
"container_test_util.cc",
"equals_unittest.cc",
"handle_passing_unittest.cc",
@@ -54,3 +56,53 @@ mojo_sdk_source_set("mojo_public_bindings_test_utils") {
mojo_sdk_deps = [ "mojo/public/c/system" ]
}
+
+mojo_native_application("versioning_test_service") {
+ testonly = true
+
+ deps = [
+ ":versioning_test_service_source_set",
+ ]
+}
+
+mojo_sdk_source_set("versioning_test_service_source_set") {
+ testonly = true
+ visibility = [ ":*" ]
+
+ sources = [
+ "versioning_test_service.cc",
+ ]
+
+ mojo_sdk_deps = [
+ "mojo/public/cpp/application:standalone",
+ "mojo/public/cpp/bindings",
+ "mojo/public/cpp/system",
+ "mojo/public/interfaces/bindings/tests:versioning_test_service_interfaces",
+ ]
+}
+
+mojo_native_application("versioning_apptests") {
+ testonly = true
+
+ deps = [
+ ":versioning_apptest_source_set",
+ ]
+ data_deps = [ ":versioning_test_service" ]
+}
+
+mojo_sdk_source_set("versioning_apptest_source_set") {
+ testonly = true
+ visibility = [ ":*" ]
+
+ sources = [
+ "versioning_apptest.cc",
+ ]
+
+ mojo_sdk_deps = [
+ "mojo/public/cpp/application:standalone",
+ "mojo/public/cpp/application:test_support_standalone",
+ "mojo/public/cpp/bindings",
+ "mojo/public/cpp/system",
+ "mojo/public/interfaces/bindings/tests:versioning_test_client_interfaces",
+ ]
+}
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/constant_unittest.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/constant_unittest.cc
new file mode 100644
index 0000000..f6394f3
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/constant_unittest.cc
@@ -0,0 +1,42 @@
+// Copyright 2015 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/interfaces/bindings/tests/test_constants.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace mojo {
+namespace test {
+
+TEST(ConstantTest, GlobalConstants) {
+ // Compile-time constants.
+ static_assert(kBoolValue == true, "");
+ static_assert(kInt8Value == -2, "");
+ static_assert(kUint8Value == 128U, "");
+ static_assert(kInt16Value == -233, "");
+ static_assert(kUint16Value == 44204U, "");
+ static_assert(kInt32Value == -44204, "");
+ static_assert(kUint32Value == 4294967295U, "");
+ static_assert(kInt64Value == -9223372036854775807, "");
+ static_assert(kUint64Value == 9999999999999999999ULL, "");
+
+ EXPECT_DOUBLE_EQ(kDoubleValue, 3.14159);
+ EXPECT_FLOAT_EQ(kFloatValue, 2.71828f);
+}
+
+TEST(ConstantTest, StructConstants) {
+ // Compile-time constants.
+ static_assert(StructWithConstants::kInt8Value == 5U, "");
+
+ EXPECT_FLOAT_EQ(StructWithConstants::kFloatValue, 765.432f);
+}
+
+TEST(ConstantTest, InterfaceConstants) {
+ // Compile-time constants.
+ static_assert(InterfaceWithConstants::kUint32Value == 20100722, "");
+
+ EXPECT_DOUBLE_EQ(InterfaceWithConstants::kDoubleValue, 12.34567);
+}
+
+} // namespace test
+} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
index 524b07c..09e4812 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
@@ -8,6 +8,7 @@
#include "mojo/public/cpp/environment/environment.h"
#include "mojo/public/cpp/utility/run_loop.h"
#include "mojo/public/interfaces/bindings/tests/math_calculator.mojom.h"
+#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
#include "mojo/public/interfaces/bindings/tests/sample_service.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -176,6 +177,23 @@ class ReentrantServiceImpl : public sample::Service {
Binding<sample::Service> binding_;
};
+class IntegerAccessorImpl : public sample::IntegerAccessor {
+ public:
+ IntegerAccessorImpl() : integer_(0) {}
+ ~IntegerAccessorImpl() override {}
+
+ int64_t integer() const { return integer_; }
+
+ private:
+ // sample::IntegerAccessor implementation.
+ void GetInteger(const GetIntegerCallback& callback) override {
+ callback.Run(integer_, sample::ENUM_VALUE);
+ }
+ void SetInteger(int64_t data, sample::Enum type) override { integer_ = data; }
+
+ int64_t integer_;
+};
+
class InterfacePtrTest : public testing::Test {
public:
~InterfacePtrTest() override { loop_.RunUntilIdle(); }
@@ -248,7 +266,7 @@ TEST_F(InterfacePtrTest, Resettable) {
// Save this so we can test it later.
Handle handle = pipe.handle0.get();
- a = MakeProxy<math::Calculator>(pipe.handle0.Pass());
+ a = MakeProxy(InterfacePtrInfo<math::Calculator>(pipe.handle0.Pass(), 0u));
EXPECT_FALSE(!a);
@@ -266,7 +284,7 @@ TEST_F(InterfacePtrTest, BindInvalidHandle) {
EXPECT_FALSE(ptr.get());
EXPECT_FALSE(ptr);
- ptr.Bind(ScopedMessagePipeHandle());
+ ptr.Bind(InterfacePtrInfo<math::Calculator>());
EXPECT_FALSE(ptr.get());
EXPECT_FALSE(ptr);
}
@@ -374,6 +392,53 @@ TEST_F(InterfacePtrTest, ReentrantWaitForIncomingMethodCall) {
EXPECT_EQ(2, impl.max_call_depth());
}
+TEST_F(InterfacePtrTest, QueryVersion) {
+ IntegerAccessorImpl impl;
+ sample::IntegerAccessorPtr ptr;
+ Binding<sample::IntegerAccessor> binding(&impl, GetProxy(&ptr));
+
+ EXPECT_EQ(0u, ptr.version());
+
+ auto callback = [](uint32_t version) { EXPECT_EQ(3u, version); };
+ ptr.QueryVersion(callback);
+
+ PumpMessages();
+
+ EXPECT_EQ(3u, ptr.version());
+}
+
+TEST_F(InterfacePtrTest, RequireVersion) {
+ IntegerAccessorImpl impl;
+ sample::IntegerAccessorPtr ptr;
+ Binding<sample::IntegerAccessor> binding(&impl, GetProxy(&ptr));
+
+ EXPECT_EQ(0u, ptr.version());
+
+ ptr.RequireVersion(1u);
+ EXPECT_EQ(1u, ptr.version());
+ ptr->SetInteger(123, sample::ENUM_VALUE);
+ PumpMessages();
+ EXPECT_FALSE(ptr.encountered_error());
+ EXPECT_EQ(123, impl.integer());
+
+ ptr.RequireVersion(3u);
+ EXPECT_EQ(3u, ptr.version());
+ ptr->SetInteger(456, sample::ENUM_VALUE);
+ PumpMessages();
+ EXPECT_FALSE(ptr.encountered_error());
+ EXPECT_EQ(456, impl.integer());
+
+ // Require a version that is not supported by the impl side.
+ ptr.RequireVersion(4u);
+ // This value is set to the input of RequireVersion() synchronously.
+ EXPECT_EQ(4u, ptr.version());
+ ptr->SetInteger(789, sample::ENUM_VALUE);
+ PumpMessages();
+ EXPECT_TRUE(ptr.encountered_error());
+ // The call to SetInteger() after RequireVersion(4u) is ignored.
+ EXPECT_EQ(456, impl.integer());
+}
+
class StrongMathCalculatorImpl : public math::Calculator, public ErrorHandler {
public:
StrongMathCalculatorImpl(ScopedMessagePipeHandle handle,
@@ -421,7 +486,7 @@ TEST(StrongConnectorTest, Math) {
&destroyed);
math::CalculatorPtr calc;
- calc.Bind(pipe.handle1.Pass());
+ calc.Bind(InterfacePtrInfo<math::Calculator>(pipe.handle1.Pass(), 0u));
{
// Suppose this is instantiated in a process that has the other end of the
@@ -491,7 +556,7 @@ TEST(WeakConnectorTest, Math) {
WeakMathCalculatorImpl impl(pipe.handle0.Pass(), &error_received, &destroyed);
math::CalculatorPtr calc;
- calc.Bind(pipe.handle1.Pass());
+ calc.Bind(InterfacePtrInfo<math::Calculator>(pipe.handle1.Pass(), 0u));
{
// Suppose this is instantiated in a process that has the other end of the
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc
index 5017d97..3253232 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/union_unittest.cc
@@ -10,6 +10,7 @@
#include "mojo/public/cpp/bindings/lib/fixed_buffer.h"
#include "mojo/public/cpp/bindings/string.h"
#include "mojo/public/cpp/environment/environment.h"
+#include "mojo/public/cpp/test_support/test_utils.h"
#include "mojo/public/interfaces/bindings/tests/test_structs.mojom.h"
#include "mojo/public/interfaces/bindings/tests/test_unions.mojom.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -78,6 +79,11 @@ TEST(UnionTest, PlainOldDataGetterSetter) {
EXPECT_FALSE(pod->get_f_bool());
EXPECT_TRUE(pod->is_f_bool());
EXPECT_EQ(pod->which(), PodUnion::Tag::F_BOOL);
+
+ pod->set_f_enum(AN_ENUM_SECOND);
+ EXPECT_EQ(AN_ENUM_SECOND, pod->get_f_enum());
+ EXPECT_TRUE(pod->is_f_enum());
+ EXPECT_EQ(pod->which(), PodUnion::Tag::F_ENUM);
}
TEST(UnionTest, PodEquals) {
@@ -105,7 +111,7 @@ TEST(UnionTest, PodClone) {
EXPECT_EQ(pod_clone->which(), PodUnion::Tag::F_INT8);
}
-TEST(UnionTest, SerializationPod) {
+TEST(UnionTest, PodSerialization) {
PodUnionPtr pod1(PodUnion::New());
pod1->set_f_int8(10);
@@ -124,6 +130,25 @@ TEST(UnionTest, SerializationPod) {
EXPECT_EQ(pod2->which(), PodUnion::Tag::F_INT8);
}
+TEST(UnionTest, EnumSerialization) {
+ PodUnionPtr pod1(PodUnion::New());
+ pod1->set_f_enum(AN_ENUM_SECOND);
+
+ size_t size = GetSerializedSize_(pod1, false);
+ EXPECT_EQ(16U, size);
+
+ mojo::internal::FixedBuffer buf(size);
+ internal::PodUnion_Data* data = nullptr;
+ SerializeUnion_(pod1.Pass(), &buf, &data, false);
+
+ PodUnionPtr pod2;
+ Deserialize_(data, &pod2);
+
+ EXPECT_EQ(AN_ENUM_SECOND, pod2->get_f_enum());
+ EXPECT_TRUE(pod2->is_f_enum());
+ EXPECT_EQ(pod2->which(), PodUnion::Tag::F_ENUM);
+}
+
TEST(UnionTest, PodValidation) {
PodUnionPtr pod(PodUnion::New());
pod->set_f_int8(10);
@@ -275,6 +300,10 @@ TEST(UnionTest, StringSerialization) {
internal::ObjectUnion_Data* data = nullptr;
SerializeUnion_(pod1.Pass(), &buf, &data, false);
+ std::vector<Handle> handles;
+ data->EncodePointersAndHandles(&handles);
+ data->DecodePointersAndHandles(&handles);
+
ObjectUnionPtr pod2;
Deserialize_(data, &pod2);
EXPECT_EQ(hello, pod2->get_f_string());
@@ -319,7 +348,7 @@ TEST(UnionTest, StringValidateOOB) {
internal::ObjectUnion_Data* data = internal::ObjectUnion_Data::New(&buf);
data->tag = internal::ObjectUnion_Data::ObjectUnion_Tag::F_STRING;
- data->data.f_f_string = 8;
+ data->data.f_f_string.offset = 8;
char* ptr = reinterpret_cast<char*>(&data->data.f_f_string);
mojo::internal::ArrayHeader* array_header =
reinterpret_cast<mojo::internal::ArrayHeader*>(ptr + *ptr);
@@ -444,6 +473,10 @@ TEST(UnionTest, Serialization_UnionOfObjects) {
internal::SmallObjStruct_Data* data = nullptr;
Serialize_(obj_struct.Pass(), &buf, &data);
+ std::vector<Handle> handles;
+ data->EncodePointersAndHandles(&handles);
+ data->DecodePointersAndHandles(&handles);
+
SmallObjStructPtr deserialized;
Deserialize_(data, &deserialized);
@@ -614,6 +647,10 @@ TEST(UnionTest, StructInUnionSerialization) {
internal::ObjectUnion_Data* data = nullptr;
SerializeUnion_(obj.Pass(), &buf, &data, false);
+ std::vector<Handle> handles;
+ data->EncodePointersAndHandles(&handles);
+ data->DecodePointersAndHandles(&handles);
+
ObjectUnionPtr obj2;
Deserialize_(data, &obj2);
EXPECT_EQ(8, obj2->get_f_dummy()->f_int8);
@@ -820,5 +857,191 @@ TEST(UnionTest, MapInUnionValidation) {
free(raw_buf);
}
+TEST(UnionTest, UnionInUnionGetterSetter) {
+ PodUnionPtr pod(PodUnion::New());
+ pod->set_f_int8(10);
+
+ ObjectUnionPtr obj(ObjectUnion::New());
+ obj->set_f_pod_union(pod.Pass());
+
+ EXPECT_EQ(10, obj->get_f_pod_union()->get_f_int8());
+}
+
+TEST(UnionTest, UnionInUnionSerialization) {
+ Environment environment;
+ PodUnionPtr pod(PodUnion::New());
+ pod->set_f_int8(10);
+
+ ObjectUnionPtr obj(ObjectUnion::New());
+ obj->set_f_pod_union(pod.Pass());
+
+ size_t size = GetSerializedSize_(obj, false);
+ EXPECT_EQ(32U, size);
+
+ mojo::internal::FixedBuffer buf(size);
+ internal::ObjectUnion_Data* data = nullptr;
+ SerializeUnion_(obj.Pass(), &buf, &data, false);
+
+ std::vector<Handle> handles;
+ data->EncodePointersAndHandles(&handles);
+ data->DecodePointersAndHandles(&handles);
+
+ ObjectUnionPtr obj2;
+ Deserialize_(data, &obj2);
+ EXPECT_EQ(10, obj2->get_f_pod_union()->get_f_int8());
+}
+
+TEST(UnionTest, UnionInUnionValidation) {
+ Environment environment;
+ PodUnionPtr pod(PodUnion::New());
+ pod->set_f_int8(10);
+
+ ObjectUnionPtr obj(ObjectUnion::New());
+ obj->set_f_pod_union(pod.Pass());
+
+ size_t size = GetSerializedSize_(obj, false);
+ EXPECT_EQ(32U, size);
+
+ mojo::internal::FixedBuffer buf(size);
+ internal::ObjectUnion_Data* data = nullptr;
+ SerializeUnion_(obj.Pass(), &buf, &data, false);
+
+ std::vector<Handle> handles;
+ data->EncodePointersAndHandles(&handles);
+
+ void* raw_buf = buf.Leak();
+ mojo::internal::BoundsChecker bounds_checker(data,
+ static_cast<uint32_t>(size), 0);
+ EXPECT_TRUE(
+ internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false));
+ free(raw_buf);
+}
+
+TEST(UnionTest, UnionInUnionValidationNonNullable) {
+ Environment environment;
+ PodUnionPtr pod(nullptr);
+
+ ObjectUnionPtr obj(ObjectUnion::New());
+ obj->set_f_pod_union(pod.Pass());
+
+ size_t size = GetSerializedSize_(obj, false);
+
+ mojo::internal::FixedBuffer buf(size);
+ internal::ObjectUnion_Data* data = nullptr;
+ SerializeUnion_(obj.Pass(), &buf, &data, false);
+ std::vector<Handle> handles;
+ data->EncodePointersAndHandles(&handles);
+
+ void* raw_buf = buf.Leak();
+ mojo::internal::BoundsChecker bounds_checker(data,
+ static_cast<uint32_t>(size), 0);
+ EXPECT_FALSE(
+ internal::ObjectUnion_Data::Validate(raw_buf, &bounds_checker, false));
+ free(raw_buf);
+}
+
+TEST(UnionTest, HandleInUnionGetterSetter) {
+ ScopedMessagePipeHandle pipe0;
+ ScopedMessagePipeHandle pipe1;
+
+ CreateMessagePipe(nullptr, &pipe0, &pipe1);
+
+ HandleUnionPtr handle(HandleUnion::New());
+ handle->set_f_message_pipe(pipe1.Pass());
+
+ std::string golden("hello world");
+ WriteTextMessage(pipe0.get(), golden);
+
+ std::string actual;
+ ReadTextMessage(handle->get_f_message_pipe().get(), &actual);
+
+ EXPECT_EQ(golden, actual);
+}
+
+TEST(UnionTest, HandleInUnionSerialization) {
+ ScopedMessagePipeHandle pipe0;
+ ScopedMessagePipeHandle pipe1;
+
+ CreateMessagePipe(nullptr, &pipe0, &pipe1);
+
+ HandleUnionPtr handle(HandleUnion::New());
+ handle->set_f_message_pipe(pipe1.Pass());
+
+ size_t size = GetSerializedSize_(handle, false);
+ EXPECT_EQ(16U, size);
+
+ mojo::internal::FixedBuffer buf(size);
+ internal::HandleUnion_Data* data = nullptr;
+ SerializeUnion_(handle.Pass(), &buf, &data, false);
+
+ std::vector<Handle> handles;
+ data->EncodePointersAndHandles(&handles);
+ EXPECT_EQ(1U, handles.size());
+ data->DecodePointersAndHandles(&handles);
+
+ HandleUnionPtr handle2(HandleUnion::New());
+ Deserialize_(data, &handle2);
+
+ std::string golden("hello world");
+ WriteTextMessage(pipe0.get(), golden);
+
+ std::string actual;
+ ReadTextMessage(handle2->get_f_message_pipe().get(), &actual);
+
+ EXPECT_EQ(golden, actual);
+}
+
+TEST(UnionTest, HandleInUnionValidation) {
+ Environment environment;
+ ScopedMessagePipeHandle pipe0;
+ ScopedMessagePipeHandle pipe1;
+
+ CreateMessagePipe(nullptr, &pipe0, &pipe1);
+
+ HandleUnionPtr handle(HandleUnion::New());
+ handle->set_f_message_pipe(pipe1.Pass());
+
+ size_t size = GetSerializedSize_(handle, false);
+ EXPECT_EQ(16U, size);
+
+ mojo::internal::FixedBuffer buf(size);
+ internal::HandleUnion_Data* data = nullptr;
+ SerializeUnion_(handle.Pass(), &buf, &data, false);
+
+ std::vector<Handle> handles;
+ data->EncodePointersAndHandles(&handles);
+
+ void* raw_buf = buf.Leak();
+ mojo::internal::BoundsChecker bounds_checker(data,
+ static_cast<uint32_t>(size), 1);
+ EXPECT_TRUE(
+ internal::HandleUnion_Data::Validate(raw_buf, &bounds_checker, false));
+ free(raw_buf);
+}
+
+TEST(UnionTest, HandleInUnionValidationNull) {
+ Environment environment;
+ ScopedMessagePipeHandle pipe;
+ HandleUnionPtr handle(HandleUnion::New());
+ handle->set_f_message_pipe(pipe.Pass());
+
+ size_t size = GetSerializedSize_(handle, false);
+ EXPECT_EQ(16U, size);
+
+ mojo::internal::FixedBuffer buf(size);
+ internal::HandleUnion_Data* data = nullptr;
+ SerializeUnion_(handle.Pass(), &buf, &data, false);
+
+ std::vector<Handle> handles;
+ data->EncodePointersAndHandles(&handles);
+
+ void* raw_buf = buf.Leak();
+ mojo::internal::BoundsChecker bounds_checker(data,
+ static_cast<uint32_t>(size), 1);
+ EXPECT_FALSE(
+ internal::HandleUnion_Data::Validate(raw_buf, &bounds_checker, false));
+ free(raw_buf);
+}
+
} // namespace test
} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/validation_unittest.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/validation_unittest.cc
index b56580f..9b4e271 100644
--- a/third_party/mojo/src/mojo/public/cpp/bindings/tests/validation_unittest.cc
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/validation_unittest.cc
@@ -408,8 +408,8 @@ TEST_F(ValidationTest, ResponseBoundsCheck) {
// - MessageHeaderValidator
// - X::ResponseValidator_
TEST_F(ValidationIntegrationTest, InterfacePtr) {
- IntegrationTestInterfacePtr interface_ptr =
- MakeProxy<IntegrationTestInterface>(testee_endpoint().Pass());
+ IntegrationTestInterfacePtr interface_ptr = MakeProxy(
+ InterfacePtrInfo<IntegrationTestInterface>(testee_endpoint().Pass(), 0u));
interface_ptr.internal_state()->router_for_testing()->EnableTestingMode();
RunValidationTests("integration_intf_resp", test_message_receiver());
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/versioning_apptest.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/versioning_apptest.cc
new file mode 100644
index 0000000..c3629a2
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/versioning_apptest.cc
@@ -0,0 +1,121 @@
+// Copyright 2015 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/application/application_impl.h"
+#include "mojo/public/cpp/application/application_test_base.h"
+#include "mojo/public/cpp/system/macros.h"
+#include "mojo/public/interfaces/bindings/tests/versioning_test_client.mojom.h"
+
+namespace mojo {
+namespace test {
+namespace versioning {
+
+class VersioningApplicationTest : public ApplicationTestBase {
+ public:
+ VersioningApplicationTest() : ApplicationTestBase() {}
+ ~VersioningApplicationTest() override {}
+
+ protected:
+ // ApplicationTestBase overrides.
+ void SetUp() override {
+ ApplicationTestBase::SetUp();
+
+ application_impl()->ConnectToService("mojo:versioning_test_service",
+ &database_);
+ }
+
+ HumanResourceDatabasePtr database_;
+
+ private:
+ MOJO_DISALLOW_COPY_AND_ASSIGN(VersioningApplicationTest);
+};
+
+TEST_F(VersioningApplicationTest, Struct) {
+ // The service side uses a newer version of Employee defintion.
+ // The returned struct should be truncated.
+ EmployeePtr employee(Employee::New());
+ employee->employee_id = 1;
+ employee->name = "Homer Simpson";
+ employee->department = DEPARTMENT_DEV;
+
+ database_->QueryEmployee(1, true,
+ [&employee](EmployeePtr returned_employee,
+ Array<uint8_t> returned_finger_print) {
+ EXPECT_TRUE(employee->Equals(*returned_employee));
+ EXPECT_FALSE(returned_finger_print.is_null());
+ });
+ database_.WaitForIncomingMethodCall();
+
+ // Passing a struct of older version to the service side works.
+ EmployeePtr new_employee(Employee::New());
+ new_employee->employee_id = 2;
+ new_employee->name = "Marge Simpson";
+ new_employee->department = DEPARTMENT_SALES;
+
+ database_->AddEmployee(new_employee.Clone(),
+ [](bool success) { EXPECT_TRUE(success); });
+ database_.WaitForIncomingMethodCall();
+
+ database_->QueryEmployee(
+ 2, false, [&new_employee](EmployeePtr returned_employee,
+ Array<uint8_t> returned_finger_print) {
+ EXPECT_TRUE(new_employee->Equals(*returned_employee));
+ EXPECT_TRUE(returned_finger_print.is_null());
+ });
+ database_.WaitForIncomingMethodCall();
+}
+
+TEST_F(VersioningApplicationTest, QueryVersion) {
+ EXPECT_EQ(0u, database_.version());
+ database_.QueryVersion([](uint32_t version) { EXPECT_EQ(1u, version); });
+ database_.WaitForIncomingMethodCall();
+ EXPECT_EQ(1u, database_.version());
+}
+
+TEST_F(VersioningApplicationTest, RequireVersion) {
+ EXPECT_EQ(0u, database_.version());
+
+ database_.RequireVersion(1);
+ EXPECT_EQ(1u, database_.version());
+ database_->QueryEmployee(3, false,
+ [](EmployeePtr returned_employee,
+ Array<uint8_t> returned_finger_print) {});
+ database_.WaitForIncomingMethodCall();
+ EXPECT_FALSE(database_.encountered_error());
+
+ // Requiring a version higher than what the service side implements will close
+ // the pipe.
+ database_.RequireVersion(3);
+ EXPECT_EQ(3u, database_.version());
+ database_->QueryEmployee(1, false,
+ [](EmployeePtr returned_employee,
+ Array<uint8_t> returned_finger_print) {});
+ database_.WaitForIncomingMethodCall();
+ EXPECT_TRUE(database_.encountered_error());
+}
+
+TEST_F(VersioningApplicationTest, CallNonexistentMethod) {
+ EXPECT_EQ(0u, database_.version());
+
+ Array<uint8_t> new_finger_print(128);
+ for (size_t i = 0; i < 128; ++i)
+ new_finger_print[i] = i + 13;
+
+ // Although the client side doesn't know whether the service side supports
+ // version 1, calling a version 1 method succeeds as long as the service side
+ // supports version 1.
+ database_->AttachFingerPrint(1, new_finger_print.Clone(),
+ [](bool success) { EXPECT_TRUE(success); });
+ database_.WaitForIncomingMethodCall();
+
+ // Calling a version 2 method (which the service side doesn't support) closes
+ // the pipe.
+ database_->ListEmployeeIds([](Array<uint64_t> ids) { EXPECT_TRUE(false); });
+ database_.WaitForIncomingMethodCall();
+ EXPECT_TRUE(database_.encountered_error());
+}
+
+} // namespace versioning
+} // namespace examples
+} // namespace mojo
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/versioning_test_service.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/versioning_test_service.cc
new file mode 100644
index 0000000..e5d63a4
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/versioning_test_service.cc
@@ -0,0 +1,125 @@
+// Copyright 2015 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 <map>
+
+#include "mojo/public/c/system/main.h"
+#include "mojo/public/cpp/application/application_connection.h"
+#include "mojo/public/cpp/application/application_delegate.h"
+#include "mojo/public/cpp/application/application_runner.h"
+#include "mojo/public/cpp/application/interface_factory.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
+#include "mojo/public/cpp/system/macros.h"
+#include "mojo/public/interfaces/bindings/tests/versioning_test_service.mojom.h"
+
+namespace mojo {
+namespace test {
+namespace versioning {
+
+struct EmployeeInfo {
+ public:
+ EmployeeInfo() {}
+
+ EmployeePtr employee;
+ Array<uint8_t> finger_print;
+
+ private:
+ MOJO_DISALLOW_COPY_AND_ASSIGN(EmployeeInfo);
+};
+
+class HumanResourceDatabaseImpl : public HumanResourceDatabase {
+ public:
+ explicit HumanResourceDatabaseImpl(
+ InterfaceRequest<HumanResourceDatabase> request)
+ : strong_binding_(this, request.Pass()) {
+ // Pretend that there is already some data in the system.
+ EmployeeInfo* info = new EmployeeInfo();
+ employees_[1] = info;
+ info->employee = Employee::New();
+ info->employee->employee_id = 1;
+ info->employee->name = "Homer Simpson";
+ info->employee->department = DEPARTMENT_DEV;
+ info->employee->birthday = Date::New();
+ info->employee->birthday->year = 1955;
+ info->employee->birthday->month = 5;
+ info->employee->birthday->day = 12;
+ info->finger_print.resize(1024);
+ for (uint32_t i = 0; i < 1024; ++i)
+ info->finger_print[i] = i;
+ }
+
+ ~HumanResourceDatabaseImpl() override {
+ for (auto iter = employees_.begin(); iter != employees_.end(); ++iter)
+ delete iter->second;
+ }
+
+ void AddEmployee(EmployeePtr employee,
+ const AddEmployeeCallback& callback) override {
+ uint64_t id = employee->employee_id;
+ if (employees_.find(id) == employees_.end())
+ employees_[id] = new EmployeeInfo();
+ employees_[id]->employee = employee.Pass();
+ callback.Run(true);
+ }
+
+ void QueryEmployee(uint64_t id,
+ bool retrieve_finger_print,
+ const QueryEmployeeCallback& callback) override {
+ if (employees_.find(id) == employees_.end()) {
+ callback.Run(nullptr, Array<uint8_t>());
+ return;
+ }
+ callback.Run(employees_[id]->employee.Clone(),
+ retrieve_finger_print ? employees_[id]->finger_print.Clone()
+ : Array<uint8_t>());
+ }
+
+ void AttachFingerPrint(uint64_t id,
+ Array<uint8_t> finger_print,
+ const AttachFingerPrintCallback& callback) override {
+ if (employees_.find(id) == employees_.end()) {
+ callback.Run(false);
+ return;
+ }
+ employees_[id]->finger_print = finger_print.Pass();
+ callback.Run(true);
+ }
+
+ private:
+ std::map<uint64_t, EmployeeInfo*> employees_;
+
+ StrongBinding<HumanResourceDatabase> strong_binding_;
+};
+
+class HumanResourceSystemServer
+ : public ApplicationDelegate,
+ public InterfaceFactory<HumanResourceDatabase> {
+ public:
+ HumanResourceSystemServer() {}
+
+ // ApplicationDelegate implementation.
+ bool ConfigureIncomingConnection(ApplicationConnection* connection) override {
+ connection->AddService<HumanResourceDatabase>(this);
+ return true;
+ }
+
+ // InterfaceFactory<HumanResourceDatabase> implementation.
+ void Create(ApplicationConnection* connection,
+ InterfaceRequest<HumanResourceDatabase> request) override {
+ // It will be deleted automatically when the underlying pipe encounters a
+ // connection error.
+ new HumanResourceDatabaseImpl(request.Pass());
+ }
+};
+
+} // namespace versioning
+} // namespace test
+} // namespace mojo
+
+MojoResult MojoMain(MojoHandle application_request) {
+ mojo::ApplicationRunner runner(
+ new mojo::test::versioning::HumanResourceSystemServer());
+
+ return runner.Run(application_request);
+}
diff --git a/third_party/mojo/src/mojo/public/cpp/environment/logging.h b/third_party/mojo/src/mojo/public/cpp/environment/logging.h
index 2cf873a..d0fdeaf 100644
--- a/third_party/mojo/src/mojo/public/cpp/environment/logging.h
+++ b/third_party/mojo/src/mojo/public/cpp/environment/logging.h
@@ -57,6 +57,8 @@
#define MOJO_DCHECK(condition) MOJO_CHECK(condition)
#endif // NDEBUG && !defined(DCHECK_ALWAYS_ON)
+#define MOJO_NOTREACHED() MOJO_DCHECK(false)
+
namespace mojo {
namespace internal {
diff --git a/third_party/mojo/src/mojo/public/cpp/system/macros.h b/third_party/mojo/src/mojo/public/cpp/system/macros.h
index 8c79989..9836e99f 100644
--- a/third_party/mojo/src/mojo/public/cpp/system/macros.h
+++ b/third_party/mojo/src/mojo/public/cpp/system/macros.h
@@ -42,4 +42,27 @@ char(&ArraySizeHelper(const T(&array)[N]))[N];
typedef void MoveOnlyTypeForCPP03; \
\
private:
+
+// The C++ standard requires that static const members have an out-of-class
+// definition (in a single compilation unit), but MSVC chokes on this (when
+// language extensions, which are required, are enabled). (You're only likely to
+// notice the need for a definition if you take the address of the member or,
+// more commonly, pass it to a function that takes it as a reference argument --
+// probably an STL function.) This macro makes MSVC do the right thing. See
+// http://msdn.microsoft.com/en-us/library/34h23df8(v=vs.100).aspx for more
+// information. Use like:
+//
+// In .h file:
+// struct Foo {
+// static const int kBar = 5;
+// };
+//
+// In .cc file:
+// STATIC_CONST_MEMBER_DEFINITION const int Foo::kBar;
+#if defined(_MSC_VER)
+#define MOJO_STATIC_CONST_MEMBER_DEFINITION __declspec(selectany)
+#else
+#define MOJO_STATIC_CONST_MEMBER_DEFINITION
+#endif
+
#endif // MOJO_PUBLIC_CPP_SYSTEM_MACROS_H_
diff --git a/third_party/mojo/src/mojo/public/dart/src/codec.dart b/third_party/mojo/src/mojo/public/dart/src/codec.dart
index 7bc12f8..89e32c2 100644
--- a/third_party/mojo/src/mojo/public/dart/src/codec.dart
+++ b/third_party/mojo/src/mojo/public/dart/src/codec.dart
@@ -10,9 +10,7 @@ const int kAlignment = 8;
const int kSerializedHandleSize = 4;
const int kSerializedInterfaceSize = 8; // 4-byte handle + 4-byte version
const int kPointerSize = 8;
-// TODO(yzshen): In order to work with other bindings which still interprets
-// the |version| field as |num_fields|, set it to version 2 for now.
-const StructDataHeader kMapStructHeader = const StructDataHeader(24, 2);
+const StructDataHeader kMapStructHeader = const StructDataHeader(24, 0);
const int kUnspecifiedArrayLength = -1;
const int kNothingNullable = 0;
const int kArrayNullable = (1 << 0);
diff --git a/third_party/mojo/src/mojo/public/dart/src/message.dart b/third_party/mojo/src/mojo/public/dart/src/message.dart
index 3cfe2fbd..559c345 100644
--- a/third_party/mojo/src/mojo/public/dart/src/message.dart
+++ b/third_party/mojo/src/mojo/public/dart/src/message.dart
@@ -6,13 +6,9 @@ part of bindings;
class MessageHeader {
static const int kSimpleMessageSize = 16;
- // TODO(yzshen): In order to work with other bindings which still interprets
- // the |version| field as |num_fields|, set it to version 2 for now.
- static const int kSimpleMessageVersion = 2;
+ static const int kSimpleMessageVersion = 0;
static const int kMessageWithRequestIdSize = 24;
- // TODO(yzshen): In order to work with other bindings which still interprets
- // the |version| field as |num_fields|, set it to version 3 for now.
- static const int kMessageWithRequestIdVersion = 3;
+ static const int kMessageWithRequestIdVersion = 1;
static const int kMessageTypeOffset = StructDataHeader.kHeaderSize;
static const int kMessageFlagsOffset = kMessageTypeOffset + 4;
static const int kMessageRequestIdOffset = kMessageFlagsOffset + 4;
diff --git a/third_party/mojo/src/mojo/public/go/application/application_impl.go b/third_party/mojo/src/mojo/public/go/application/application_impl.go
index 43a1eb8..ac6fc75 100644
--- a/third_party/mojo/src/mojo/public/go/application/application_impl.go
+++ b/third_party/mojo/src/mojo/public/go/application/application_impl.go
@@ -47,6 +47,9 @@ type Context interface {
// should pass a list of services you want to provide to the requested
// application.
ConnectToApplication(remoteURL string, providedServices ...ServiceFactory) *OutgoingConnection
+
+ // Close closes the main run loop for this application.
+ Close()
}
// ApplicationImpl is an utility class for communicating with the Shell, and
@@ -78,8 +81,10 @@ func Run(delegate Delegate, applicationRequest system.MojoHandle) {
impl.runner = stub
for {
if err := stub.ServeRequest(); err != nil {
- // TODO(rogulenko): don't log in case message pipe was closed
- log.Println(err)
+ connectionError, ok := err.(*bindings.ConnectionError)
+ if !ok || !connectionError.Closed() {
+ log.Println(err)
+ }
impl.RequestQuit()
break
}
@@ -145,6 +150,10 @@ func (impl *ApplicationImpl) ConnectToApplication(remoteURL string, providedServ
return connection.ProvideServices(providedServices...)
}
+func (impl *ApplicationImpl) Close() {
+ impl.RequestQuit()
+}
+
// addConnection appends connections slice by a provided connection, removing
// connections that have been closed.
func (impl *ApplicationImpl) addConnection(c *Connection) {
diff --git a/third_party/mojo/src/mojo/public/go/application/connection.go b/third_party/mojo/src/mojo/public/go/application/connection.go
index 5b2c629..aa9f30b 100644
--- a/third_party/mojo/src/mojo/public/go/application/connection.go
+++ b/third_party/mojo/src/mojo/public/go/application/connection.go
@@ -111,8 +111,10 @@ func (c *Connection) ProvideServices(services ...ServiceFactory) *OutgoingConnec
go func() {
for {
if err := c.localServices.ServeRequest(); err != nil {
- // TODO(rogulenko): don't log in case message pipe was closed
- log.Println(err)
+ connectionError, ok := err.(*bindings.ConnectionError)
+ if !ok || !connectionError.Closed() {
+ log.Println(err)
+ }
break
}
}
diff --git a/third_party/mojo/src/mojo/public/go/bindings/connector.go b/third_party/mojo/src/mojo/public/go/bindings/connector.go
index 00c4cfd..9c4ee5a 100644
--- a/third_party/mojo/src/mojo/public/go/bindings/connector.go
+++ b/third_party/mojo/src/mojo/public/go/bindings/connector.go
@@ -11,6 +11,23 @@ import (
"mojo/public/go/system"
)
+var errConnectionClosed = &ConnectionError{system.MOJO_RESULT_FAILED_PRECONDITION}
+
+// ConnectionError represents a error caused by an operation on a message pipe.
+type ConnectionError struct {
+ Result system.MojoResult
+}
+
+func (e *ConnectionError) Error() string {
+ return fmt.Sprintf("message pipe error: %v", e.Result)
+}
+
+// Closed returnes true iff the error was caused by an operation on a closed
+// message pipe.
+func (e *ConnectionError) Closed() bool {
+ return e.Result == system.MOJO_RESULT_FAILED_PRECONDITION
+}
+
// Connector owns a message pipe handle. It can read and write messages
// from the message pipe waiting on it if necessary. The operation are
// thread-safe.
@@ -51,7 +68,7 @@ func (c *Connector) ReadMessage() (*Message, error) {
defer c.mu.RUnlock()
if !c.pipe.IsValid() {
- return nil, fmt.Errorf("message pipe is closed")
+ return nil, errConnectionClosed
}
// Check if we already have a message.
result, bytes, handles := c.pipe.ReadMessage(system.MOJO_READ_MESSAGE_FLAG_NONE)
@@ -61,14 +78,14 @@ func (c *Connector) ReadMessage() (*Message, error) {
case <-c.waitChan:
result, bytes, handles = c.pipe.ReadMessage(system.MOJO_READ_MESSAGE_FLAG_NONE)
if result != system.MOJO_RESULT_OK {
- return nil, fmt.Errorf("error reading message: %v", result)
+ return nil, &ConnectionError{result}
}
case <-c.done:
c.waiter.CancelWait(waitId)
- return nil, fmt.Errorf("server stub is closed")
+ return nil, errConnectionClosed
}
} else if result != system.MOJO_RESULT_OK {
- return nil, fmt.Errorf("error reading message: %v", result)
+ return nil, &ConnectionError{result}
}
return ParseMessage(bytes, handles)
}
@@ -79,7 +96,7 @@ func (c *Connector) WriteMessage(message *Message) error {
c.mu.RLock()
defer c.mu.RUnlock()
if !c.pipe.IsValid() {
- return fmt.Errorf("message pipe is closed")
+ return errConnectionClosed
}
return WriteMessage(c.pipe, message)
}
diff --git a/third_party/mojo/src/mojo/public/go/bindings/decoder.go b/third_party/mojo/src/mojo/public/go/bindings/decoder.go
index 2b12ff3..9711e23 100644
--- a/third_party/mojo/src/mojo/public/go/bindings/decoder.go
+++ b/third_party/mojo/src/mojo/public/go/bindings/decoder.go
@@ -123,7 +123,7 @@ func (d *Decoder) StartMap() error {
fmt.Sprintf("invalid map header: %v", header),
}
}
- if err := d.pushState(header, pointerBitSize); err != nil {
+ if err := d.pushState(header, 0); err != nil {
return err
}
return nil
diff --git a/third_party/mojo/src/mojo/public/go/bindings/encoder.go b/third_party/mojo/src/mojo/public/go/bindings/encoder.go
index 320f4f9..822aaa4 100644
--- a/third_party/mojo/src/mojo/public/go/bindings/encoder.go
+++ b/third_party/mojo/src/mojo/public/go/bindings/encoder.go
@@ -151,7 +151,7 @@ func (e *Encoder) StartArray(length, elementBitSize uint32) {
// Note: it doesn't write a pointer to the encoded map.
// Call |Finish()| after writing keys array and values array.
func (e *Encoder) StartMap() {
- e.pushState(mapHeader, pointerBitSize)
+ e.pushState(mapHeader, 0)
}
// StartStruct starts encoding a struct and writes its data header.
diff --git a/third_party/mojo/src/mojo/public/go/bindings/message.go b/third_party/mojo/src/mojo/public/go/bindings/message.go
index f2dce2a..adc8b31 100644
--- a/third_party/mojo/src/mojo/public/go/bindings/message.go
+++ b/third_party/mojo/src/mojo/public/go/bindings/message.go
@@ -28,7 +28,7 @@ const (
var mapHeader DataHeader
func init() {
- mapHeader = DataHeader{24, 2}
+ mapHeader = DataHeader{24, 0}
}
const (
@@ -77,7 +77,7 @@ type MessageHeader struct {
}
func (h *MessageHeader) Encode(encoder *Encoder) error {
- encoder.StartStruct(h.dataSize(), h.numFields())
+ encoder.StartStruct(h.dataSize(), h.version())
if err := encoder.WriteUint32(h.Type); err != nil {
return err
}
@@ -97,14 +97,14 @@ func (h *MessageHeader) Decode(decoder *Decoder) error {
if err != nil {
return err
}
- numFields := header.ElementsOrVersion
- if numFields < 2 || numFields > 3 {
+ version := header.ElementsOrVersion
+ if version > 1 {
return &ValidationError{UnexpectedStructHeader,
- fmt.Sprintf("invalid message header: it should have 2 or 3 fileds, but has %d", numFields),
+ fmt.Sprintf("invalid message header: it should be of version 0 or 1, but has %d", version),
}
}
expectedSize := uint32(dataHeaderSize + 2*4)
- if numFields == 3 {
+ if version == 1 {
expectedSize += 8
}
if expectedSize != header.Size {
@@ -119,7 +119,7 @@ func (h *MessageHeader) Decode(decoder *Decoder) error {
if h.Flags, err = decoder.ReadUint32(); err != nil {
return err
}
- if numFields == 3 {
+ if version == 1 {
if h.Flags != MessageExpectsResponseFlag && h.Flags != MessageIsResponseFlag {
return &ValidationError{MessageHeaderInvalidFlags,
fmt.Sprintf("message header flags(%v) should be MessageExpectsResponseFlag or MessageIsResponseFlag", h.Flags),
@@ -145,11 +145,11 @@ func (h *MessageHeader) dataSize() uint32 {
return size
}
-func (h *MessageHeader) numFields() uint32 {
+func (h *MessageHeader) version() uint32 {
if h.RequestId != 0 {
- return 3
+ return 1
} else {
- return 2
+ return 0
}
}
diff --git a/third_party/mojo/src/mojo/public/go/bindings/router.go b/third_party/mojo/src/mojo/public/go/bindings/router.go
index 6484945..1e8daba 100644
--- a/third_party/mojo/src/mojo/public/go/bindings/router.go
+++ b/third_party/mojo/src/mojo/public/go/bindings/router.go
@@ -59,7 +59,7 @@ func (w *routerWorker) readAndDispatchOutstandingMessages() error {
return nil
}
if result != system.MOJO_RESULT_OK {
- return fmt.Errorf("error reading message: %v", result)
+ return &ConnectionError{result}
}
message, err := ParseMessage(bytes, handles)
if err != nil {
@@ -88,7 +88,7 @@ func (w *routerWorker) runLoop() error {
case waitResponse := <-w.waitChan:
w.waitId = 0
if waitResponse.Result != system.MOJO_RESULT_OK {
- return fmt.Errorf("error waiting for message: %v", waitResponse.Result)
+ return &ConnectionError{waitResponse.Result}
}
case request := <-w.requestChan:
if err := WriteMessage(w.handle, request.message); err != nil {
@@ -98,7 +98,7 @@ func (w *routerWorker) runLoop() error {
w.responders[request.message.Header.RequestId] = request.responseChan
}
case <-w.done:
- return fmt.Errorf("message pipe is closed")
+ return errConnectionClosed
}
// Returns immediately without an error if still waiting for
// a new message.
@@ -164,9 +164,8 @@ func (r *Router) Accept(message *Message) error {
}
r.mu.Lock()
defer r.mu.Unlock()
- // This can also mean that the router is closed.
if !r.handle.IsValid() {
- return fmt.Errorf("can't write a message to an invalid handle")
+ return errConnectionClosed
}
r.requestChan <- routeRequest{message, nil}
return nil
@@ -221,7 +220,7 @@ func (r *Router) AcceptWithResponse(message *Message) <-chan MessageReadResult {
// is closed so that we can safely close responseChan once we close the
// router.
if !r.handle.IsValid() {
- responseChan <- MessageReadResult{nil, fmt.Errorf("can't write a message to an invalid handle")}
+ responseChan <- MessageReadResult{nil, errConnectionClosed}
return responseChan
}
r.requestChan <- routeRequest{message, responseChan}
diff --git a/third_party/mojo/src/mojo/public/go/bindings/util.go b/third_party/mojo/src/mojo/public/go/bindings/util.go
index abbedb3..3b40c64 100644
--- a/third_party/mojo/src/mojo/public/go/bindings/util.go
+++ b/third_party/mojo/src/mojo/public/go/bindings/util.go
@@ -5,7 +5,6 @@
package bindings
import (
- "fmt"
"sync/atomic"
"mojo/public/go/system"
@@ -25,7 +24,7 @@ func bytesForBits(bits uint64) int {
func WriteMessage(handle system.MessagePipeHandle, message *Message) error {
result := handle.WriteMessage(message.Bytes, message.Handles, system.MOJO_WRITE_MESSAGE_FLAG_NONE)
if result != system.MOJO_RESULT_OK {
- return fmt.Errorf("error writing message: %v", result)
+ return &ConnectionError{result}
}
return nil
}
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/interface_control_messages.mojom b/third_party/mojo/src/mojo/public/interfaces/bindings/interface_control_messages.mojom
index 78a2445..a304efc 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/interface_control_messages.mojom
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/interface_control_messages.mojom
@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+[JavaPackage="org.chromium.mojo.bindings"]
module mojo;
// For each message pipe representing a user-defined interface, some control
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/BUILD.gn b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/BUILD.gn
index 572b58a..5cdbda1 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/BUILD.gn
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/BUILD.gn
@@ -17,7 +17,22 @@ mojom("test_interfaces") {
"sample_interfaces.mojom",
"sample_service.mojom",
"serialization_test_structs.mojom",
+ "test_constants.mojom",
"test_structs.mojom",
"validation_test_interfaces.mojom",
]
}
+
+mojom("versioning_test_service_interfaces") {
+ testonly = true
+ sources = [
+ "versioning_test_service.mojom",
+ ]
+}
+
+mojom("versioning_test_client_interfaces") {
+ testonly = true
+ sources = [
+ "versioning_test_client.mojom",
+ ]
+}
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data
index 8a1bf78..c222e65 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/boundscheck_msghdr_no_such_method.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version number
+[u4]0 // version number
[u4]2 // There is no Method2
[u4]0 // flags
-[anchr]message_header \ No newline at end of file
+[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data
index 2fe7115..cf68c0e 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_incomplete_struct.data
@@ -1,2 +1,2 @@
[u4]16 // num_bytes: Bigger than the total size of the message.
-[u4]2 // version
+[u4]0 // version
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data
index 6c9654b..9f67cb9 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_invalid_flag_combo.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]0x80000000 // name
[u4]3 // flags: This combination is illegal.
[u8]1 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data
index 1c0fb45..460bb1e 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_missing_request_id.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]0x80000000 // name
[u4]1 // flags: This is a response message which expects to
// have a request ID.
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data
index a1b034c..873b392 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_no_such_method.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version number
+[u4]0 // version number
[u4]9999 // There is no Method9999.
[u4]0 // flags
-[anchr]message_header \ No newline at end of file
+[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data
index 0258aa6..641f424 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_huge.data
@@ -1,4 +1,4 @@
[u4]0xFFFFFFFF // num_bytes: Test whether a huge value will cause overflow.
-[u4]2 // version
+[u4]0 // version
[u4]0x80000000 // name
[u4]0 // flags
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data
index 47ca70a..f58eca9 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_less_than_min_requirement.data
@@ -1,4 +1,4 @@
[dist4]message_header // num_bytes: Less than the minimal size of message
// header.
-[u4]2 // version
+[u4]0 // version
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data
index 446d8f4..8f2f0d0 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_1.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]0x80000000 // name
[u4]0 // flags
[u8]0 // Extra bytes that result in mismatched |num_bytes| and
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data
index bc570f7..9bccd62 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_msghdr_num_bytes_version_mismatch_2.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]0x80000000 // name
[u4]1 // flags
[u8]0 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data
index 5937c9c..f4ec119 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]0 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data
index c03cfc6..c43be0d 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]0 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data
index d513e71..c53adde 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_incomplete_struct_header.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]0 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data
index 07cf4c1..2280e50 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]0 // name
[u4]2 // flags: kMessageIsResponse is set in a request.
[u8]1 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data
index 2b59165..4c10424d 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_invalid_request_flags2.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]0 // name
[u4]1 // flags: kMessageExpectsResponse is set in a request
// for a method that does not take a response.
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data
index 69c77c4..0c85119 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_huge.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]0 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data
index f251f469f..ff94581 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_min_requirement.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]0 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data
index 82a5695..1d3483a 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd0_struct_num_bytes_less_than_struct_header.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]0 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data
index c448072..3ee9bd2 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]10 // name
[u4]0 // flags
[anchr]message_header
@@ -11,7 +11,7 @@
[anchr]map_data_ptr
[dist4]map_data_struct_header // num_bytes
-[u4]2 // num_elements
+[u4]0 // version
[dist8]key_array_ptr
[dist8]value_array_ptr
[anchr]map_data_struct_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data
index 20d1fa4..8648b73 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_good_non_unique_keys.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]10 // name
[u4]0 // flags
[anchr]message_header
@@ -11,7 +11,7 @@
[anchr]map_data_ptr
[dist4]map_data_struct_header // num_bytes
-[u4]2 // num_elements
+[u4]0 // version
[dist8]key_array_ptr
[dist8]value_array_ptr
[anchr]map_data_struct_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data
index acfc9a7..f64c2d8 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_keys.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]10 // name
[u4]0 // flags
[anchr]message_header
@@ -11,7 +11,7 @@
[anchr]map_data_ptr
[dist4]map_data_struct_header // num_bytes
-[u4]2 // num_elements
+[u4]0 // version
[u8]0 // null keys array
[dist8]value_array_ptr
[anchr]map_data_struct_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data
index e8a7e38..e1b2015 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_null_values.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]10 // name
[u4]0 // flags
[anchr]message_header
@@ -11,7 +11,7 @@
[anchr]map_data_ptr
[dist4]map_data_struct_header // num_bytes
-[u4]2 // num_elements
+[u4]0 // version
[dist8]key_array_ptr
[u8]0 // null values array
[anchr]map_data_struct_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data
index 95992ce..23b611bc 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_one_null_key.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]10 // name
[u4]0 // flags
[anchr]message_header
@@ -11,7 +11,7 @@
[anchr]map_data_ptr
[dist4]map_data_struct_header // num_bytes
-[u4]2 // num_elements
+[u4]0 // version
[dist8]key_array_ptr
[dist8]value_array_ptr
[anchr]map_data_struct_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data
index ae963b9..b34b7cc 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd10_unequal_array_size.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]10 // name
[u4]0 // flags
[anchr]message_header
@@ -11,7 +11,7 @@
[anchr]map_data_ptr
[dist4]map_data_struct_header // num_bytes
-[u4]2 // num_elements
+[u4]0 // version
[dist8]key_array_ptr
[dist8]value_array_ptr
[anchr]map_data_struct_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data
index eac400f..b8509da 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version0.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]11 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data
index 8b51198..de3bb87 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version1.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]11 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data
index ba29b93..0c97365 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version2.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]11 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data
index 974b42bf..50e3b01 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version3.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]11 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data
index 9bab37c..d8e3bba 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_1.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]11 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data
index fd813ba..9c38795 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_good_version_newer_than_known_2.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]11 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data
index 21b4b56..63c3794 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_1.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]11 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data
index f331bd8..ebc8843 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd11_num_bytes_version_mismatch_2.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]11 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data
index 1c80196..69d3317 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd12_invalid_request_flags.data
@@ -1,7 +1,7 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]12 // name
-[u4]0 // flags: kMessageExpectsResponse is not set but
+[u4]0 // flags: kMessageExpectsResponse is not set but
// expected.
[u8]1 // request_id
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data
index 7c8d29c..e0370bf 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_1.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]13 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data
index 925e929..5c28a8b 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd13_good_2.data
@@ -1,7 +1,7 @@
[handles]2
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]13 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data
index c845b5c..e6acb56 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]1 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data
index 03ae712..8e362b8 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_misaligned_struct.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]1 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data
index 3bab933..a1886bc 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_struct_pointer_overflow.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]1 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data
index 96cf7b6..041ec94 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd1_unexpected_null_struct.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]1 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data
index 2591872..b7f6645 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]2 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data
index 43de033..4e02c06 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_multiple_pointers_to_same_struct.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]2 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data
index 01ab21b..cb01bc6 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_overlapped_objects.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]2 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data
index 8a449da..a00836b 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd2_wrong_layout_order.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]2 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data
index 4616019..87b5b14 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_huge.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]3 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data
index 901fec8..8971e7e 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_array_header.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]3 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data
index f5b87bc..c627a37 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_num_bytes_less_than_necessary_size.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]3 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data
index e5d78b6..54dae8f 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_array_pointer_overflow.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]3 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data
index e24cbcf..40d8464 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]3 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data
index 9cb7e86..06c95b9 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]3 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data
index e4db80e..fb19735 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_incomplete_array_header.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]3 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data
index a3e39f6..9d640b2 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_misaligned_array.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]3 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data
index 9481bb5..99b7284 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd3_unexpected_null_array.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]3 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data
index 4144b1e..b91f4d1 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]4 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data
index af54c56..385deaa 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_multiple_pointers_to_same_array.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]4 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data
index afd6d5d..108c086 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_overlapped_objects.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]4 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data
index ecf0e9e..c2326dd 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd4_wrong_layout_order.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]4 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data
index efd5850..d6a0058 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_good.data
@@ -1,7 +1,7 @@
[handles]10 // Larger than the number of handles that we know about is okay.
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]5 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data
index dd65b7d..83458db 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_handle_out_of_range.data
@@ -1,7 +1,7 @@
[handles]10
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]5 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data
index 56c824e..fecb1a2 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_1.data
@@ -1,7 +1,7 @@
[handles]10
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]5 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data
index b712ec5..b4ddbca 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_multiple_handles_with_same_value_2.data
@@ -1,7 +1,7 @@
[handles]10
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]5 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data
index 7463d92..2d601b6 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_unexpected_invalid_handle.data
@@ -1,7 +1,7 @@
[handles]5
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]5 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data
index ee585af..c84315e 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd5_wrong_handle_order.data
@@ -1,7 +1,7 @@
[handles]10
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]5 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data
index 1d28d4d..c54cd90 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]6 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data
index fff99ab..98858d8 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd6_nested_array_num_bytes_less_than_necessary_size.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]6 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data
index c03f230..0d3e251 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]7 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data
index 71c3a35..372163d 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unexpected_null_fixed_array.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]7 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data
index 7ff1f6b..7d9743c 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]7 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data
index 61421b3..48e974e 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd7_unmatched_array_elements_nested.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]7 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data
index 19b4c6b..53647e9 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_array_num_bytes_overflow.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]8 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data
index ea04f41..3385b3b 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]8 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data
index 933fe2a..4c3a442 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_array.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]8 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data
index fcce197..f569f82 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd8_unexpected_null_string.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]8 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data
index 76468f3..f9f0e2c 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good.data
@@ -1,7 +1,7 @@
[handles]4
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]9 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data
index 50aec2b..fb97142 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_good_null_array.data
@@ -1,7 +1,7 @@
[handles]4
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]9 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data
index 2025a88..5d44455 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/conformance_mthd9_unexpected_null_array.data
@@ -1,7 +1,7 @@
[handles]4
[dist4]message_header // num_bytes
-[u4]2 // version
+[u4]0 // version
[u4]9 // name
[u4]0 // flags
[anchr]message_header
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data
index 91c21aa..f86dd77 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]0 // name
[u4]2 // flags kMessageIsResponse
[u8]1 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data
index 0275c14..492528d 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_resp_mthd0_unexpected_array_header.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]0 // name
[u4]2 // flags kMessageIsResponse
[u8]1 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data
index 8428b91b..61aa6f7 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_good.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]0 // name
[u4]1 // flags kMessageExpectsResponse
[u8]7 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data
index ad410ba..50e0eb1 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_intf_rqst_mthd0_unexpected_struct_header.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]0 // name
[u4]1 // flags kMessageExpectsResponse
[u8]7 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data
index c75c7a5..8e689c7 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/integration_msghdr_invalid_flags.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]0xffffffff // name
[u4]3 // flags: This combination is illegal.
[u8]1 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data
index e4953a4..f11dab3 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_boundscheck_msghdr_no_such_method.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]1 // name: Method1 does not have a response message.
[u4]2 // flags: kMessageIsResponse
[u8]1 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data
index d9ca38e..9fca174 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags1.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]12 // name
[u4]0 // flags: kMessageIsResponse is not set in a response.
[u8]1 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data
index 7587fc5..96661f6 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_invalid_response_flags2.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]12 // name
[u4]1 // flags: kMessageExpectsResponse is set in a response.
[u8]1 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data
index cc9cc8b..6833881 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/data/validation/resp_conformance_msghdr_no_such_method.data
@@ -1,5 +1,5 @@
[dist4]message_header // num_bytes
-[u4]3 // version
+[u4]1 // version
[u4]11 // name: Method11 does not have a response message.
[u4]2 // flags: kMessageIsResponse
[u8]1 // request_id
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/sample_service.mojom b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/sample_service.mojom
index 700481c..aad7c8d 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/sample_service.mojom
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/sample_service.mojom
@@ -9,15 +9,6 @@ import "sample_import.mojom";
import "sample_import2.mojom";
const uint8 kTwelve = 12;
-const uint64 kTooBigForSignedInt64 = 9999999999999999999;
-
-const double kDoubleInfinity = double.INFINITY;
-const double kDoubleNegativeInfinity = double.NEGATIVE_INFINITY;
-const double kDoubleNaN = double.NAN;
-
-const float kFloatInfinity = float.INFINITY;
-const float kFloatNegativeInfinity = float.NEGATIVE_INFINITY;
-const float kFloatNaN = float.NAN;
struct Bar {
enum Type {
@@ -32,7 +23,6 @@ struct Bar {
Type type@3 = sample.Bar.Type.VERTICAL;
};
-[RequiredFields=7]
struct Foo {
const string kFooby = "Fooby";
string name@8 = kFooby;
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_constants.mojom b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_constants.mojom
new file mode 100644
index 0000000..462d512
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_constants.mojom
@@ -0,0 +1,53 @@
+// Copyright 2015 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.
+
+[JavaPackage="org.chromium.mojo.bindings.test.mojom.test_constants"]
+module mojo.test;
+
+// Integral types.
+const bool kBoolValue = true;
+
+const int8 kInt8Value = -2;
+
+// In the range of (MAX_INT8, MAX_UINT8].
+const uint8 kUint8Value = 128;
+
+// In the range of [MIN_INT16, MIN_INT8).
+const int16 kInt16Value = -233;
+
+// In the range of (MAX_INT16, MAX_UINT16].
+const uint16 kUint16Value = 44204;
+
+// In the range of [MIN_INT32, MIN_INT16).
+const int32 kInt32Value = -44204;
+
+// In the range of (MAX_INT32, MAX_UINT32].
+const uint32 kUint32Value = 4294967295;
+
+// In the range of [MIN_INT64, MIN_INT32).
+const int64 kInt64Value = -9223372036854775807;
+
+// In the range of (MAX_INT64, MAX_UINT64].
+const uint64 kUint64Value = 9999999999999999999;
+
+// Floating point types.
+const double kDoubleValue = 3.14159;
+const double kDoubleInfinity = double.INFINITY;
+const double kDoubleNegativeInfinity = double.NEGATIVE_INFINITY;
+const double kDoubleNaN = double.NAN;
+
+const float kFloatValue = 2.71828;
+const float kFloatInfinity = float.INFINITY;
+const float kFloatNegativeInfinity = float.NEGATIVE_INFINITY;
+const float kFloatNaN = float.NAN;
+
+struct StructWithConstants {
+ const int8 kInt8Value = 5;
+ const float kFloatValue = 765.432;
+};
+
+interface InterfaceWithConstants {
+ const uint32 kUint32Value = 20100722;
+ const double kDoubleValue = 12.34567;
+};
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_structs.mojom b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_structs.mojom
index 69c94ee..adebff8 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_structs.mojom
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_structs.mojom
@@ -138,6 +138,9 @@ struct MapValueTypes {
map<string, Rect?> f6;
map<string, map<string, string>> f7;
map<string, array<map<string, string>>> f8;
+ map<string, handle> f9;
+ map<string, array<handle>> f10;
+ map<string, map<string, handle>> f11;
};
// Used to verify that various array types can be encoded and decoded
@@ -349,3 +352,14 @@ struct MultiVersionStructV7 {
[MinVersion=7]
bool f_bool;
};
+
+// Used to verify that interfaces that are struct members can be defined in the
+// same file.
+
+interface SomeInterface {
+ SomeMethod(RectPair pair) => (RectPair other_pair);
+};
+
+struct ContainsInterface {
+ SomeInterface some_interface;
+};
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_unions.mojom b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_unions.mojom
index cda5be4..4e7a540d 100644
--- a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_unions.mojom
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/test_unions.mojom
@@ -4,6 +4,10 @@
module mojo.test;
+enum AnEnum {
+ FIRST, SECOND
+};
+
union PodUnion {
int8 f_int8;
int8 f_int8_other;
@@ -17,6 +21,7 @@ union PodUnion {
float f_float;
double f_double;
bool f_bool;
+ AnEnum f_enum;
};
union ObjectUnion {
@@ -26,6 +31,15 @@ union ObjectUnion {
DummyStruct? f_nullable;
array<int8> f_array_int8;
map<string, int8> f_map_int8;
+ PodUnion f_pod_union;
+};
+
+union HandleUnion {
+ handle f_handle;
+ handle<message_pipe> f_message_pipe;
+ handle<data_pipe_consumer> f_data_pipe_consumer;
+ handle<data_pipe_producer> f_data_pipe_producer;
+ handle<shared_buffer> f_shared_buffer;
};
struct DummyStruct {
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom
new file mode 100644
index 0000000..f0136db
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/versioning_test_client.mojom
@@ -0,0 +1,34 @@
+// Copyright 2015 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.
+
+module mojo.test.versioning;
+
+// versioning_test_service.mojom and versioning_test_client.mojom contain
+// different versions of Mojom definitions for a fictitious human resource
+// management system. They are used to test the versioning mechanism.
+
+enum Department {
+ SALES,
+ DEV
+};
+
+struct Employee {
+ uint64 employee_id;
+ string name;
+ Department department;
+};
+
+interface HumanResourceDatabase {
+ AddEmployee(Employee employee) => (bool success);
+
+ QueryEmployee(uint64 id, [MinVersion=1] bool retrieve_finger_print)
+ => (Employee? employee, [MinVersion=1] array<uint8>? finger_print);
+
+ [MinVersion=1]
+ AttachFingerPrint(uint64 id, array<uint8> finger_print)
+ => (bool success);
+
+ [MinVersion=2]
+ ListEmployeeIds() => (array<uint64>? ids);
+};
diff --git a/third_party/mojo/src/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom
new file mode 100644
index 0000000..59b3832
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/interfaces/bindings/tests/versioning_test_service.mojom
@@ -0,0 +1,38 @@
+// Copyright 2015 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.
+
+module mojo.test.versioning;
+
+// versioning_test_service.mojom and versioning_test_client.mojom contain
+// different versions of Mojom definitions for a fictitious human resource
+// management system. They are used to test the versioning mechanism.
+
+enum Department {
+ SALES,
+ DEV
+};
+
+struct Date {
+ uint16 year;
+ uint8 month;
+ uint8 day;
+};
+
+struct Employee {
+ uint64 employee_id;
+ string name;
+ Department department;
+ [MinVersion=1] Date? birthday;
+};
+
+interface HumanResourceDatabase {
+ AddEmployee(Employee employee) => (bool success);
+
+ QueryEmployee(uint64 id, [MinVersion=1] bool retrieve_finger_print)
+ => (Employee? employee, [MinVersion=1] array<uint8>? finger_print);
+
+ [MinVersion=1]
+ AttachFingerPrint(uint64 id, array<uint8> finger_print)
+ => (bool success);
+};
diff --git a/third_party/mojo/src/mojo/public/java/BUILD.gn b/third_party/mojo/src/mojo/public/java/BUILD.gn
index 4abfc3c..f797229 100644
--- a/third_party/mojo/src/mojo/public/java/BUILD.gn
+++ b/third_party/mojo/src/mojo/public/java/BUILD.gn
@@ -36,6 +36,7 @@ android_library("bindings") {
"bindings/src/org/chromium/mojo/bindings/Encoder.java",
"bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java",
"bindings/src/org/chromium/mojo/bindings/HandleOwner.java",
+ "bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java",
"bindings/src/org/chromium/mojo/bindings/Interface.java",
"bindings/src/org/chromium/mojo/bindings/InterfaceRequest.java",
"bindings/src/org/chromium/mojo/bindings/MessageHeader.java",
@@ -53,6 +54,8 @@ android_library("bindings") {
deps = [
":system",
]
+
+ srcjar_deps = [ "../interfaces/bindings:bindings_java_sources" ]
}
android_library("application") {
diff --git a/third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationDelegate.java b/third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationDelegate.java
index 61f39da..72b1c62 100644
--- a/third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationDelegate.java
+++ b/third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationDelegate.java
@@ -24,12 +24,10 @@ public interface ApplicationDelegate {
* This method is used to configure what services a connection supports when being connected to.
* Return false to reject the connection entirely.
*
- * @param requestorUrl URL of the application requesting service.
* @param connection A handle to the connection.
* @return If this application accepts any incoming connection.
*/
- public boolean configureIncomingConnection(
- String requestorUrl, ApplicationConnection connection);
+ public boolean configureIncomingConnection(ApplicationConnection connection);
/**
* Called before exiting. After returning from this call, the delegate cannot expect RunLoop to
diff --git a/third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationImpl.java b/third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationImpl.java
index 2676f38..7768b8d 100644
--- a/third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationImpl.java
+++ b/third_party/mojo/src/mojo/public/java/application/src/org/chromium/mojo/application/ApplicationImpl.java
@@ -42,8 +42,7 @@ class ApplicationImpl implements Application {
ServiceProvider exposedServices, String connectionUrl) {
ApplicationConnection connection =
new ApplicationConnection(requestorUrl, exposedServices, connectionUrl);
- if (services != null
- && mApplicationDelegate.configureIncomingConnection(requestorUrl, connection)) {
+ if (services != null && mApplicationDelegate.configureIncomingConnection(connection)) {
ServiceProvider.MANAGER.bind(connection.getLocalServiceProvider(), services);
mIncomingConnections.add(connection);
} else {
diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java
index 6320320..169edcb 100644
--- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java
+++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/BindingsHelper.java
@@ -38,7 +38,7 @@ public class BindingsHelper {
/**
* The header for a serialized map element.
*/
- public static final DataHeader MAP_STRUCT_HEADER = new DataHeader(24, 2);
+ public static final DataHeader MAP_STRUCT_HEADER = new DataHeader(24, 0);
/**
* The value used for the expected length of a non-fixed size array.
diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java
index 1d2404b..d4e44eb 100644
--- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java
+++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Connector.java
@@ -196,7 +196,7 @@ public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle
* Read all available messages on the owned message pipe.
*/
private void readOutstandingMessages() {
- int result;
+ ResultAnd<Boolean> result;
do {
try {
result = readAndDispatchMessage(mMessagePipeHandle, mIncomingMessageReceiver);
@@ -204,11 +204,11 @@ public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle
onError(e);
return;
}
- } while (result == MojoResult.OK);
- if (result == MojoResult.SHOULD_WAIT) {
+ } while (result.getValue());
+ if (result.getMojoResult() == MojoResult.SHOULD_WAIT) {
registerAsyncWaiterForRead();
} else {
- onError(new MojoException(result));
+ onError(new MojoException(result.getMojoResult()));
}
}
@@ -226,12 +226,13 @@ public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle
* @param receiver The {@link MessageReceiver} that will receive the read {@link Message}. Can
* be <code>null</code>, in which case the message is discarded.
*/
- static int readAndDispatchMessage(MessagePipeHandle handle, MessageReceiver receiver) {
+ static ResultAnd<Boolean> readAndDispatchMessage(
+ MessagePipeHandle handle, MessageReceiver receiver) {
// TODO(qsr) Allow usage of a pool of pre-allocated buffer for performance.
ResultAnd<ReadMessageResult> result =
handle.readMessage(null, 0, MessagePipeHandle.ReadFlags.NONE);
if (result.getMojoResult() != MojoResult.RESOURCE_EXHAUSTED) {
- return result.getMojoResult();
+ return new ResultAnd<Boolean>(result.getMojoResult(), false);
}
ReadMessageResult readResult = result.getValue();
assert readResult != null;
@@ -239,8 +240,9 @@ public class Connector implements MessageReceiver, HandleOwner<MessagePipeHandle
result = handle.readMessage(
buffer, readResult.getHandlesCount(), MessagePipeHandle.ReadFlags.NONE);
if (receiver != null && result.getMojoResult() == MojoResult.OK) {
- receiver.accept(new Message(buffer, result.getValue().getHandles()));
+ boolean accepted = receiver.accept(new Message(buffer, result.getValue().getHandles()));
+ return new ResultAnd<Boolean>(result.getMojoResult(), accepted);
}
- return result.getMojoResult();
+ return new ResultAnd<Boolean>(result.getMojoResult(), false);
}
}
diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
index b73ec043..81cbc98 100644
--- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
+++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Decoder.java
@@ -432,12 +432,12 @@ public class Decoder {
*/
public <P extends Proxy> P readServiceInterface(int offset, boolean nullable,
Interface.Manager<?, P> manager) {
- // Ignore the version field for now. Only read the handle field.
MessagePipeHandle handle = readMessagePipeHandle(offset, nullable);
if (!handle.isValid()) {
return null;
}
- return manager.attachProxy(handle);
+ int version = readInt(offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
+ return manager.attachProxy(handle, version);
}
/**
@@ -589,8 +589,8 @@ public class Decoder {
if (d == null) {
return null;
}
- DataHeader si = d.readDataHeaderForArray(BindingsHelper.SERIALIZED_INTERFACE_SIZE,
- expectedLength);
+ DataHeader si =
+ d.readDataHeaderForArray(BindingsHelper.SERIALIZED_INTERFACE_SIZE, expectedLength);
S[] result = manager.buildArray(si.elementsOrVersion);
for (int i = 0; i < result.length; ++i) {
// This cast is necessary because java 6 doesn't handle wildcard correctly when using
diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java
index 23a6188..c820ac5 100644
--- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java
+++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java
@@ -250,10 +250,9 @@ public class Encoder {
*/
public <T extends Interface> void encode(T v, int offset, boolean nullable,
Interface.Manager<T, ?> manager) {
- // Set the version field to 0 for now.
- encode(0, offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
if (v == null) {
encodeInvalidHandle(offset, nullable);
+ encode(0, offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
return;
}
if (mEncoderState.core == null) {
@@ -266,6 +265,7 @@ public class Encoder {
if (handler.getMessageReceiver() instanceof HandleOwner) {
encode(((HandleOwner<?>) handler.getMessageReceiver()).passHandle(), offset,
nullable);
+ encode(handler.getVersion(), offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
return;
}
// If the proxy is not over a message pipe, the default case applies.
@@ -274,6 +274,7 @@ public class Encoder {
mEncoderState.core.createMessagePipe(null);
manager.bind(v, handles.first);
encode(handles.second, offset, nullable);
+ encode(manager.getVersion(), offset + BindingsHelper.SERIALIZED_HANDLE_SIZE);
}
/**
diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
index 4c828db..93fde9f 100644
--- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
+++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
@@ -4,6 +4,8 @@
package org.chromium.mojo.bindings;
+import org.chromium.mojo.bindings.Callbacks.Callback1;
+import org.chromium.mojo.bindings.Interface.AbstractProxy.HandlerImpl;
import org.chromium.mojo.system.Core;
import org.chromium.mojo.system.MessagePipeHandle;
import org.chromium.mojo.system.MojoException;
@@ -38,6 +40,29 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
* Sets the {@link ConnectionErrorHandler} that will be notified of errors.
*/
public void setErrorHandler(ConnectionErrorHandler errorHandler);
+
+ /**
+ * Returns the version number of the interface that the remote side supports.
+ */
+ public int getVersion();
+
+ /**
+ * Queries the max version that the remote side supports. On completion, the result will
+ * be returned as the input of |callback|. The version number of this interface pointer
+ * will also be updated.
+ */
+ public void queryVersion(Callback1<Integer> callback);
+
+ /**
+ * If the remote side doesn't support the specified version, it will close its end of
+ * the message pipe asynchronously. The call does nothing if |version| is no greater
+ * than getVersion().
+ * <p>
+ * If you make a call to requireVersion() with a version number X which is not supported
+ * by the remote side, it is guaranteed that all calls to the interface methods after
+ * requireVersion(X) will be ignored.
+ */
+ public void requireVersion(int version);
}
/**
@@ -71,6 +96,11 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
private ConnectionErrorHandler mErrorHandler = null;
/**
+ * The currently known version of the interface.
+ */
+ private int mVersion = 0;
+
+ /**
* Constructor.
*
* @param core the Core implementation used to create pipes and access the async waiter.
@@ -81,6 +111,10 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
this.mMessageReceiver = messageReceiver;
}
+ void setVersion(int version) {
+ mVersion = version;
+ }
+
/**
* Returns the message receiver to send message to.
*/
@@ -120,6 +154,52 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
public void close() {
mMessageReceiver.close();
}
+
+ /**
+ * @see Handler#getVersion()
+ */
+ @Override
+ public int getVersion() {
+ return mVersion;
+ }
+
+ /**
+ * @see Handler#queryVersion(org.chromium.mojo.bindings.Callbacks.Callback1)
+ */
+ @Override
+ public void queryVersion(final Callback1<Integer> callback) {
+ RunMessageParams message = new RunMessageParams();
+ message.reserved0 = 16;
+ message.reserved1 = 0;
+ message.queryVersion = new QueryVersion();
+
+ InterfaceControlMessagesHelper.sendRunMessage(getCore(), getMessageReceiver(),
+ message, new Callback1<RunResponseMessageParams>() {
+ @Override
+ public void call(RunResponseMessageParams response) {
+ mVersion = response.queryVersionResult.version;
+ callback.call(mVersion);
+ }
+ });
+ }
+
+ /**
+ * @see Handler#requireVersion(int)
+ */
+ @Override
+ public void requireVersion(int version) {
+ if (mVersion >= version) {
+ return;
+ }
+ mVersion = version;
+ RunOrClosePipeMessageParams message = new RunOrClosePipeMessageParams();
+ message.reserved0 = 16;
+ message.reserved1 = 0;
+ message.requireVersion = new RequireVersion();
+ message.requireVersion.version = version;
+ InterfaceControlMessagesHelper.sendRunOrClosePipeMessage(
+ getCore(), getMessageReceiver(), message);
+ }
}
/**
@@ -225,6 +305,11 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
public abstract String getName();
/**
+ * Returns the version of the managed interface.
+ */
+ public abstract int getVersion();
+
+ /**
* Binds the given implementation to the handle.
*/
public void bind(I impl, MessagePipeHandle handle) {
@@ -245,15 +330,16 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
/**
* Returns a Proxy that will send messages to the given |handle|. This implies that the
- * other end of the handle must be binded to an implementation of the interface.
+ * other end of the handle must be bound to an implementation of the interface.
*/
- public final P attachProxy(MessagePipeHandle handle) {
+ public final P attachProxy(MessagePipeHandle handle, int version) {
RouterImpl router = new RouterImpl(handle);
P proxy = attachProxy(handle.getCore(), router);
DelegatingConnectionErrorHandler handlers = new DelegatingConnectionErrorHandler();
handlers.addConnectionErrorHandler(proxy);
router.setErrorHandler(handlers);
router.start();
+ ((HandlerImpl) proxy.getProxyHandler()).setVersion(version);
return proxy;
}
@@ -264,7 +350,7 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
*/
public final Pair<P, InterfaceRequest<I>> getInterfaceRequest(Core core) {
Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
- P proxy = attachProxy(handles.first);
+ P proxy = attachProxy(handles.first, 0);
return Pair.create(proxy, new InterfaceRequest<I>(handles.second));
}
diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java
new file mode 100644
index 0000000..939fb93
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/InterfaceControlMessagesHelper.java
@@ -0,0 +1,89 @@
+// Copyright 2015 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.
+
+package org.chromium.mojo.bindings;
+
+import org.chromium.mojo.bindings.Callbacks.Callback1;
+import org.chromium.mojo.bindings.Interface.Manager;
+import org.chromium.mojo.bindings.Interface.Proxy;
+import org.chromium.mojo.system.Core;
+
+/**
+ * Helper class to handle interface control messages. See
+ * mojo/public/interfaces/bindings/interface_control_messages.mojom.
+ */
+public class InterfaceControlMessagesHelper {
+ /**
+ * MessageReceiver that forwards a message containing a {@link RunResponseMessageParams} to a
+ * callback.
+ */
+ private static class RunResponseForwardToCallback
+ extends SideEffectFreeCloseable implements MessageReceiver {
+ private final Callback1<RunResponseMessageParams> mCallback;
+
+ RunResponseForwardToCallback(Callback1<RunResponseMessageParams> callback) {
+ mCallback = callback;
+ }
+
+ /**
+ * @see MessageReceiver#accept(Message)
+ */
+ @Override
+ public boolean accept(Message message) {
+ RunResponseMessageParams response =
+ RunResponseMessageParams.deserialize(message.asServiceMessage().getPayload());
+ mCallback.call(response);
+ return true;
+ }
+ }
+
+ /**
+ * Sends the given run message through the receiver, registering the callback.
+ */
+ public static void sendRunMessage(Core core, MessageReceiverWithResponder receiver,
+ RunMessageParams params, Callback1<RunResponseMessageParams> callback) {
+ Message message = params.serializeWithHeader(
+ core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
+ MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0));
+ receiver.acceptWithResponder(message, new RunResponseForwardToCallback(callback));
+ }
+
+ /**
+ * Sends the given run or close pipe message through the receiver.
+ */
+ public static void sendRunOrClosePipeMessage(
+ Core core, MessageReceiverWithResponder receiver, RunOrClosePipeMessageParams params) {
+ Message message = params.serializeWithHeader(core,
+ new MessageHeader(InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID));
+ receiver.accept(message);
+ }
+
+ /**
+ * Handles a received run message.
+ */
+ public static <I extends Interface, P extends Proxy> boolean handleRun(
+ Core core, Manager<I, P> manager, ServiceMessage message, MessageReceiver responder) {
+ RunResponseMessageParams response = new RunResponseMessageParams();
+ response.reserved0 = 16;
+ response.reserved1 = 0;
+ response.queryVersionResult = new QueryVersionResult();
+ response.queryVersionResult.version = manager.getVersion();
+
+ return responder.accept(response.serializeWithHeader(
+ core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
+ MessageHeader.MESSAGE_IS_RESPONSE_FLAG,
+ message.getHeader().getRequestId())));
+ }
+
+ /**
+ * Handles a received run or close pipe message. Closing the pipe is handled by returning
+ * |false|.
+ */
+ public static <I extends Interface, P extends Proxy> boolean handleRunOrClosePipe(
+ Manager<I, P> manager, ServiceMessage message) {
+ Message payload = message.getPayload();
+ RunOrClosePipeMessageParams query = RunOrClosePipeMessageParams.deserialize(payload);
+ return query.requireVersion.version <= manager.getVersion();
+ }
+}
diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java
index 34f3d14..a908698 100644
--- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java
+++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/MessageHeader.java
@@ -14,12 +14,12 @@ import java.nio.ByteBuffer;
public class MessageHeader {
private static final int SIMPLE_MESSAGE_SIZE = 16;
- private static final int SIMPLE_MESSAGE_VERSION = 2;
+ private static final int SIMPLE_MESSAGE_VERSION = 0;
private static final DataHeader SIMPLE_MESSAGE_STRUCT_INFO =
new DataHeader(SIMPLE_MESSAGE_SIZE, SIMPLE_MESSAGE_VERSION);
private static final int MESSAGE_WITH_REQUEST_ID_SIZE = 24;
- private static final int MESSAGE_WITH_REQUEST_ID_VERSION = 3;
+ private static final int MESSAGE_WITH_REQUEST_ID_VERSION = 1;
private static final DataHeader MESSAGE_WITH_REQUEST_ID_STRUCT_INFO =
new DataHeader(MESSAGE_WITH_REQUEST_ID_SIZE, MESSAGE_WITH_REQUEST_ID_VERSION);
diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
index 5f070d3..815d79e 100644
--- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
+++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
@@ -5,10 +5,12 @@
package org.chromium.mojo.bindings;
import org.chromium.mojo.system.AsyncWaiter;
+import org.chromium.mojo.system.Core;
import org.chromium.mojo.system.MessagePipeHandle;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.Executor;
/**
* Implementation of {@link Router}.
@@ -29,7 +31,7 @@ public class RouterImpl implements Router {
}
/**
- * @see org.chromium.mojo.bindings.MessageReceiver#close()
+ * @see MessageReceiver#close()
*/
@Override
public void close() {
@@ -39,6 +41,43 @@ public class RouterImpl implements Router {
}
/**
+ *
+ * {@link MessageReceiver} used to return responses to the caller.
+ */
+ class ResponderThunk implements MessageReceiver {
+ private boolean mAcceptWasInvoked = false;
+
+ /**
+ * @see
+ * MessageReceiver#accept(Message)
+ */
+ @Override
+ public boolean accept(Message message) {
+ mAcceptWasInvoked = true;
+ return RouterImpl.this.accept(message);
+ }
+
+ /**
+ * @see MessageReceiver#close()
+ */
+ @Override
+ public void close() {
+ RouterImpl.this.close();
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ if (!mAcceptWasInvoked) {
+ // We close the pipe here as a way of signaling to the calling application that an
+ // error condition occurred. Without this the calling application would have no
+ // way of knowing it should stop waiting for a response.
+ RouterImpl.this.closeOnHandleThread();
+ }
+ super.finalize();
+ }
+ }
+
+ /**
* The {@link Connector} which is connected to the handle.
*/
private final Connector mConnector;
@@ -60,6 +99,13 @@ public class RouterImpl implements Router {
private Map<Long, MessageReceiver> mResponders = new HashMap<Long, MessageReceiver>();
/**
+ * An Executor that will run on the thread associated with the MessagePipe to which
+ * this Router is bound. This may be {@code Null} if the MessagePipeHandle passed
+ * in to the constructor is not valid.
+ */
+ private final Executor mExecutor;
+
+ /**
* Constructor that will use the default {@link AsyncWaiter}.
*
* @param messagePipeHandle The {@link MessagePipeHandle} to route message for.
@@ -78,6 +124,12 @@ public class RouterImpl implements Router {
public RouterImpl(MessagePipeHandle messagePipeHandle, AsyncWaiter asyncWaiter) {
mConnector = new Connector(messagePipeHandle, asyncWaiter);
mConnector.setIncomingMessageReceiver(new HandleIncomingMessageThunk());
+ Core core = messagePipeHandle.getCore();
+ if (core != null) {
+ mExecutor = ExecutorFactory.getExecutorForCurrentThread(core);
+ } else {
+ mExecutor = null;
+ }
}
/**
@@ -164,7 +216,7 @@ public class RouterImpl implements Router {
MessageHeader header = message.asServiceMessage().getHeader();
if (header.hasFlag(MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG)) {
if (mIncomingMessageReceiver != null) {
- return mIncomingMessageReceiver.acceptWithResponder(message, this);
+ return mIncomingMessageReceiver.acceptWithResponder(message, new ResponderThunk());
}
// If we receive a request expecting a response when the client is not
// listening, then we have no choice but to tear down the pipe.
@@ -192,4 +244,21 @@ public class RouterImpl implements Router {
mIncomingMessageReceiver.close();
}
}
+
+ /**
+ * Invokes {@link #close()} asynchronously on the thread associated with
+ * this Router's Handle. If this Router was constructed with an invalid
+ * handle then this method does nothing.
+ */
+ private void closeOnHandleThread() {
+ if (mExecutor != null) {
+ mExecutor.execute(new Runnable() {
+
+ @Override
+ public void run() {
+ close();
+ }
+ });
+ }
+ }
}
diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java
index d7369fa..16ae801 100644
--- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java
+++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Struct.java
@@ -85,16 +85,25 @@ public abstract class Struct {
protected final int mEncodedBaseSize;
/**
+ * The version of the struct.
+ */
+ private final int mVersion;
+
+ /**
* Constructor.
*/
- protected Struct(int encodedBaseSize) {
- this.mEncodedBaseSize = encodedBaseSize;
+ protected Struct(int encodedBaseSize, int version) {
+ mEncodedBaseSize = encodedBaseSize;
+ mVersion = version;
}
/**
- * Use the given encoder to serialized this struct.
+ * Returns the version of the struct. It is the max version of the struct in the mojom if it has
+ * been created locally, and the version of the received struct if it has been deserialized.
*/
- protected abstract void encode(Encoder encoder);
+ public int getVersion() {
+ return mVersion;
+ }
/**
* Returns the serialization of the struct. This method can close Handles.
@@ -122,4 +131,8 @@ public abstract class Struct {
return new ServiceMessage(encoder.getMessage(), header);
}
+ /**
+ * Use the given encoder to serialize this struct.
+ */
+ protected abstract void encode(Encoder encoder);
}
diff --git a/third_party/mojo/src/mojo/public/js/codec.js b/third_party/mojo/src/mojo/public/js/codec.js
index 4eec2c0..2930c59 100644
--- a/third_party/mojo/src/mojo/public/js/codec.js
+++ b/third_party/mojo/src/mojo/public/js/codec.js
@@ -390,9 +390,7 @@ define("mojo/public/js/codec", [
keys[i++] = key;
});
this.writeUint32(kStructHeaderSize + kMapStructPayloadSize);
- // TODO(yzshen): In order to work with other bindings which still interprets
- // the |version| field as |num_fields|, set it to version 2 for now.
- this.writeUint32(2); // version
+ this.writeUint32(0); // version
this.encodeArrayPointer(keyClass, keys);
this.encodeArrayPointer(valueClass, values);
}
@@ -465,9 +463,7 @@ define("mojo/public/js/codec", [
this.handles = [];
var encoder = this.createEncoder(kMessageHeaderSize);
encoder.writeUint32(kMessageHeaderSize);
- // TODO(yzshen): In order to work with other bindings which still interprets
- // the |version| field as |num_fields|, set it to version 2 for now.
- encoder.writeUint32(2); // version.
+ encoder.writeUint32(0); // version.
encoder.writeUint32(messageName);
encoder.writeUint32(0); // flags.
}
@@ -503,9 +499,7 @@ define("mojo/public/js/codec", [
this.handles = [];
var encoder = this.createEncoder(kMessageWithRequestIDHeaderSize);
encoder.writeUint32(kMessageWithRequestIDHeaderSize);
- // TODO(yzshen): In order to work with other bindings which still interprets
- // the |version| field as |num_fields|, set it to version 3 for now.
- encoder.writeUint32(3); // version.
+ encoder.writeUint32(1); // version.
encoder.writeUint32(messageName);
encoder.writeUint32(flags);
encoder.writeUint64(requestID);
@@ -526,7 +520,7 @@ define("mojo/public/js/codec", [
var version = this.decoder.readUint32();
this.messageName = this.decoder.readUint32();
this.flags = this.decoder.readUint32();
- if (version >= 3)
+ if (version >= 1)
this.requestID = this.decoder.readUint64();
this.decoder.skip(messageHeaderSize - this.decoder.next);
}
diff --git a/third_party/mojo/src/mojo/public/js/codec_unittests.js b/third_party/mojo/src/mojo/public/js/codec_unittests.js
index 4b0cc04..7ce01b9 100644
--- a/third_party/mojo/src/mojo/public/js/codec_unittests.js
+++ b/third_party/mojo/src/mojo/public/js/codec_unittests.js
@@ -36,7 +36,7 @@ define([
var expectedMemory = new Uint8Array([
16, 0, 0, 0,
- 2, 0, 0, 0,
+ 0, 0, 0, 0,
42, 0, 0, 0,
0, 0, 0, 0,
@@ -105,7 +105,7 @@ define([
var message = builder.finish();
var expectedMemory = new Uint8Array([
- /* 0: */ 16, 0, 0, 0, 2, 0, 0, 0,
+ /* 0: */ 16, 0, 0, 0, 0, 0, 0, 0,
/* 8: */ 31, 0, 0, 0, 0, 0, 0, 0,
/* 16: */ 96, 0, 0, 0, 0, 0, 0, 0,
/* 24: */ 0xD5, 0xB4, 0x12, 0x02, 0x93, 0x6E, 0x01, 0,
@@ -240,7 +240,7 @@ define([
encoder.encodeStringPointer(str);
var message = builder.finish();
var expectedMemory = new Uint8Array([
- /* 0: */ 16, 0, 0, 0, 2, 0, 0, 0,
+ /* 0: */ 16, 0, 0, 0, 0, 0, 0, 0,
/* 8: */ 42, 0, 0, 0, 0, 0, 0, 0,
/* 16: */ 8, 0, 0, 0, 0, 0, 0, 0,
/* 24: */ 14, 0, 0, 0, 6, 0, 0, 0,
diff --git a/third_party/mojo/src/mojo/public/js/struct_unittests.js b/third_party/mojo/src/mojo/public/js/struct_unittests.js
index 39a8978..c0131be 100644
--- a/third_party/mojo/src/mojo/public/js/struct_unittests.js
+++ b/third_party/mojo/src/mojo/public/js/struct_unittests.js
@@ -143,17 +143,17 @@ define([
function testMapValueTypes() {
var mapFieldsStruct = new testStructs.MapValueTypes({
- // array<string>>
+ // map<string, array<string>>
f0: new Map([["a", ["b", "c"]], ["d", ["e"]]]),
- // array<string>?>
+ // map<string, array<string>?>
f1: new Map([["a", null], ["b", ["c", "d"]]]),
- // array<string?>>
+ // map<string, array<string?>>
f2: new Map([["a", [null]], ["b", [null, "d"]]]),
- // array<string,2>>
+ // map<string, array<string,2>>
f3: new Map([["a", ["1", "2"]], ["b", ["1", "2"]]]),
- // array<array<string, 1>?>
- f4: new Map([["a", [["1"]]], ["b", [null]]]),
- // array<array<string, 2>, 1>>
+ // map<string, array<array<string, 2>?>>
+ f4: new Map([["a", [["1", "2"]]], ["b", [null]]]),
+ // map<string, array<array<string, 2>, 1>>
f5: new Map([["a", [["1", "2"]]]]),
// map<string, Rect?>
f6: new Map([["a", null]]),
@@ -161,6 +161,12 @@ define([
f7: new Map([["a", new Map([["b", "c"]])]]),
// map<string, array<map<string, string>>>
f8: new Map([["a", [new Map([["b", "c"]])]]]),
+ // map<string, handle>
+ f9: new Map([["a", 1234]]),
+ // map<string, array<handle>>
+ f10: new Map([["a", [1234, 5678]]]),
+ // map<string, map<string, handle>>
+ f11: new Map([["a", new Map([["b", 1234]])]]),
});
var decodedStruct = structEncodeDecode(mapFieldsStruct);
expect(decodedStruct.f0).toEqual(mapFieldsStruct.f0);
@@ -172,6 +178,9 @@ define([
expect(decodedStruct.f6).toEqual(mapFieldsStruct.f6);
expect(decodedStruct.f7).toEqual(mapFieldsStruct.f7);
expect(decodedStruct.f8).toEqual(mapFieldsStruct.f8);
+ expect(decodedStruct.f9).toEqual(mapFieldsStruct.f9);
+ expect(decodedStruct.f10).toEqual(mapFieldsStruct.f10);
+ expect(decodedStruct.f11).toEqual(mapFieldsStruct.f11);
}
function testFloatNumberValues() {
diff --git a/third_party/mojo/src/mojo/public/js/validator.js b/third_party/mojo/src/mojo/public/js/validator.js
index 72821b7..5568c5f 100644
--- a/third_party/mojo/src/mojo/public/js/validator.js
+++ b/third_party/mojo/src/mojo/public/js/validator.js
@@ -134,7 +134,7 @@ define("mojo/public/js/validator", [
}
Validator.prototype.validateMessageHeader = function() {
- var err = this.validateStructHeader(0, codec.kMessageHeaderSize, 2);
+ var err = this.validateStructHeader(0, codec.kMessageHeaderSize, 0);
if (err != validationError.NONE)
return err;
@@ -142,10 +142,10 @@ define("mojo/public/js/validator", [
var version = this.message.getHeaderVersion();
var validVersionAndNumBytes =
- (version == 2 && numBytes == codec.kMessageHeaderSize) ||
- (version == 3 &&
+ (version == 0 && numBytes == codec.kMessageHeaderSize) ||
+ (version == 1 &&
numBytes == codec.kMessageWithRequestIDHeaderSize) ||
- (version > 3 &&
+ (version > 1 &&
numBytes >= codec.kMessageWithRequestIDHeaderSize);
if (!validVersionAndNumBytes)
return validationError.UNEXPECTED_STRUCT_HEADER;
@@ -153,7 +153,7 @@ define("mojo/public/js/validator", [
var expectsResponse = this.message.expectsResponse();
var isResponse = this.message.isResponse();
- if (version == 2 && (expectsResponse || isResponse))
+ if (version == 0 && (expectsResponse || isResponse))
return validationError.MESSAGE_HEADER_MISSING_REQUEST_ID;
if (isResponse && expectsResponse)
@@ -222,7 +222,7 @@ define("mojo/public/js/validator", [
validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
var mapEncodedSize = codec.kStructHeaderSize + codec.kMapStructPayloadSize;
- var err = this.validateStructHeader(structOffset, mapEncodedSize, 2);
+ var err = this.validateStructHeader(structOffset, mapEncodedSize, 0);
if (err !== validationError.NONE)
return err;
diff --git a/third_party/mojo/src/mojo/public/python/BUILD.gn b/third_party/mojo/src/mojo/public/python/BUILD.gn
index d2e13c2..5fe296c 100644
--- a/third_party/mojo/src/mojo/public/python/BUILD.gn
+++ b/third_party/mojo/src/mojo/public/python/BUILD.gn
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import("../mojo_sdk.gni")
import("//third_party/cython/rules.gni")
import("rules.gni")
@@ -88,11 +89,37 @@ python_package("packaged_application") {
]
}
-# GYP version: mojo.gyp:mojo_python_bindings
+action("import_interface_bindings") {
+ visibility = [ ":bindings" ]
+ script = rebase_path("mojo/public/tools/gn/unzip.py", ".", mojo_root)
+ timestamp = "$target_gen_dir/${target_name}.outputstamp"
+ mojom_deps = [ "../interfaces/bindings:bindings_python" ]
+ inputs = []
+ foreach(d, mojom_deps) {
+ dep_name = get_label_info(d, "name")
+ dep_target_out_dir = get_label_info(d, "target_out_dir")
+ inputs += [ "$dep_target_out_dir/$dep_name.pyzip" ]
+ }
+ outputs = [
+ timestamp,
+ ]
+ rebase_inputs = rebase_path(inputs, root_build_dir)
+ rabase_output = rebase_path("$root_out_dir/python", root_build_dir)
+ rebase_timestamp = rebase_path(timestamp, root_build_dir)
+ args = [
+ "--inputs=${rebase_inputs}",
+ "--output=${rabase_output}",
+ "--timestamp=${rebase_timestamp}",
+ ]
+
+ deps = mojom_deps
+}
+
copy("bindings") {
sources = [
"mojo_bindings/__init__.py",
"mojo_bindings/descriptor.py",
+ "mojo_bindings/interface_reflection.py",
"mojo_bindings/messaging.py",
"mojo_bindings/promise.py",
"mojo_bindings/reflection.py",
@@ -102,6 +129,7 @@ copy("bindings") {
"$root_out_dir/python/mojo_bindings/{{source_file_part}}",
]
deps = [
+ ":import_interface_bindings",
":mojo_system",
]
}
@@ -110,9 +138,14 @@ python_package("packaged_bindings") {
sources = [
"mojo_bindings/__init__.py",
"mojo_bindings/descriptor.py",
+ "mojo_bindings/interface_reflection.py",
"mojo_bindings/messaging.py",
"mojo_bindings/promise.py",
"mojo_bindings/reflection.py",
"mojo_bindings/serialization.py",
]
+
+ deps = [
+ "../interfaces/bindings:bindings_python",
+ ]
}
diff --git a/third_party/mojo/src/mojo/public/python/mojo_bindings/descriptor.py b/third_party/mojo/src/mojo/public/python/mojo_bindings/descriptor.py
index 69c409f..efba73d 100644
--- a/third_party/mojo/src/mojo/public/python/mojo_bindings/descriptor.py
+++ b/third_party/mojo/src/mojo/public/python/mojo_bindings/descriptor.py
@@ -314,12 +314,19 @@ class InterfaceType(BaseHandleType):
def Serialize(self, value, data_offset, data, handle_offset):
(encoded_handle, handles) = super(InterfaceType, self).Serialize(
value, data_offset, data, handle_offset)
- # Set the version field to 0 for now.
- return ((encoded_handle, 0), handles)
+ if encoded_handle == -1:
+ version = 0
+ else:
+ version = self.interface.manager.version
+ if value and isinstance(value, reflection.InterfaceProxy):
+ version = value.manager.version
+ return ((encoded_handle, version), handles)
def Deserialize(self, value, context):
- # Ignore the version field for now.
- return super(InterfaceType, self).Deserialize(value[0], context)
+ proxy = super(InterfaceType, self).Deserialize(value[0], context)
+ if proxy:
+ proxy.manager.version = value[1]
+ return proxy
def FromHandle(self, handle):
if handle.IsValid():
@@ -534,8 +541,8 @@ class MapType(SerializableType):
'__module__': __name__,
'DESCRIPTOR': {
'fields': [
- SingleFieldGroup('keys', MapType._GetArrayType(key_type), 0, 1),
- SingleFieldGroup('values', MapType._GetArrayType(value_type), 1, 2),
+ SingleFieldGroup('keys', MapType._GetArrayType(key_type), 0, 0),
+ SingleFieldGroup('values', MapType._GetArrayType(value_type), 1, 0),
],
}
}
diff --git a/third_party/mojo/src/mojo/public/python/mojo_bindings/interface_reflection.py b/third_party/mojo/src/mojo/public/python/mojo_bindings/interface_reflection.py
new file mode 100644
index 0000000..8ce3882
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/python/mojo_bindings/interface_reflection.py
@@ -0,0 +1,466 @@
+# Copyright 2015 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.
+
+"""
+The metaclasses used by the mojo python bindings for interfaces.
+
+It is splitted from mojo_bindings.reflection because it uses some generated code
+that would create a cyclic dependency.
+"""
+
+import logging
+import sys
+
+# pylint: disable=F0401
+import interface_control_messages_mojom
+import mojo_bindings.messaging as messaging
+import mojo_bindings.promise as promise
+import mojo_bindings.reflection as reflection
+import mojo_bindings.serialization as serialization
+import mojo_system
+
+
+class MojoInterfaceType(type):
+ """Meta class for interfaces.
+
+ Usage:
+ class MyInterface(object):
+ __metaclass__ = MojoInterfaceType
+ DESCRIPTOR = {
+ 'fully_qualified_name': 'service::MyInterface'
+ 'version': 3,
+ 'methods': [
+ {
+ 'name': 'FireAndForget',
+ 'ordinal': 0,
+ 'parameters': [
+ SingleFieldGroup('x', _descriptor.TYPE_INT32, 0, 0),
+ ]
+ },
+ {
+ 'name': 'Ping',
+ 'ordinal': 1,
+ 'parameters': [
+ SingleFieldGroup('x', _descriptor.TYPE_INT32, 0, 0),
+ ],
+ 'responses': [
+ SingleFieldGroup('x', _descriptor.TYPE_INT32, 0, 0),
+ ],
+ },
+ ],
+ }
+ """
+
+ def __new__(mcs, name, bases, dictionary):
+ # If one of the base class is already an interface type, do not edit the
+ # class.
+ for base in bases:
+ if isinstance(base, mcs):
+ return type.__new__(mcs, name, bases, dictionary)
+
+ descriptor = dictionary.pop('DESCRIPTOR', {})
+
+ methods = [_MethodDescriptor(x) for x in descriptor.get('methods', [])]
+ for method in methods:
+ dictionary[method.name] = _NotImplemented
+ fully_qualified_name = descriptor['fully_qualified_name']
+
+ interface_manager = InterfaceManager(
+ fully_qualified_name, descriptor['version'], methods)
+ dictionary.update({
+ 'manager': None,
+ '_interface_manager': interface_manager,
+ })
+
+ interface_class = type.__new__(mcs, name, bases, dictionary)
+ interface_manager.interface_class = interface_class
+ return interface_class
+
+ @property
+ def manager(cls):
+ return cls._interface_manager
+
+ # Prevent adding new attributes, or mutating constants.
+ def __setattr__(cls, key, value):
+ raise AttributeError('can\'t set attribute')
+
+ # Prevent deleting constants.
+ def __delattr__(cls, key):
+ raise AttributeError('can\'t delete attribute')
+
+
+class InterfaceManager(object):
+ """
+ Manager for an interface class. The manager contains the operation that allows
+ to bind an implementation to a pipe, or to generate a proxy for an interface
+ over a pipe.
+ """
+
+ def __init__(self, name, version, methods):
+ self.name = name
+ self.version = version
+ self.methods = methods
+ self.interface_class = None
+ self._proxy_class = None
+ self._stub_class = None
+
+ def Proxy(self, handle, version=0):
+ router = messaging.Router(handle)
+ error_handler = _ProxyErrorHandler()
+ router.SetErrorHandler(error_handler)
+ router.Start()
+ return self._InternalProxy(router, error_handler, version)
+
+ # pylint: disable=W0212
+ def Bind(self, impl, handle):
+ router = messaging.Router(handle)
+ router.SetIncomingMessageReceiver(self._Stub(impl))
+ error_handler = _ProxyErrorHandler()
+ router.SetErrorHandler(error_handler)
+
+ # Retain the router, until an error happen.
+ retainer = _Retainer(router)
+ def Cleanup(_):
+ retainer.release()
+ error_handler.AddCallback(Cleanup)
+
+ # Give an instance manager to the implementation to allow it to close
+ # the connection.
+ impl.manager = InstanceManager(self, router, error_handler)
+
+ router.Start()
+
+ def NewRequest(self):
+ pipe = mojo_system.MessagePipe()
+ return (self.Proxy(pipe.handle0), reflection.InterfaceRequest(pipe.handle1))
+
+ def _InternalProxy(self, router, error_handler, version):
+ if error_handler is None:
+ error_handler = _ProxyErrorHandler()
+
+ if not self._proxy_class:
+ dictionary = {
+ '__module__': __name__,
+ '__init__': _ProxyInit,
+ }
+ for method in self.methods:
+ dictionary[method.name] = _ProxyMethodCall(method)
+ self._proxy_class = type(
+ '%sProxy' % self.name,
+ (self.interface_class, reflection.InterfaceProxy),
+ dictionary)
+
+ proxy = self._proxy_class(router, error_handler)
+ # Give an instance manager to the proxy to allow to close the connection.
+ proxy.manager = ProxyInstanceManager(
+ self, proxy, router, error_handler, version)
+ return proxy
+
+ def _Stub(self, impl):
+ if not self._stub_class:
+ accept_method = _StubAccept(self.methods)
+ dictionary = {
+ '__module__': __name__,
+ '__init__': _StubInit,
+ 'Accept': accept_method,
+ 'AcceptWithResponder': accept_method,
+ }
+ self._stub_class = type('%sStub' % self.name,
+ (messaging.MessageReceiverWithResponder,),
+ dictionary)
+ return self._stub_class(impl)
+
+
+class InstanceManager(object):
+ """
+ Manager for the implementation of an interface or a proxy. The manager allows
+ to control the connection over the pipe.
+ """
+ def __init__(self, interface_manager, router, error_handler):
+ self.interface_manager = interface_manager
+ self._router = router
+ self._error_handler = error_handler
+ assert self._error_handler is not None
+
+ def Close(self):
+ self._error_handler.OnClose()
+ self._router.Close()
+
+ def PassMessagePipe(self):
+ self._error_handler.OnClose()
+ return self._router.PassMessagePipe()
+
+ def AddOnErrorCallback(self, callback):
+ self._error_handler.AddCallback(lambda _: callback(), False)
+
+
+class ProxyInstanceManager(InstanceManager):
+ """
+ Manager for the implementation of a proxy. The manager allows to control the
+ connection over the pipe.
+ """
+ def __init__(self, interface_manager, proxy, router, error_handler, version):
+ super(ProxyInstanceManager, self).__init__(
+ interface_manager, router, error_handler)
+ self.proxy = proxy
+ self.version = version
+ self._run_method = _ProxyMethodCall(_BaseMethodDescriptor(
+ 'Run',
+ interface_control_messages_mojom.RUN_MESSAGE_ID,
+ interface_control_messages_mojom.RunMessageParams,
+ interface_control_messages_mojom.RunResponseMessageParams))
+ self._run_or_close_pipe_method = _ProxyMethodCall(_BaseMethodDescriptor(
+ 'RunOrClosePipe',
+ interface_control_messages_mojom.RUN_OR_CLOSE_PIPE_MESSAGE_ID,
+ interface_control_messages_mojom.RunOrClosePipeMessageParams,
+ None))
+
+ def QueryVersion(self):
+ params = interface_control_messages_mojom.RunMessageParams()
+ params.reserved0 = 16
+ params.reserved1 = 0
+ params.query_version = (
+ interface_control_messages_mojom.QueryVersion())
+ def ToVersion(r):
+ self.version = r.query_version_result.version
+ return self.version
+ return self._run_method(self.proxy, **params.AsDict()).Then(ToVersion)
+
+ def RequireVersion(self, version):
+ if self.version >= version:
+ return
+ self.version = version
+ params = interface_control_messages_mojom.RunOrClosePipeMessageParams()
+ params.reserved0 = 16
+ params.reserved1 = 0
+ params.require_version = interface_control_messages_mojom.RequireVersion()
+ params.require_version.version = version
+ return self._run_or_close_pipe_method(self.proxy, **params.AsDict())
+
+
+class _BaseMethodDescriptor(object):
+ def __init__(self, name, ordinal, parameters_struct, response_struct):
+ self.name = name
+ self.ordinal = ordinal
+ self.parameters_struct = parameters_struct
+ self.response_struct = response_struct
+
+
+class _MethodDescriptor(_BaseMethodDescriptor):
+ def __init__(self, descriptor):
+ name = descriptor['name']
+ super(_MethodDescriptor, self).__init__(
+ name,
+ descriptor['ordinal'],
+ _ConstructParameterStruct(
+ descriptor['parameters'], name, "Parameters"),
+ _ConstructParameterStruct(
+ descriptor.get('responses'), name, "Responses"))
+
+
+def _ConstructParameterStruct(descriptor, name, suffix):
+ if descriptor is None:
+ return None
+ parameter_dictionary = {
+ '__metaclass__': reflection.MojoStructType,
+ '__module__': __name__,
+ 'DESCRIPTOR': descriptor,
+ }
+ return reflection.MojoStructType(
+ '%s%s' % (name, suffix),
+ (object,),
+ parameter_dictionary)
+
+
+class _ProxyErrorHandler(messaging.ConnectionErrorHandler):
+ def __init__(self):
+ messaging.ConnectionErrorHandler.__init__(self)
+ self._callbacks = dict()
+
+ def OnError(self, result):
+ if self._callbacks is None:
+ return
+ exception = messaging.MessagingException('Mojo error: %d' % result)
+ for (callback, _) in self._callbacks.iteritems():
+ callback(exception)
+ self._callbacks = None
+
+ def OnClose(self):
+ if self._callbacks is None:
+ return
+ exception = messaging.MessagingException('Router has been closed.')
+ for (callback, call_on_close) in self._callbacks.iteritems():
+ if call_on_close:
+ callback(exception)
+ self._callbacks = None
+
+ def AddCallback(self, callback, call_on_close=True):
+ if self._callbacks is not None:
+ self._callbacks[callback] = call_on_close
+
+ def RemoveCallback(self, callback):
+ if self._callbacks:
+ del self._callbacks[callback]
+
+
+class _Retainer(object):
+
+ # Set to force instances to be retained.
+ _RETAINED = set()
+
+ def __init__(self, retained):
+ self._retained = retained
+ _Retainer._RETAINED.add(self)
+
+ def release(self):
+ self._retained = None
+ _Retainer._RETAINED.remove(self)
+
+
+def _ProxyInit(self, router, error_handler):
+ self._router = router
+ self._error_handler = error_handler
+
+
+# pylint: disable=W0212
+def _ProxyMethodCall(method):
+ flags = messaging.NO_FLAG
+ if method.response_struct:
+ flags = messaging.MESSAGE_EXPECTS_RESPONSE_FLAG
+ def _Call(self, *args, **kwargs):
+ def GenerationMethod(resolve, reject):
+ message = _GetMessage(method, flags, None, *args, **kwargs)
+ if method.response_struct:
+ def Accept(message):
+ try:
+ assert message.header.message_type == method.ordinal
+ payload = message.payload
+ response = method.response_struct.Deserialize(
+ serialization.RootDeserializationContext(payload.data,
+ payload.handles))
+ as_dict = response.AsDict()
+ if len(as_dict) == 1:
+ value = as_dict.values()[0]
+ if not isinstance(value, dict):
+ response = value
+ resolve(response)
+ return True
+ except Exception as e:
+ # Adding traceback similarly to python 3.0 (pep-3134)
+ e.__traceback__ = sys.exc_info()[2]
+ reject(e)
+ return False
+ finally:
+ self._error_handler.RemoveCallback(reject)
+
+ self._error_handler.AddCallback(reject)
+ if not self._router.AcceptWithResponder(
+ message, messaging.ForwardingMessageReceiver(Accept)):
+ self._error_handler.RemoveCallback(reject)
+ reject(messaging.MessagingException("Unable to send message."))
+ else:
+ if (self._router.Accept(message)):
+ resolve(None)
+ else:
+ reject(messaging.MessagingException("Unable to send message."))
+ return promise.Promise(GenerationMethod)
+ return _Call
+
+
+def _GetMessageWithStruct(struct, ordinal, flags, request_id):
+ header = messaging.MessageHeader(
+ ordinal, flags, 0 if request_id is None else request_id)
+ data = header.Serialize()
+ (payload, handles) = struct.Serialize()
+ data.extend(payload)
+ return messaging.Message(data, handles, header)
+
+
+def _GetMessage(method, flags, request_id, *args, **kwargs):
+ if flags == messaging.MESSAGE_IS_RESPONSE_FLAG:
+ struct = method.response_struct(*args, **kwargs)
+ else:
+ struct = method.parameters_struct(*args, **kwargs)
+ return _GetMessageWithStruct(struct, method.ordinal, flags, request_id)
+
+
+def _StubInit(self, impl):
+ self.impl = impl
+
+
+def _StubAccept(methods):
+ methods_by_ordinal = dict((m.ordinal, m) for m in methods)
+ def Accept(self, message, responder=None):
+ try:
+ header = message.header
+ assert header.expects_response == bool(responder)
+ if header.message_type == interface_control_messages_mojom.RUN_MESSAGE_ID:
+ return _RunMessage(self.impl.manager, message, responder)
+ if (header.message_type ==
+ interface_control_messages_mojom.RUN_OR_CLOSE_PIPE_MESSAGE_ID):
+ return _RunMessageOrClosePipe(self.impl.manager, message)
+ assert header.message_type in methods_by_ordinal
+ method = methods_by_ordinal[header.message_type]
+ payload = message.payload
+ parameters = method.parameters_struct.Deserialize(
+ serialization.RootDeserializationContext(
+ payload.data, payload.handles)).AsDict()
+ response = getattr(self.impl, method.name)(**parameters)
+ if header.expects_response:
+ @promise.async
+ def SendResponse(response):
+ if isinstance(response, dict):
+ response_message = _GetMessage(method,
+ messaging.MESSAGE_IS_RESPONSE_FLAG,
+ header.request_id,
+ **response)
+ else:
+ response_message = _GetMessage(method,
+ messaging.MESSAGE_IS_RESPONSE_FLAG,
+ header.request_id,
+ response)
+ return responder.Accept(response_message)
+ p = SendResponse(response)
+ if self.impl.manager:
+ # Close the connection in case of error.
+ p.Catch(lambda _: self.impl.manager.Close())
+ return True
+ # pylint: disable=W0702
+ except:
+ # Close the connection in case of error.
+ logging.warning(
+ 'Error occured in accept method. Connection will be closed.')
+ logging.debug("Exception", exc_info=True)
+ if self.impl.manager:
+ self.impl.manager.Close()
+ return False
+ return Accept
+
+
+def _RunMessage(manager, message, responder):
+ response = interface_control_messages_mojom.RunResponseMessageParams()
+ response.reserved0 = 16
+ response.reserved1 = 0
+ response.query_version_result = (
+ interface_control_messages_mojom.QueryVersionResult())
+ response.query_version_result.version = manager.interface_manager.version
+ response_message = _GetMessageWithStruct(
+ response,
+ interface_control_messages_mojom.RUN_MESSAGE_ID,
+ messaging.MESSAGE_IS_RESPONSE_FLAG,
+ message.header.request_id)
+ return responder.Accept(response_message)
+
+
+def _RunMessageOrClosePipe(manager, message):
+ payload = message.payload
+ query = (
+ interface_control_messages_mojom.RunOrClosePipeMessageParams.Deserialize(
+ serialization.RootDeserializationContext(payload.data,
+ payload.handles)))
+ return query.require_version.version <= manager.interface_manager.version
+
+
+def _NotImplemented(*_1, **_2):
+ raise NotImplementedError()
diff --git a/third_party/mojo/src/mojo/public/python/mojo_bindings/messaging.py b/third_party/mojo/src/mojo/public/python/mojo_bindings/messaging.py
index ebdf1ee..c2742cc 100644
--- a/third_party/mojo/src/mojo/public/python/mojo_bindings/messaging.py
+++ b/third_party/mojo/src/mojo/public/python/mojo_bindings/messaging.py
@@ -30,13 +30,13 @@ class MessagingException(Exception):
class MessageHeader(object):
"""The header of a mojo message."""
- _SIMPLE_MESSAGE_VERSION = 2
+ _SIMPLE_MESSAGE_VERSION = 0
_SIMPLE_MESSAGE_STRUCT = struct.Struct("<IIII")
_REQUEST_ID_STRUCT = struct.Struct("<Q")
_REQUEST_ID_OFFSET = _SIMPLE_MESSAGE_STRUCT.size
- _MESSAGE_WITH_REQUEST_ID_VERSION = 3
+ _MESSAGE_WITH_REQUEST_ID_VERSION = 1
_MESSAGE_WITH_REQUEST_ID_SIZE = (
_SIMPLE_MESSAGE_STRUCT.size + _REQUEST_ID_STRUCT.size)
@@ -276,10 +276,11 @@ class Connector(MessageReceiver):
_WeakCallback(self._OnAsyncWaiterResult))
def _ReadOutstandingMessages(self):
- result = system.RESULT_OK
- while result == system.RESULT_OK:
- result = _ReadAndDispatchMessage(self._handle,
- self._incoming_message_receiver)
+ result = None
+ dispatched = True
+ while dispatched:
+ result, dispatched = _ReadAndDispatchMessage(
+ self._handle, self._incoming_message_receiver)
if result == system.RESULT_SHOULD_WAIT:
self._RegisterAsyncWaiterForRead()
return
@@ -393,15 +394,16 @@ def _WeakCallback(callback):
def _ReadAndDispatchMessage(handle, message_receiver):
+ dispatched = False
(result, _, sizes) = handle.ReadMessage()
if result == system.RESULT_OK and message_receiver:
- message_receiver.Accept(Message(bytearray(), []))
+ dispatched = message_receiver.Accept(Message(bytearray(), []))
if result != system.RESULT_RESOURCE_EXHAUSTED:
- return result
+ return (result, dispatched)
(result, data, _) = handle.ReadMessage(bytearray(sizes[0]), sizes[1])
if result == system.RESULT_OK and message_receiver:
- message_receiver.Accept(Message(data[0], data[1]))
- return result
+ dispatched = message_receiver.Accept(Message(data[0], data[1]))
+ return (result, dispatched)
def _HasRequestId(flags):
return flags & (MESSAGE_EXPECTS_RESPONSE_FLAG|MESSAGE_IS_RESPONSE_FLAG) != 0
diff --git a/third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py b/third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py
index e41601a..6c4767b 100644
--- a/third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py
+++ b/third_party/mojo/src/mojo/public/python/mojo_bindings/reflection.py
@@ -5,14 +5,9 @@
"""The metaclasses used by the mojo python bindings."""
import itertools
-import logging
-import sys
# pylint: disable=F0401
-import mojo_bindings.messaging as messaging
-import mojo_bindings.promise as promise
import mojo_bindings.serialization as serialization
-import mojo_system
class MojoEnumType(type):
@@ -140,79 +135,6 @@ class MojoStructType(type):
raise AttributeError('can\'t delete attribute')
-class MojoInterfaceType(type):
- """Meta class for interfaces.
-
- Usage:
- class MyInterface(object):
- __metaclass__ = MojoInterfaceType
- DESCRIPTOR = {
- 'methods': [
- {
- 'name': 'FireAndForget',
- 'ordinal': 0,
- 'parameters': [
- SingleFieldGroup('x', _descriptor.TYPE_INT32, 0, 0),
- ]
- },
- {
- 'name': 'Ping',
- 'ordinal': 1,
- 'parameters': [
- SingleFieldGroup('x', _descriptor.TYPE_INT32, 0, 0),
- ],
- 'responses': [
- SingleFieldGroup('x', _descriptor.TYPE_INT32, 0, 0),
- ],
- },
- ],
- }
- """
-
- def __new__(mcs, name, bases, dictionary):
- # If one of the base class is already an interface type, do not edit the
- # class.
- for base in bases:
- if isinstance(base, mcs):
- return type.__new__(mcs, name, bases, dictionary)
-
- descriptor = dictionary.pop('DESCRIPTOR', {})
-
- methods = [_MethodDescriptor(x) for x in descriptor.get('methods', [])]
- for method in methods:
- dictionary[method.name] = _NotImplemented
- fully_qualified_name = descriptor['fully_qualified_name']
-
- interface_manager = InterfaceManager(fully_qualified_name, methods)
- dictionary.update({
- 'manager': None,
- '_interface_manager': interface_manager,
- })
-
- interface_class = type.__new__(mcs, name, bases, dictionary)
- interface_manager.interface_class = interface_class
- return interface_class
-
- @property
- def manager(cls):
- return cls._interface_manager
-
- # Prevent adding new attributes, or mutating constants.
- def __setattr__(cls, key, value):
- raise AttributeError('can\'t set attribute')
-
- # Prevent deleting constants.
- def __delattr__(cls, key):
- raise AttributeError('can\'t delete attribute')
-
-
-class InterfaceProxy(object):
- """
- A proxy allows to access a remote interface through a message pipe.
- """
- pass
-
-
class InterfaceRequest(object):
"""
An interface request allows to send a request for an interface to a remote
@@ -234,174 +156,11 @@ class InterfaceRequest(object):
type(impl).manager.Bind(impl, self.PassMessagePipe())
-class InterfaceManager(object):
- """
- Manager for an interface class. The manager contains the operation that allows
- to bind an implementation to a pipe, or to generate a proxy for an interface
- over a pipe.
- """
-
- def __init__(self, name, methods):
- self.name = name
- self.methods = methods
- self.interface_class = None
- self._proxy_class = None
- self._stub_class = None
-
- def Proxy(self, handle):
- router = messaging.Router(handle)
- error_handler = _ProxyErrorHandler()
- router.SetErrorHandler(error_handler)
- router.Start()
- return self._InternalProxy(router, error_handler)
-
- # pylint: disable=W0212
- def Bind(self, impl, handle):
- router = messaging.Router(handle)
- router.SetIncomingMessageReceiver(self._Stub(impl))
- error_handler = _ProxyErrorHandler()
- router.SetErrorHandler(error_handler)
-
- # Retain the router, until an error happen.
- retainer = _Retainer(router)
- def Cleanup(_):
- retainer.release()
- error_handler.AddCallback(Cleanup)
-
- # Give an instance manager to the implementation to allow it to close
- # the connection.
- impl.manager = InstanceManager(router, error_handler)
-
- router.Start()
-
- def NewRequest(self):
- pipe = mojo_system.MessagePipe()
- return (self.Proxy(pipe.handle0), InterfaceRequest(pipe.handle1))
-
- def _InternalProxy(self, router, error_handler):
- if error_handler is None:
- error_handler = _ProxyErrorHandler()
-
- if not self._proxy_class:
- dictionary = {
- '__module__': __name__,
- '__init__': _ProxyInit,
- }
- for method in self.methods:
- dictionary[method.name] = _ProxyMethodCall(method)
- self._proxy_class = type('%sProxy' % self.name,
- (self.interface_class, InterfaceProxy),
- dictionary)
-
- proxy = self._proxy_class(router, error_handler)
- # Give an instance manager to the proxy to allow to close the connection.
- proxy.manager = InstanceManager(router, error_handler)
- return proxy
-
- def _Stub(self, impl):
- if not self._stub_class:
- accept_method = _StubAccept(self.methods)
- dictionary = {
- '__module__': __name__,
- '__init__': _StubInit,
- 'Accept': accept_method,
- 'AcceptWithResponder': accept_method,
- }
- self._stub_class = type('%sStub' % self.name,
- (messaging.MessageReceiverWithResponder,),
- dictionary)
- return self._stub_class(impl)
-
-
-class InstanceManager(object):
+class InterfaceProxy(object):
"""
- Manager for the implementation of an interface or a proxy. The manager allows
- to control the connection over the pipe.
+ A proxy allows to access a remote interface through a message pipe.
"""
- def __init__(self, router, error_handler):
- self._router = router
- self._error_handler = error_handler
- assert self._error_handler is not None
-
- def Close(self):
- self._error_handler.OnClose()
- self._router.Close()
-
- def PassMessagePipe(self):
- self._error_handler.OnClose()
- return self._router.PassMessagePipe()
-
- def AddOnErrorCallback(self, callback):
- self._error_handler.AddCallback(lambda _: callback(), False)
-
-
-class _MethodDescriptor(object):
- def __init__(self, descriptor):
- self.name = descriptor['name']
- self.ordinal = descriptor['ordinal']
- self.parameters_struct = _ConstructParameterStruct(
- descriptor['parameters'], self.name, "Parameters")
- self.response_struct = _ConstructParameterStruct(
- descriptor.get('responses'), self.name, "Responses")
-
-
-def _ConstructParameterStruct(descriptor, name, suffix):
- if descriptor is None:
- return None
- parameter_dictionary = {
- '__metaclass__': MojoStructType,
- '__module__': __name__,
- 'DESCRIPTOR': descriptor,
- }
- return MojoStructType(
- '%s%s' % (name, suffix),
- (object,),
- parameter_dictionary)
-
-
-class _ProxyErrorHandler(messaging.ConnectionErrorHandler):
- def __init__(self):
- messaging.ConnectionErrorHandler.__init__(self)
- self._callbacks = dict()
-
- def OnError(self, result):
- if self._callbacks is None:
- return
- exception = messaging.MessagingException('Mojo error: %d' % result)
- for (callback, _) in self._callbacks.iteritems():
- callback(exception)
- self._callbacks = None
-
- def OnClose(self):
- if self._callbacks is None:
- return
- exception = messaging.MessagingException('Router has been closed.')
- for (callback, call_on_close) in self._callbacks.iteritems():
- if call_on_close:
- callback(exception)
- self._callbacks = None
-
- def AddCallback(self, callback, call_on_close=True):
- if self._callbacks is not None:
- self._callbacks[callback] = call_on_close
-
- def RemoveCallback(self, callback):
- if self._callbacks:
- del self._callbacks[callback]
-
-
-class _Retainer(object):
-
- # Set to force instances to be retained.
- _RETAINED = set()
-
- def __init__(self, retained):
- self._retained = retained
- _Retainer._RETAINED.add(self)
-
- def release(self):
- self._retained = None
- _Retainer._RETAINED.remove(self)
+ pass
def _StructInit(fields):
@@ -452,116 +211,3 @@ def _StructEq(fields):
def _StructNe(self, other):
return not self.__eq__(other)
-
-
-def _ProxyInit(self, router, error_handler):
- self._router = router
- self._error_handler = error_handler
-
-
-# pylint: disable=W0212
-def _ProxyMethodCall(method):
- flags = messaging.NO_FLAG
- if method.response_struct:
- flags = messaging.MESSAGE_EXPECTS_RESPONSE_FLAG
- def _Call(self, *args, **kwargs):
- def GenerationMethod(resolve, reject):
- message = _GetMessage(method, flags, *args, **kwargs)
- if method.response_struct:
- def Accept(message):
- try:
- assert message.header.message_type == method.ordinal
- payload = message.payload
- response = method.response_struct.Deserialize(
- serialization.RootDeserializationContext(payload.data,
- payload.handles))
- as_dict = response.AsDict()
- if len(as_dict) == 1:
- value = as_dict.values()[0]
- if not isinstance(value, dict):
- response = value
- resolve(response)
- return True
- except Exception as e:
- # Adding traceback similarly to python 3.0 (pep-3134)
- e.__traceback__ = sys.exc_info()[2]
- reject(e)
- return False
- finally:
- self._error_handler.RemoveCallback(reject)
-
- self._error_handler.AddCallback(reject)
- if not self._router.AcceptWithResponder(
- message, messaging.ForwardingMessageReceiver(Accept)):
- self._error_handler.RemoveCallback(reject)
- reject(messaging.MessagingException("Unable to send message."))
- else:
- if (self._router.Accept(message)):
- resolve(None)
- else:
- reject(messaging.MessagingException("Unable to send message."))
- return promise.Promise(GenerationMethod)
- return _Call
-
-
-def _GetMessage(method, flags, *args, **kwargs):
- if flags == messaging.MESSAGE_IS_RESPONSE_FLAG:
- struct = method.response_struct(*args, **kwargs)
- else:
- struct = method.parameters_struct(*args, **kwargs)
- header = messaging.MessageHeader(method.ordinal, flags)
- data = header.Serialize()
- (payload, handles) = struct.Serialize()
- data.extend(payload)
- return messaging.Message(data, handles, header)
-
-
-def _StubInit(self, impl):
- self.impl = impl
-
-
-def _StubAccept(methods):
- methods_by_ordinal = dict((m.ordinal, m) for m in methods)
- def Accept(self, message, responder=None):
- try:
- header = message.header
- assert header.expects_response == bool(responder)
- assert header.message_type in methods_by_ordinal
- method = methods_by_ordinal[header.message_type]
- payload = message.payload
- parameters = method.parameters_struct.Deserialize(
- serialization.RootDeserializationContext(
- payload.data, payload.handles)).AsDict()
- response = getattr(self.impl, method.name)(**parameters)
- if header.expects_response:
- @promise.async
- def SendResponse(response):
- if isinstance(response, dict):
- response_message = _GetMessage(method,
- messaging.MESSAGE_IS_RESPONSE_FLAG,
- **response)
- else:
- response_message = _GetMessage(method,
- messaging.MESSAGE_IS_RESPONSE_FLAG,
- response)
- response_message.header.request_id = header.request_id
- return responder.Accept(response_message)
- p = SendResponse(response)
- if self.impl.manager:
- # Close the connection in case of error.
- p.Catch(lambda _: self.impl.manager.Close())
- return True
- # pylint: disable=W0702
- except:
- # Close the connection in case of error.
- logging.warning(
- 'Error occured in accept method. Connection will be closed.')
- logging.debug("Exception", exc_info=True)
- if self.impl.manager:
- self.impl.manager.Close()
- return False
- return Accept
-
-
-def _NotImplemented(*_1, **_2):
- raise NotImplementedError()
diff --git a/third_party/mojo/src/mojo/public/tools/BUILD.gn b/third_party/mojo/src/mojo/public/tools/BUILD.gn
index 8b47bb9..9850a17 100644
--- a/third_party/mojo/src/mojo/public/tools/BUILD.gn
+++ b/third_party/mojo/src/mojo/public/tools/BUILD.gn
@@ -38,7 +38,7 @@ if (mojo_use_prebuilt_network_service) {
]
} else {
if (is_android) {
- assert(cpu_arch == "arm",
+ assert(current_cpu == "arm",
"Only arm version prebuilt netowrk_service.mojo is available.")
sources = [
"prebuilt/network_service/android-arm/$filename",
@@ -66,7 +66,7 @@ if (mojo_use_prebuilt_network_service) {
} else {
if (is_android) {
assert(
- cpu_arch == "arm",
+ target_cpu == "arm",
"Only arm version prebuilt netowrk_service_apptests.mojo is available.")
sources = [
"prebuilt/network_service_apptests/android-arm/$filename",
diff --git a/third_party/mojo/src/mojo/public/tools/NETWORK_SERVICE_VERSION b/third_party/mojo/src/mojo/public/tools/NETWORK_SERVICE_VERSION
index a2dc8bd..f66a51a3 100644
--- a/third_party/mojo/src/mojo/public/tools/NETWORK_SERVICE_VERSION
+++ b/third_party/mojo/src/mojo/public/tools/NETWORK_SERVICE_VERSION
@@ -1 +1 @@
-fe30635b3ffb0d553c5b2d3fd59526cd16995bcb \ No newline at end of file
+custom_build_base_0f9ad3a20275b77d228f67c2edd89dbea0e3e9ea_issue_1113493008_patchset_20001 \ No newline at end of file
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
index f995e0b..cdfc0ab 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_declaration.tmpl
@@ -9,8 +9,8 @@ class {{interface.name}}ResponseValidator;
class {{interface.name}} {
public:
- static const char* Name_;
- static const uint32_t Version_;
+ static const char Name_[];
+ static const uint32_t Version_ = {{interface.version}};
using Proxy_ = {{interface.name}}Proxy;
using Stub_ = {{interface.name}}Stub;
@@ -22,17 +22,21 @@ class {{interface.name}} {
using ResponseValidator_ = mojo::PassThroughFilter;
{%- endif %}
-{#--- Constants #}
-{%- for constant in interface.constants %}
- static const {{constant.kind|cpp_pod_type}} {{constant.name}};
-{%- endfor %}
-
{#--- Enums #}
{%- for enum in interface.enums %}
{% macro enum_def() %}{% include "enum_declaration.tmpl" %}{% endmacro %}
{{enum_def()|indent(2)}}
{%- endfor %}
+{#--- Constants #}
+{%- for constant in interface.constants %}
+{%- if constant.kind|is_integral_kind %}
+ static const {{constant.kind|cpp_pod_type}} {{constant.name}} = {{constant|constant_value}};
+{%- else %}
+ static const {{constant.kind|cpp_pod_type}} {{constant.name}};
+{%- endif %}
+{%- endfor %}
+
{#--- Methods #}
virtual ~{{interface.name}}() {}
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
index 3cadeed..38991a9 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -30,11 +30,16 @@ p_{{param.name}}
{%- endmacro %}
{#--- Begin #}
-const char* {{class_name}}::Name_ = "{{namespace_as_string}}::{{class_name}}";
-const uint32_t {{class_name}}::Version_ = {{interface.version}};
+MOJO_STATIC_CONST_MEMBER_DEFINITION const char {{class_name}}::Name_[] = "{{namespace_as_string}}::{{class_name}}";
+MOJO_STATIC_CONST_MEMBER_DEFINITION const uint32_t {{class_name}}::Version_;
+
{#--- Constants #}
-{% for constant in interface.constants %}
-const {{constant.kind|cpp_pod_type}} {{interface.name}}::{{constant.name}} = {{constant|constant_value}};
+{%- for constant in interface.constants %}
+{%- if constant.kind|is_integral_kind %}
+MOJO_STATIC_CONST_MEMBER_DEFINITION const {{constant.kind|cpp_pod_type}} {{interface.name}}::{{constant.name}};
+{%- else %}
+MOJO_STATIC_CONST_MEMBER_DEFINITION const {{constant.kind|cpp_pod_type}} {{interface.name}}::{{constant.name}} = {{constant|constant_value}};
+{%- endif %}
{%- endfor %}
{#--- ForwardToCallback definition #}
@@ -67,7 +72,7 @@ bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
{%- endfor %}
{{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver)
- : receiver_(receiver) {
+ : ControlMessageProxy(receiver) {
}
{#--- Proxy definitions #}
@@ -115,7 +120,7 @@ void {{proxy_name}}::{{method.name}}(
class {{class_name}}_{{method.name}}_ProxyToResponder
: public {{class_name}}::{{method.name}}Callback::Runnable {
public:
- virtual ~{{class_name}}_{{method.name}}_ProxyToResponder() {
+ ~{{class_name}}_{{method.name}}_ProxyToResponder() override {
// Is the Mojo application destroying the callback without running it
// and without first closing the pipe?
bool callback_was_dropped = responder_ && responder_->IsValid();
@@ -159,7 +164,8 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
{%- endfor %}
{{class_name}}Stub::{{class_name}}Stub()
- : sink_(nullptr) {
+ : sink_(nullptr),
+ control_message_handler_({{interface.name}}::Version_) {
}
{{class_name}}Stub::~{{interface.name}}Stub() {}
@@ -167,6 +173,8 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
{#--- Stub definition #}
bool {{class_name}}Stub::Accept(mojo::Message* message) {
+ if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
+ return control_message_handler_.Accept(message);
{%- if interface.methods %}
switch (message->header()->name) {
{%- for method in interface.methods %}
@@ -195,6 +203,8 @@ bool {{class_name}}Stub::Accept(mojo::Message* message) {
bool {{class_name}}Stub::AcceptWithResponder(
mojo::Message* message, mojo::MessageReceiverWithStatus* responder) {
+ if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
+ return control_message_handler_.AcceptWithResponder(message, responder);
{%- if interface.methods %}
switch (message->header()->name) {
{%- for method in interface.methods %}
@@ -234,6 +244,13 @@ bool {{class_name}}Stub::AcceptWithResponder(
bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
assert(sink_);
+
+ if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
+ if (!mojo::internal::ValidateControlRequest(message))
+ return false;
+ return sink_->Accept(message);
+ }
+
switch (message->header()->name) {
{%- for method in interface.methods %}
case internal::k{{class_name}}_{{method.name}}_Name: {
@@ -269,6 +286,13 @@ bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
assert(sink_);
+
+ if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
+ if (!mojo::internal::ValidateControlResponse(message))
+ return false;
+ return sink_->Accept(message);
+ }
+
if (!mojo::internal::ValidateMessageIsResponse(message))
return false;
switch (message->header()->name) {
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl
index 420f6e8..6ba1a16 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_proxy_declaration.tmpl
@@ -1,5 +1,7 @@
{%- import "interface_macros.tmpl" as interface_macros %}
-class {{interface.name}}Proxy : public {{interface.name}} {
+class {{interface.name}}Proxy
+ : public {{interface.name}},
+ public mojo::internal::ControlMessageProxy {
public:
explicit {{interface.name}}Proxy(mojo::MessageReceiverWithResponder* receiver);
@@ -8,7 +10,4 @@ class {{interface.name}}Proxy : public {{interface.name}} {
{{interface_macros.declare_request_params("", method)}}
) override;
{%- endfor %}
-
- private:
- mojo::MessageReceiverWithResponder* receiver_;
};
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl
index 05a2495..c6afa75 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/interface_stub_declaration.tmpl
@@ -11,4 +11,5 @@ class {{interface.name}}Stub : public mojo::MessageReceiverWithResponderStatus {
private:
{{interface.name}}* sink_;
+ mojo::internal::ControlMessageHandler control_message_handler_;
};
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
index 210ee2e..463d260 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.cc.tmpl
@@ -28,14 +28,17 @@
#include "mojo/public/cpp/bindings/lib/validation_util.h"
#include "mojo/public/cpp/environment/lib/scoped_task_tracking.h"
#include "mojo/public/cpp/environment/logging.h"
+#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
{%- for namespace in namespaces_as_array %}
namespace {{namespace}} {
{%- endfor %}
{#--- Constants #}
-{% for constant in module.constants %}
+{%- for constant in module.constants %}
+{%- if not constant.kind|is_integral_kind %}
const {{constant.kind|cpp_pod_type}} {{constant.name}} = {{constant|constant_value}};
+{%- endif %}
{%- endfor %}
namespace internal {
@@ -77,8 +80,12 @@ const uint32_t {{method_name}} = {{method.ordinal}};
{#--- Struct Constants #}
{%- for struct in structs %}
-{% for constant in struct.constants %}
-const {{constant.kind|cpp_pod_type}} {{struct.name}}::{{constant.name}} = {{constant|constant_value}};
+{%- for constant in struct.constants %}
+{%- if constant.kind|is_integral_kind %}
+MOJO_STATIC_CONST_MEMBER_DEFINITION const {{constant.kind|cpp_pod_type}} {{struct.name}}::{{constant.name}};
+{%- else %}
+MOJO_STATIC_CONST_MEMBER_DEFINITION const {{constant.kind|cpp_pod_type}} {{struct.name}}::{{constant.name}} = {{constant|constant_value}};
+{%- endif %}
{%- endfor %}
{%- endfor %}
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl
index 503e19d..d96fb60 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl
@@ -13,6 +13,8 @@
#include "mojo/public/cpp/bindings/interface_impl.h"
#include "mojo/public/cpp/bindings/interface_ptr.h"
#include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
+#include "mojo/public/cpp/bindings/lib/control_message_proxy.h"
#include "mojo/public/cpp/bindings/map.h"
#include "mojo/public/cpp/bindings/message_filter.h"
#include "mojo/public/cpp/bindings/no_interface.h"
@@ -27,16 +29,22 @@
namespace {{namespace}} {
{%- endfor %}
-{#--- Constants #}
-{% for constant in module.constants %}
-extern const {{constant.kind|cpp_pod_type}} {{constant.name}};
-{%- endfor %}
-
{#--- Enums #}
{% for enum in enums %}
{% include "enum_declaration.tmpl" %}
{%- endfor %}
+{#--- Constants #}
+{%- for constant in module.constants %}
+{#- To be consistent with constants defined inside interfaces, only make
+ integral types compile-time constants. #}
+{%- if constant.kind|is_integral_kind %}
+const {{constant.kind|cpp_pod_type}} {{constant.name}} = {{constant|constant_value}};
+{%- else %}
+extern const {{constant.kind|cpp_pod_type}} {{constant.name}};
+{%- endif %}
+{%- endfor %}
+
{#--- Interface Forward Declarations -#}
{% for interface in interfaces %}
class {{interface.name}};
@@ -63,29 +71,6 @@ typedef mojo::StructPtr<{{union.name}}> {{union.name}}Ptr;
{% endif %}
{%- endfor %}
-{#--- Unions must be declared first because they can be members of structs #}
-{#--- Unions #}
-{% for union in unions %}
-{% include "wrapper_union_class_declaration.tmpl" %}
-{%- endfor %}
-
-{#--- NOTE: Non-inlined structs may have pointers to inlined structs, so we #}
-{#--- need to fully define inlined structs ahead of the others. #}
-
-{#--- Inlined structs #}
-{% for struct in structs %}
-{% if struct|should_inline %}
-{% include "wrapper_class_declaration.tmpl" %}
-{% endif %}
-{%- endfor %}
-
-{#--- Non-inlined structs #}
-{% for struct in structs %}
-{% if not struct|should_inline %}
-{% include "wrapper_class_declaration.tmpl" %}
-{% endif %}
-{%- endfor %}
-
{#--- Interfaces -#}
{% for interface in interfaces %}
{% include "interface_declaration.tmpl" %}
@@ -111,6 +96,29 @@ typedef mojo::StructPtr<{{union.name}}> {{union.name}}Ptr;
{% include "interface_response_validator_declaration.tmpl" %}
{%- endfor %}
+{#--- Unions must be declared first because they can be members of structs #}
+{#--- Unions #}
+{% for union in unions %}
+{% include "wrapper_union_class_declaration.tmpl" %}
+{%- endfor %}
+
+{#--- NOTE: Non-inlined structs may have pointers to inlined structs, so we #}
+{#--- need to fully define inlined structs ahead of the others. #}
+
+{#--- Inlined structs #}
+{% for struct in structs %}
+{% if struct|should_inline %}
+{% include "wrapper_class_declaration.tmpl" %}
+{% endif %}
+{%- endfor %}
+
+{#--- Non-inlined structs #}
+{% for struct in structs %}
+{% if not struct|should_inline %}
+{% include "wrapper_class_declaration.tmpl" %}
+{% endif %}
+{%- endfor %}
+
{#--- Struct Serialization Helpers -#}
{% if structs %}
{% for struct in structs %}
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
index 5ea763e..28e6ceb 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_definition.tmpl
@@ -56,7 +56,8 @@
}
{%- endmacro %}
-{#- Validates the specified struct field, which is supposed to be a handle.
+{#- Validates the specified struct field, which is supposed to be a handle or
+ contain a handle (in the case of interfaces).
This macro is expanded by the Validate() method. #}
{%- macro _validate_handle(struct, packed_field) %}
{%- set name = packed_field.field.name %}
@@ -134,7 +135,7 @@ bool {{class_name}}::Validate(const void* data,
{%- set last_checked_version = 0 %}
{%- for packed_field in struct.packed.packed_fields_in_ordinal_order %}
{%- set kind = packed_field.field.kind %}
-{%- if kind|is_object_kind or kind|is_any_handle_kind %}
+{%- if kind|is_object_kind or kind|is_any_handle_kind or kind|is_interface_kind %}
{%- if packed_field.min_version > last_checked_version %}
{%- set last_checked_version = packed_field.min_version %}
if (object->header_.version < {{packed_field.min_version}})
@@ -142,7 +143,7 @@ bool {{class_name}}::Validate(const void* data,
{%- endif %}
{%- if kind|is_object_kind %}
{{_validate_object(struct, packed_field)}}
-{%- elif kind|is_any_handle_kind %}
+{%- else %}
{{_validate_handle(struct, packed_field)}}
{%- endif %}
{%- endif %}
@@ -155,9 +156,11 @@ void {{class_name}}::EncodePointersAndHandles(
std::vector<mojo::Handle>* handles) {
MOJO_CHECK(header_.version == {{struct.versions[-1].version}});
{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
-{%- if pf.field.kind|is_object_kind and not pf.field.kind|is_union_kind %}
+{%- if pf.field.kind|is_union_kind %}
+ {{pf.field.name}}.EncodePointersAndHandles(handles);
+{%- elif pf.field.kind|is_object_kind %}
mojo::internal::Encode(&{{pf.field.name}}, handles);
-{%- elif pf.field.kind|is_any_handle_kind %}
+{%- elif pf.field.kind|is_any_handle_kind or pf.field.kind|is_interface_kind %}
mojo::internal::EncodeHandle(&{{pf.field.name}}, handles);
{%- endif %}
{%- endfor %}
@@ -175,14 +178,14 @@ void {{class_name}}::DecodePointersAndHandles(
{%- for pf in struct.packed.packed_fields_in_ordinal_order %}
{%- set name = pf.field.name %}
{%- set kind = pf.field.kind %}
-{%- if kind|is_object_kind or kind|is_any_handle_kind %}
+{%- if kind|is_object_kind or kind|is_any_handle_kind or kind|is_interface_kind %}
{%- if pf.min_version > last_checked_version %}
{%- set last_checked_version = pf.min_version %}
if (header_.version < {{pf.min_version}})
return;
{%- endif %}
{%- if kind|is_union_kind %}
- // TODO(azani): Decode handles in union.
+ {{name}}.DecodePointersAndHandles(handles);
{%- elif kind|is_object_kind %}
mojo::internal::Decode(&{{name}}, handles);
{%- else %}
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
index e0f2f8e..6c8254e 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
@@ -71,7 +71,7 @@
mojo::internal::VALIDATION_ERROR_UNEXPECTED_NULL_POINTER,
"null {{name}} in {{struct_display_name}}");
{%- endif %}
-{%- elif kind|is_any_handle_kind %}
+{%- elif kind|is_any_handle_kind or kind|is_interface_kind %}
{%- if kind|is_interface_kind %}
mojo::internal::InterfacePointerToData({{input_field}}.Pass(), &{{output}}->{{name}});
{%- elif kind|is_interface_request_kind %}
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl
index f84f60a..8c0e89c 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_declaration.tmpl
@@ -32,14 +32,10 @@ class {{class_name}} {
// a struct." - Section 9.5.2 ISO/IEC 14882:2011 (The C++ Spec)
union MOJO_ALIGNAS(8) Union_ {
{%- for field in union.fields %}
-{%- if field.kind|is_object_kind %}
- uint64_t f_{{field.name}};
-{%- elif field.kind.spec == 'b' %}
+{%- if field.kind.spec == 'b' %}
uint8_t f_{{field.name}} : 1;
-{%- elif field.kind|is_enum_kind %}
- int32_t f_{{field.name}};
{%- else %}
- {{field.kind|cpp_pod_type}} f_{{field.name}};
+ {{field.kind|cpp_union_field_type}} f_{{field.name}};
{%- endif %}
{%- endfor %}
uint64_t unknown;
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl
index 9ddcc51..487d2a5 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_definition.tmpl
@@ -60,11 +60,9 @@ void {{class_name}}::EncodePointersAndHandles(
switch (tag) {
{%- for field in union.fields %}
case {{enum_name}}::{{field.name|upper}}: {
-{%- if field.kind|is_object_kind and not field.kind|is_union_kind %}
- mojo::internal::Encode(
- reinterpret_cast<{{field.kind|cpp_field_type}}*>(&data.f_{{field.name}}),
- handles);
-{%- elif field.kind|is_any_handle_kind %}
+{%- if field.kind|is_object_kind %}
+ mojo::internal::Encode(&data.f_{{field.name}}, handles);
+{%- elif field.kind|is_any_handle_kind or field.kind|is_interface_kind %}
mojo::internal::EncodeHandle(&data.f_{{field.name}}, handles);
{%- endif %}
return;
@@ -78,11 +76,9 @@ void {{class_name}}::DecodePointersAndHandles(
switch (tag) {
{%- for field in union.fields %}
case {{enum_name}}::{{field.name|upper}}: {
-{%- if field.kind|is_object_kind and not field.kind|is_union_kind %}
- mojo::internal::Decode(
- reinterpret_cast<{{field.kind|cpp_field_type}}*>(&data.f_{{field.name}}),
- handles);
-{%- elif field.kind|is_any_handle_kind %}
+{%- if field.kind|is_object_kind %}
+ mojo::internal::Decode(&data.f_{{field.name}}, handles);
+{%- elif field.kind|is_any_handle_kind or field.kind|is_interface_kind %}
mojo::internal::DecodeHandle(&data.f_{{field.name}}, handles);
{%- endif %}
return;
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl
index 7df17c1..c9cc307 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl
@@ -12,7 +12,11 @@ size_t GetSerializedSize_(const {{union.name}}Ptr& input, bool inlined) {
{% for field in union.fields %}
{% if field.kind|is_object_kind %}
case {{union.name}}::Tag::{{field.name|upper}}:
+{% if field.kind|is_union_kind %}
+ size += GetSerializedSize_(*(input_acc.data()->{{field.name}}), false);
+{% else %}
size += GetSerializedSize_(*(input_acc.data()->{{field.name}}));
+{% endif %}
break;
{%- endif %}
{%- endfor %}
@@ -38,24 +42,34 @@ void SerializeUnion_({{union.name}}Ptr input, mojo::internal::Buffer* buf,
{% for field in union.fields %}
case {{union.name}}::Tag::{{field.name|upper}}: {
{% if field.kind|is_object_kind %}
- {{field.kind|cpp_field_type}}* {{field.name}}_ptr = reinterpret_cast<{{field.kind|cpp_field_type}}*>(&result->data.f_{{field.name}});
{% if field.kind|is_string_kind %}
- Serialize_(*(input_acc.data()->{{field.name}}), buf, &{{field.name}}_ptr->ptr);
+ Serialize_(
+ *(input_acc.data()->{{field.name}}),
+ buf, &result->data.f_{{field.name}}.ptr);
{% elif field.kind|is_struct_kind %}
- Serialize_(mojo::internal::Forward(*(input_acc.data()->{{field.name}})), buf, &{{field.name}}_ptr->ptr);
+ Serialize_(
+ mojo::internal::Forward(*(input_acc.data()->{{field.name}})),
+ buf, &result->data.f_{{field.name}}.ptr);
+{% elif field.kind|is_union_kind %}
+ SerializeUnion_(
+ mojo::internal::Forward(*(input_acc.data()->{{field.name}})),
+ buf, &result->data.f_{{field.name}}.ptr, false);
{% elif field.kind|is_array_kind %}
const mojo::internal::ArrayValidateParams {{field.name}}_validate_params =
{{field.kind|get_array_validate_params|indent(16)}};
SerializeArray_(
mojo::internal::Forward(*(input_acc.data()->{{field.name}})),
- buf, &{{field.name}}_ptr->ptr, &{{field.name}}_validate_params);
+ buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_params);
{% elif field.kind|is_map_kind %}
const mojo::internal::ArrayValidateParams {{field.name}}_validate_params =
{{field.kind.value_kind|get_map_validate_params|indent(16)}};
SerializeMap_(
mojo::internal::Forward(*(input_acc.data()->{{field.name}})),
- buf, &{{field.name}}_ptr->ptr, &{{field.name}}_validate_params);
+ buf, &result->data.f_{{field.name}}.ptr, &{{field.name}}_validate_params);
{%- endif %}
+{% elif field.kind|is_any_handle_kind %}
+ result->data.f_{{field.name}} =
+ input_acc.data()->{{field.name}}->release().value();
{% else %}
result->data.f_{{field.name}} = input_acc.data()->{{field.name}};
{%- endif %}
@@ -81,8 +95,13 @@ void Deserialize_(internal::{{union.name}}_Data* input,
case {{union.name}}::Tag::{{field.name|upper}}: {
{% if field.kind|is_object_kind %}
result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}});
- {{field.kind|cpp_field_type}}* {{field.name}}_ptr = reinterpret_cast<{{field.kind|cpp_field_type}}*>(&input->data.f_{{field.name}});
- Deserialize_({{field.name}}_ptr->ptr, result_acc.data()->{{field.name}});
+ Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{{field.name}});
+{% elif field.kind|is_any_handle_kind %}
+ {{field.kind|cpp_wrapper_type}}* {{field.name}} =
+ reinterpret_cast<{{field.kind|cpp_wrapper_type}}*>(&input->data.f_{{field.name}});
+ result->set_{{field.name}}({{field.name}}->Pass());
+{% elif field.kind|is_enum_kind %}
+ result->set_{{field.name}}(static_cast<{{field.kind|cpp_wrapper_type}}>(input->data.f_{{field.name}}));
{% else %}
result->set_{{field.name}}(input->data.f_{{field.name}});
{%- endif %}
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl
index 0c4443e..d12c54b 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/validation_macros.tmpl
@@ -25,9 +25,26 @@ if (!{{field.kind|cpp_wrapper_type}}::Data_::Validate(
}
{%- endmacro %}
+{%- macro validate_handle(field_expr, field, object_name) -%}
+ const mojo::Handle {{field.name}}_handle(object->data.f_{{field.name}});
+
+{%- if not field.kind|is_nullable_kind %}
+ if ({{field.name}}_handle.value() == mojo::internal::kEncodedInvalidHandleValue) {
+ ReportValidationError(
+ mojo::internal::VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE,
+ "invalid {{field.name}} field in {{object_name}}");
+ return false;
+ }
+{%- endif %}
+ if (!bounds_checker->ClaimHandle({{field.name}}_handle)) {
+ ReportValidationError(mojo::internal::VALIDATION_ERROR_ILLEGAL_HANDLE);
+ return false;
+ }
+{%- endmacro -%}
+
{%- macro validate_union_field(field, union) %}
{%- set field_expr = "(reinterpret_cast<const "
- ~ field.kind|cpp_field_type
+ ~ field.kind|cpp_union_field_type
~ "*>(&object->data.f_"
~ field.name
~ "))" -%}
@@ -41,5 +58,9 @@ if (!{{field.kind|cpp_wrapper_type}}::Data_::Validate(
{%- if field.kind|is_array_kind or field.kind|is_string_kind -%}
{{ validate_array_or_string(field_expr, field) }}
{%- endif %}
+
+{%- if field.kind|is_any_handle_kind -%}
+{{ validate_handle(field_expr, field, union.name) }}
+{%- endif %}
return true;
{%- endmacro %}
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl
index 6242be4..47e2df8 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_class_declaration.tmpl
@@ -3,15 +3,21 @@ class {{struct.name}} {
public:
using Data_ = internal::{{struct.name}}_Data;
-{#--- Constants #}
-{%- for constant in struct.constants %}
- static const {{constant.kind|cpp_pod_type}} {{constant.name}};
-{%- endfor %}
{#--- Enums #}
{%- for enum in struct.enums -%}
{% macro enum_def() %}{% include "enum_declaration.tmpl" %}{% endmacro %}
{{enum_def()|indent(2)}}
{%- endfor %}
+
+{#--- Constants #}
+{%- for constant in struct.constants %}
+{%- if constant.kind|is_integral_kind %}
+ static const {{constant.kind|cpp_pod_type}} {{constant.name}} = {{constant|constant_value}};
+{%- else %}
+ static const {{constant.kind|cpp_pod_type}} {{constant.name}};
+{%- endif %}
+{%- endfor %}
+
static {{struct.name}}Ptr New();
template <typename U>
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl
index 2b4a7dd..2f931bf 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl
@@ -39,7 +39,7 @@ class {{union.name}} {
Union_() {}
~Union_() {}
{% for field in union.fields %}
-{% if field.kind|is_object_kind -%}
+{% if field.kind|is_object_kind or field.kind|is_any_handle_kind -%}
{{field.kind|cpp_wrapper_type}}* {{field.name}};
{% else -%}
{{field.kind|cpp_wrapper_type}} {{field.name}};
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
index 4355f41..cb4e785 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl
@@ -43,7 +43,7 @@ bool {{union.name}}::Equals(const {{union.name}}& other) const {
switch (tag_) {
{% for field in union.fields %}
case Tag::{{field.name|upper}}:
-{% if field.kind|is_object_kind %}
+{% if field.kind|is_object_kind or field.kind|is_any_handle_kind %}
return mojo::internal::ValueTraits<{{field.kind|cpp_wrapper_type}}>::Equals(*(data_.{{field.name}}), *(other.data_.{{field.name}}));
{%- else %}
return mojo::internal::ValueTraits<{{field.kind|cpp_wrapper_type}}>::Equals(data_.{{field.name}}, other.data_.{{field.name}});
@@ -61,7 +61,7 @@ bool {{union.name}}::is_{{field.name}}() const {
{{field.kind|cpp_union_getter_return_type}} {{union.name}}::get_{{field.name}}() const {
MOJO_DCHECK(tag_ == Tag::{{field.name|upper}});
-{% if field.kind|is_object_kind %}
+{% if field.kind|is_object_kind or field.kind|is_any_handle_kind %}
return *(data_.{{field.name}});
{%- else %}
return data_.{{field.name}};
@@ -74,6 +74,8 @@ void {{union.name}}::set_{{field.name}}({{field.kind|cpp_const_wrapper_type}} {{
*(data_.{{field.name}}) = {{field.name}};
{% elif field.kind|is_object_kind %}
*(data_.{{field.name}}) = {{field.name}}.Pass();
+{% elif field.kind|is_any_handle_kind %}
+ data_.{{field.name}}->reset({{field.name}}.release());
{%- else %}
data_.{{field.name}} = {{field.name}};
{%- endif %}
@@ -93,7 +95,7 @@ void {{union.name}}::SetActive(Tag new_active) {
switch (new_active) {
{% for field in union.fields %}
case Tag::{{field.name|upper}}:
-{% if field.kind|is_object_kind %}
+{% if field.kind|is_object_kind or field.kind|is_any_handle_kind %}
data_.{{field.name}} = new {{field.kind|cpp_wrapper_type}}();
{%- endif %}
break;
@@ -107,7 +109,7 @@ void {{union.name}}::DestroyActive() {
switch (tag_) {
{% for field in union.fields %}
case Tag::{{field.name|upper}}:
-{% if field.kind|is_object_kind %}
+{% if field.kind|is_object_kind or field.kind|is_any_handle_kind %}
delete data_.{{field.name}};
{%- endif %}
break;
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/struct.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/struct.tmpl
index 5e10011..f523ba6 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/struct.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/go_templates/struct.tmpl
@@ -158,7 +158,7 @@ if pointer{{level}} == 0 {
{{decodePointerValue(value, kind, level)|tab_indent()}}
}
{% endif %}
-{% elif kind|is_handle %}
+{% elif kind|is_handle or kind|is_interface %}
handle{{level}}, err := decoder.Read{{kind|decode_suffix}}()
if err != nil {
return err
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl
index d666e66..be9b7d3 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/interface_definition.tmpl
@@ -62,6 +62,10 @@ public static final {{manager_class(interface, True)}} MANAGER =
return "{{namespace|replace(".","::")}}::{{interface.name}}";
}
+ public int getVersion() {
+ return {{interface.version}};
+ }
+
public Proxy buildProxy(org.chromium.mojo.system.Core core,
org.chromium.mojo.bindings.MessageReceiverWithResponder messageReceiver) {
return new Proxy(core, messageReceiver);
@@ -78,8 +82,6 @@ public static final {{manager_class(interface, True)}} MANAGER =
{%- endmacro -%}
{%- macro accept_body(interface, with_response) -%}
-{% if (interface|has_method_with_response and with_response) or
- (interface|has_method_without_response and not with_response) %}
try {
org.chromium.mojo.bindings.ServiceMessage messageWithHeader =
message.asServiceMessage();
@@ -88,6 +90,15 @@ try {
return false;
}
switch(header.getType()) {
+{% if with_response %}
+ case org.chromium.mojo.bindings.InterfaceControlMessagesConstants.RUN_MESSAGE_ID:
+ return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRun(
+ getCore(), {{interface|name}}_Internal.MANAGER, messageWithHeader, receiver);
+{% else %}
+ case org.chromium.mojo.bindings.InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID:
+ return org.chromium.mojo.bindings.InterfaceControlMessagesHelper.handleRunOrClosePipe(
+ {{interface|name}}_Internal.MANAGER, messageWithHeader);
+{% endif %}
{% for method in interface.methods %}
{% if (with_response and method.response_parameters != None) or
(not with_response and method.response_parameters == None) %}
@@ -113,9 +124,6 @@ try {
} catch (org.chromium.mojo.bindings.DeserializationException e) {
return false;
}
-{% else %}
-return false;
-{% endif %}
{%- endmacro -%}
{% macro interface_def(interface) %}
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/struct_definition.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/struct_definition.tmpl
index f0cb982..76c07fd 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/struct_definition.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/java_templates/struct_definition.tmpl
@@ -132,17 +132,21 @@ if (decoder{{level+1}} == null) {
{% endfor %}
{% endif %}
- public {{struct|name}}() {
- super(STRUCT_SIZE);
+ private {{struct|name}}(int version) {
+ super(STRUCT_SIZE, version);
{% for field in struct.fields %}
{% if field.default %}
{{field|name}} = {{field|default_value}};
-{% elif field.kind|is_handle %}
+{% elif field.kind|is_any_handle_kind and not field.kind|is_interface_request_kind %}
{{field|name}} = org.chromium.mojo.system.InvalidHandle.INSTANCE;
{% endif %}
{% endfor %}
}
+ public {{struct|name}}() {
+ this({{struct.versions[-1].version}});
+ }
+
public static {{struct|name}} deserialize(org.chromium.mojo.bindings.Message message) {
return decode(new org.chromium.mojo.bindings.Decoder(message));
}
@@ -152,12 +156,8 @@ if (decoder{{level+1}} == null) {
if (decoder0 == null) {
return null;
}
- {{struct|name}} result = new {{struct|name}}();
-{% if not struct.bytes %}
- decoder0.readAndValidateDataHeader(VERSION_ARRAY);
-{% else %}
DataHeader mainDataHeader = decoder0.readAndValidateDataHeader(VERSION_ARRAY);
-{% endif %}
+ {{struct|name}} result = new {{struct|name}}(mainDataHeader.elementsOrVersion);
{% for byte in struct.bytes %}
{% for packed_field in byte.packed_fields %}
if (mainDataHeader.elementsOrVersion >= {{packed_field.min_version}}) {
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
index b5bf6a4..70dc94b 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
@@ -108,7 +108,7 @@ def GetCppArrayArgWrapperType(kind):
raise Exception("Arrays of interface requests not yet supported!")
if mojom.IsStringKind(kind):
return "mojo::String"
- if mojom.IsHandleKind(kind):
+ if mojom.IsGenericHandleKind(kind):
return "mojo::ScopedHandle"
if mojom.IsDataPipeConsumerKind(kind):
return "mojo::ScopedDataPipeConsumerHandle"
@@ -123,7 +123,7 @@ def GetCppArrayArgWrapperType(kind):
def GetCppResultWrapperType(kind):
if mojom.IsEnumKind(kind):
return GetNameForKind(kind)
- if mojom.IsStructKind(kind):
+ if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
return "%sPtr" % GetNameForKind(kind)
if mojom.IsArrayKind(kind):
return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind)
@@ -136,7 +136,7 @@ def GetCppResultWrapperType(kind):
return "mojo::InterfaceRequest<%s>" % GetNameForKind(kind.kind)
if mojom.IsStringKind(kind):
return "mojo::String"
- if mojom.IsHandleKind(kind):
+ if mojom.IsGenericHandleKind(kind):
return "mojo::ScopedHandle"
if mojom.IsDataPipeConsumerKind(kind):
return "mojo::ScopedDataPipeConsumerHandle"
@@ -164,7 +164,7 @@ def GetCppWrapperType(kind):
raise Exception("InterfaceRequest fields not supported!")
if mojom.IsStringKind(kind):
return "mojo::String"
- if mojom.IsHandleKind(kind):
+ if mojom.IsGenericHandleKind(kind):
return "mojo::ScopedHandle"
if mojom.IsDataPipeConsumerKind(kind):
return "mojo::ScopedDataPipeConsumerHandle"
@@ -177,7 +177,7 @@ def GetCppWrapperType(kind):
return _kind_to_cpp_type[kind]
def GetCppConstWrapperType(kind):
- if mojom.IsStructKind(kind):
+ if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
return "%sPtr" % GetNameForKind(kind)
if mojom.IsArrayKind(kind):
return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind)
@@ -192,7 +192,7 @@ def GetCppConstWrapperType(kind):
return GetNameForKind(kind)
if mojom.IsStringKind(kind):
return "const mojo::String&"
- if mojom.IsHandleKind(kind):
+ if mojom.IsGenericHandleKind(kind):
return "mojo::ScopedHandle"
if mojom.IsDataPipeConsumerKind(kind):
return "mojo::ScopedDataPipeConsumerHandle"
@@ -227,18 +227,23 @@ def GetCppFieldType(kind):
return "mojo::internal::StringPointer"
return _kind_to_cpp_type[kind]
+def GetCppUnionFieldType(kind):
+ if mojom.IsAnyHandleKind(kind):
+ return "MojoHandle"
+ if mojom.IsEnumKind(kind):
+ return "int32_t"
+ if mojom.IsUnionKind(kind):
+ return ("mojo::internal::UnionPointer<%s_Data>" %
+ GetNameForKind(kind, internal=True))
+ return GetCppFieldType(kind)
+
def GetUnionGetterReturnType(kind):
- if (mojom.IsStructKind(kind) or mojom.IsArrayKind(kind) or
- mojom.IsMapKind(kind)):
+ if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind) or
+ mojom.IsArrayKind(kind) or mojom.IsMapKind(kind) or
+ mojom.IsAnyHandleKind(kind)):
return "%s&" % GetCppWrapperType(kind)
return GetCppResultWrapperType(kind)
-def IsStructWithHandles(struct):
- for pf in struct.packed.packed_fields:
- if mojom.IsAnyHandleKind(pf.field.kind):
- return True
- return False
-
def TranslateConstants(token, kind):
if isinstance(token, mojom.NamedValue):
# Both variable and enum constants are constructed like:
@@ -338,6 +343,7 @@ class Generator(generator.Generator):
"constant_value": ConstantValue,
"cpp_const_wrapper_type": GetCppConstWrapperType,
"cpp_field_type": GetCppFieldType,
+ "cpp_union_field_type": GetCppUnionFieldType,
"cpp_pod_type": GetCppPodType,
"cpp_result_type": GetCppResultWrapperType,
"cpp_type": GetCppType,
@@ -355,6 +361,7 @@ class Generator(generator.Generator):
"is_array_kind": mojom.IsArrayKind,
"is_cloneable_kind": mojom.IsCloneableKind,
"is_enum_kind": mojom.IsEnumKind,
+ "is_integral_kind": mojom.IsIntegralKind,
"is_move_only_kind": mojom.IsMoveOnlyKind,
"is_any_handle_kind": mojom.IsAnyHandleKind,
"is_interface_kind": mojom.IsInterfaceKind,
@@ -364,7 +371,6 @@ class Generator(generator.Generator):
"is_object_kind": mojom.IsObjectKind,
"is_string_kind": mojom.IsStringKind,
"is_struct_kind": mojom.IsStructKind,
- "is_struct_with_handles": IsStructWithHandles,
"is_union_kind": mojom.IsUnionKind,
"struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE,
"stylize_method": generator.StudlyCapsToCamel,
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_dart_generator.py b/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_dart_generator.py
index ac27fa1..2004010 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_dart_generator.py
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_dart_generator.py
@@ -371,7 +371,6 @@ class Generator(generator.Generator):
'default_value': DartDefaultValue,
'encode_method': EncodeMethod,
'expression_to_text': ExpressionToText,
- 'is_handle': mojom.IsNonInterfaceHandleKind,
'is_map_kind': mojom.IsMapKind,
'is_nullable_kind': mojom.IsNullableKind,
'is_pointer_array_kind': IsPointerArrayKind,
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_go_generator.py b/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_go_generator.py
index 183ecd2..1df4eb5 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_go_generator.py
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_go_generator.py
@@ -211,7 +211,7 @@ def AddImport(module, element):
AddImport(module, element.key_kind)
AddImport(module, element.value_kind)
return
- if mojom.IsNonInterfaceHandleKind(element):
+ if mojom.IsAnyHandleKind(element):
_imports['mojo/public/go/system'] = 'system'
return
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_java_generator.py b/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_java_generator.py
index 17a62c2..78079f3 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_java_generator.py
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/mojom_java_generator.py
@@ -399,7 +399,8 @@ class Generator(generator.Generator):
'has_method_with_response': HasMethodWithResponse,
'interface_response_name': GetInterfaceResponseName,
'is_array_kind': mojom.IsArrayKind,
- 'is_handle': mojom.IsNonInterfaceHandleKind,
+ 'is_any_handle_kind': mojom.IsAnyHandleKind,
+ 'is_interface_request_kind': mojom.IsInterfaceRequestKind,
'is_map_kind': mojom.IsMapKind,
'is_nullable_kind': mojom.IsNullableKind,
'is_pointer_array_kind': IsPointerArrayKind,
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/generators/python_templates/module.py.tmpl b/third_party/mojo/src/mojo/public/tools/bindings/generators/python_templates/module.py.tmpl
index bb0b99d..2a22932 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/generators/python_templates/module.py.tmpl
+++ b/third_party/mojo/src/mojo/public/tools/bindings/generators/python_templates/module.py.tmpl
@@ -6,6 +6,9 @@
import mojo_bindings.descriptor as _descriptor
import mojo_bindings.reflection as _reflection
+{% if interfaces %}
+import mojo_bindings.interface_reflection as _interface_reflection
+{% endif %}
{% if imports %}
{% for import in imports %}
@@ -34,9 +37,10 @@ class {{struct|name}}(object):
{% for interface in interfaces %}
class {{interface|name}}(object):
- __metaclass__ = _reflection.MojoInterfaceType
+ __metaclass__ = _interface_reflection.MojoInterfaceType
DESCRIPTOR = {
'fully_qualified_name': '{% if namespace %}{{namespace|replace(".","::")}}::{% endif %}{{interface|fully_qualified_name|replace(".","::")}}',
+ 'version': {{interface.version}},
'methods': [
{% for method in interface.methods %}
{
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/mojom.gni b/third_party/mojo/src/mojo/public/tools/bindings/mojom.gni
index d00f632..51c28de 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/mojom.gni
+++ b/third_party/mojo/src/mojo/public/tools/bindings/mojom.gni
@@ -143,7 +143,7 @@ template("mojom") {
[ "{{source_gen_dir}}/{{source_name_part}}.mojom.srcjar" ]
}
generator_dart_zip_output = "$target_out_dir/$target_name.dartzip"
- generator_python_zip_output = "$target_out_dir/$target_name.pyzip"
+ generator_python_zip_output = "$target_out_dir/${target_name}_python.pyzip"
rebased_mojo_sdk_public_deps = []
if (defined(invoker.mojo_sdk_public_deps)) {
@@ -163,20 +163,9 @@ template("mojom") {
}
}
- if (defined(invoker.visibility)) {
- # Need to save this because the the target_name is overwritten inside the
- # action to be that of the action itself. Only define this in the case the
- # var is used to avoid unused var error.
- target_visibility = [ ":$target_name" ]
- }
-
if (defined(invoker.sources)) {
generator_target_name = target_name + "__generator"
action_foreach(generator_target_name) {
- if (defined(invoker.visibility)) {
- visibility = target_visibility + invoker.visibility +
- [ ":${cpp_sources_target_name}" ]
- }
script = generator_script
inputs = generator_sources
sources = invoker.sources
@@ -238,10 +227,7 @@ template("mojom") {
if (defined(invoker.deps)) {
deps += invoker.deps
}
- data_deps = [
- ":${target_name}_python",
- ":${target_name}_dart",
- ]
+ data_deps = [ ":${target_name}_dart" ]
if (defined(invoker.mojo_sdk_deps)) {
foreach(sdk_dep, invoker.mojo_sdk_deps) {
# Check that the SDK dep was not mistakenly given as an absolute path.
@@ -291,7 +277,7 @@ template("mojom") {
dep_name = get_label_info(d, "name")
dep_target_out_dir = get_label_info(d, "target_out_dir")
deps += [ "${full_name}_python" ]
- zip_inputs += [ "$dep_target_out_dir/$dep_name.pyzip" ]
+ zip_inputs += [ "$dep_target_out_dir/${dep_name}_python.pyzip" ]
}
output = generator_python_zip_output
@@ -366,9 +352,6 @@ template("mojom") {
# this target *except* mojo/public/cpp/bindings and other *_cpp_sources
# targets.
source_set(cpp_sources_target_name) {
- if (defined(invoker.visibility)) {
- visibility = target_visibility + invoker.visibility
- }
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
@@ -377,6 +360,9 @@ template("mojom") {
rebase_path([ "mojo/public/build/config:mojo_sdk" ], ".", mojo_root)
deps = [
":$generator_target_name",
+ rebase_path("mojo/public/interfaces/bindings:bindings__generator",
+ ".",
+ mojo_root),
]
foreach(d, all_deps) {
# Resolve the name, so that a target //mojo/something becomes
@@ -391,6 +377,22 @@ template("mojom") {
if (is_android) {
import("//build/config/android/rules.gni")
+ java_srcjar_target_name = target_name + "_java_sources"
+ action(java_srcjar_target_name) {
+ script = rebase_path("mojo/public/tools/gn/zip.py", ".", mojo_root)
+ inputs = process_file_template(invoker.sources, generator_java_outputs)
+ output = "$target_gen_dir/$target_name.srcjar"
+ outputs = [
+ output,
+ ]
+ rebase_inputs = rebase_path(inputs, root_build_dir)
+ rebase_output = rebase_path(output, root_build_dir)
+ args = [
+ "--zip-inputs=$rebase_inputs",
+ "--output=$rebase_output",
+ ]
+ }
+
java_target_name = target_name + "_java"
android_library(java_target_name) {
deps = rebase_path([
@@ -408,9 +410,7 @@ template("mojom") {
deps += [ "${full_name}_java" ]
}
- if (defined(invoker.sources)) {
- srcjars = process_file_template(invoker.sources, generator_java_outputs)
- }
+ srcjar_deps = [ ":$java_srcjar_target_name" ]
}
}
}
diff --git a/third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/generate/module.py b/third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/generate/module.py
index 6c7432d..4699fc1 100644
--- a/third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/generate/module.py
+++ b/third_party/mojo/src/mojo/public/tools/bindings/pylib/mojom/generate/module.py
@@ -278,6 +278,8 @@ class Map(ReferenceKind):
raise Exception("Structs cannot be keys in maps.")
if IsAnyHandleKind(key_kind):
raise Exception("Handles cannot be keys in maps.")
+ if IsInterfaceKind(key_kind):
+ raise Exception("Interfaces cannot be keys in maps.")
if IsArrayKind(key_kind):
raise Exception("Arrays cannot be keys in maps.")
else:
@@ -436,11 +438,23 @@ def IsFloatKind(kind):
return kind.spec == FLOAT.spec
+def IsIntegralKind(kind):
+ return (kind.spec == BOOL.spec or
+ kind.spec == INT8.spec or
+ kind.spec == INT16.spec or
+ kind.spec == INT32.spec or
+ kind.spec == INT64.spec or
+ kind.spec == UINT8.spec or
+ kind.spec == UINT16.spec or
+ kind.spec == UINT32.spec or
+ kind.spec == UINT64.spec)
+
+
def IsStringKind(kind):
return kind.spec == STRING.spec or kind.spec == NULLABLE_STRING.spec
-def IsHandleKind(kind):
+def IsGenericHandleKind(kind):
return kind.spec == HANDLE.spec or kind.spec == NULLABLE_HANDLE.spec
@@ -502,27 +516,20 @@ def IsObjectKind(kind):
IsMapKind(kind) or IsUnionKind(kind))
-def IsNonInterfaceHandleKind(kind):
- return (IsHandleKind(kind) or
+# Please note that interface is not considered as handle kind, since it is an
+# aggregate type consisting of a handle and a version number.
+def IsAnyHandleKind(kind):
+ return (IsGenericHandleKind(kind) or
IsDataPipeConsumerKind(kind) or
IsDataPipeProducerKind(kind) or
IsMessagePipeKind(kind) or
- IsSharedBufferKind(kind))
-
-
-# TODO(yzshen): consider to make the handle-related type checks more clear:
-# - rename IsHandleKind to IsGenericHandleKind.
-# - change IsAnyHandleKind to exclude interface.
-# - remove IsNonInterfaceHandleKind.
-def IsAnyHandleKind(kind):
- return (IsNonInterfaceHandleKind(kind) or
- IsInterfaceKind(kind) or
+ IsSharedBufferKind(kind) or
IsInterfaceRequestKind(kind))
def IsMoveOnlyKind(kind):
return (not IsStringKind(kind) and IsObjectKind(kind)) or \
- IsAnyHandleKind(kind)
+ IsAnyHandleKind(kind) or IsInterfaceKind(kind)
def IsCloneableKind(kind):
@@ -531,7 +538,7 @@ def IsCloneableKind(kind):
# No need to examine the kind again.
return False
visited_kinds.add(kind)
- if IsAnyHandleKind(kind):
+ if IsAnyHandleKind(kind) or IsInterfaceKind(kind):
return True
if IsArrayKind(kind):
return ContainsHandles(kind.kind, visited_kinds)
@@ -539,6 +546,10 @@ def IsCloneableKind(kind):
for field in kind.fields:
if ContainsHandles(field.kind, visited_kinds):
return True
+ if IsMapKind(kind):
+ # No need to examine the key kind, only primitive kinds and non-nullable
+ # string are allowed to be key kinds.
+ return ContainsHandles(kind.value_kind, visited_kinds)
return False
return not ContainsHandles(kind, set())
diff --git a/third_party/mojo/src/mojo/public/tools/gn/unzip.py b/third_party/mojo/src/mojo/public/tools/gn/unzip.py
new file mode 100755
index 0000000..988fc08
--- /dev/null
+++ b/third_party/mojo/src/mojo/public/tools/gn/unzip.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+#
+# Copyright 2015 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.
+
+"""Extracts a set of zip archives. """
+
+import ast
+import optparse
+import os
+import sys
+import zipfile
+
+def DoUnzip(inputs, output):
+ if not os.path.exists(output):
+ os.makedirs(output)
+ for i in inputs:
+ with zipfile.ZipFile(i) as zf:
+ zf.extractall(output)
+
+
+def main():
+ parser = optparse.OptionParser()
+
+ parser.add_option('--inputs', help='List of archives to extract.')
+ parser.add_option('--output', help='Path to unzip the archives to.')
+ parser.add_option('--timestamp', help='Path to a timestamp file.')
+
+ options, _ = parser.parse_args()
+
+ inputs = []
+ if (options.inputs):
+ inputs = ast.literal_eval(options.inputs)
+
+ DoUnzip(inputs, options.output)
+
+ if options.timestamp:
+ if os.path.exists(options.timestamp):
+ os.utime(options.timestamp, None)
+ else:
+ with open(options.timestamp, 'a'):
+ pass
+
+if __name__ == '__main__':
+ sys.exit(main())