diff options
author | rockot <rockot@chromium.org> | 2015-05-13 19:07:14 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-14 02:07:24 +0000 |
commit | d24477996ef10584ced040a13f82e7c7dc0216b1 (patch) | |
tree | 909956d053475acad41999ee93e75241468ef90c /third_party | |
parent | 32bef8c15d2a2055cf7cee0b186c3350a97d7c91 (diff) | |
download | chromium_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')
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, ¶ms_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, ¶ms_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(), ¶ms); + 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(), ¶ms); + 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()) |