summaryrefslogtreecommitdiffstats
path: root/mojo/public
diff options
context:
space:
mode:
authordarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-11 05:12:03 +0000
committerdarin@chromium.org <darin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-11 05:12:03 +0000
commit5456e86fde1b183de6f974af564aca6b7bc4fd97 (patch)
treef01530d14558e369081127b0eb79f7368f56a85e /mojo/public
parent2b6eb3dae3e21887c889676941c7009372833313 (diff)
downloadchromium_src-5456e86fde1b183de6f974af564aca6b7bc4fd97.zip
chromium_src-5456e86fde1b183de6f974af564aca6b7bc4fd97.tar.gz
chromium_src-5456e86fde1b183de6f974af564aca6b7bc4fd97.tar.bz2
Mojo: Add support for InterfacePtr as a struct member
BUG=392693 Review URL: https://codereview.chromium.org/376383002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282555 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo/public')
-rw-r--r--mojo/public/cpp/bindings/tests/handle_passing_unittest.cc27
-rw-r--r--mojo/public/interfaces/bindings/tests/sample_factory.mojom3
-rw-r--r--mojo/public/interfaces/bindings/tests/sample_import.mojom1
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl5
-rw-r--r--mojo/public/tools/bindings/generators/mojom_cpp_generator.py2
5 files changed, 37 insertions, 1 deletions
diff --git a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
index 99eddf8..ab2e475 100644
--- a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
@@ -26,6 +26,24 @@ class StringRecorder {
std::string* buf_;
};
+class ImportedInterfaceImpl
+ : public InterfaceImpl<imported::ImportedInterface> {
+ public:
+ virtual void OnConnectionError() MOJO_OVERRIDE {
+ delete this;
+ }
+
+ virtual void DoSomething() MOJO_OVERRIDE {
+ do_something_count_++;
+ }
+
+ static int do_something_count() { return do_something_count_; }
+
+ private:
+ static int do_something_count_;
+};
+int ImportedInterfaceImpl::do_something_count_ = 0;
+
class SampleNamedObjectImpl : public InterfaceImpl<sample::NamedObject> {
public:
virtual void OnConnectionError() MOJO_OVERRIDE {
@@ -75,6 +93,9 @@ class SampleFactoryImpl : public InterfaceImpl<sample::Factory> {
response->x = 2;
response->pipe = pipe0.Pass();
client()->DidStuff(response.Pass(), text1);
+
+ if (request->obj.get())
+ request->obj->DoSomething();
}
virtual void DoStuff2(ScopedDataPipeConsumerHandle pipe) MOJO_OVERRIDE {
@@ -194,16 +215,22 @@ TEST_F(HandlePassingTest, Basic) {
MessagePipe pipe1;
EXPECT_TRUE(WriteTextMessage(pipe1.handle1.get(), kText2));
+ imported::ImportedInterfacePtr imported;
+ BindToProxy(new ImportedInterfaceImpl(), &imported);
+
sample::RequestPtr request(sample::Request::New());
request->x = 1;
request->pipe = pipe1.handle0.Pass();
+ request->obj = imported.Pass();
factory->DoStuff(request.Pass(), pipe0.handle0.Pass());
EXPECT_FALSE(factory_client.got_response());
+ int count_before = ImportedInterfaceImpl::do_something_count();
PumpMessages();
EXPECT_TRUE(factory_client.got_response());
+ EXPECT_EQ(1, ImportedInterfaceImpl::do_something_count() - count_before);
}
TEST_F(HandlePassingTest, PassInvalid) {
diff --git a/mojo/public/interfaces/bindings/tests/sample_factory.mojom b/mojo/public/interfaces/bindings/tests/sample_factory.mojom
index 9385ee4..9707828 100644
--- a/mojo/public/interfaces/bindings/tests/sample_factory.mojom
+++ b/mojo/public/interfaces/bindings/tests/sample_factory.mojom
@@ -14,6 +14,9 @@ struct Request {
int32 x;
handle<message_pipe> pipe;
handle<message_pipe>[] more_pipes;
+
+ // Interfaces can be used as members.
+ imported.ImportedInterface obj;
};
struct Response {
diff --git a/mojo/public/interfaces/bindings/tests/sample_import.mojom b/mojo/public/interfaces/bindings/tests/sample_import.mojom
index fddd587..9b40cd1 100644
--- a/mojo/public/interfaces/bindings/tests/sample_import.mojom
+++ b/mojo/public/interfaces/bindings/tests/sample_import.mojom
@@ -20,6 +20,7 @@ struct Point {
};
interface ImportedInterface {
+ DoSomething();
};
} // module imported
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
index aec2afa..5d8b944 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
@@ -16,6 +16,8 @@ void Serialize_({{struct.name}}Ptr input, mojo::internal::Buffer* buf,
{%- for pf in struct.packed.packed_fields %}
{%- if pf.field.kind|is_object_kind %}
Serialize_(mojo::internal::Forward(input->{{pf.field.name}}), buf, &result->{{pf.field.name}}.ptr);
+{%- elif pf.field.kind|is_interface_kind %}
+ result->{{pf.field.name}} = input->{{pf.field.name}}.PassMessagePipe().release();
{%- elif pf.field.kind|is_handle_kind %}
result->{{pf.field.name}} = input->{{pf.field.name}}.release();
{%- else %}
@@ -35,6 +37,9 @@ void Deserialize_(internal::{{struct.name}}_Data* input,
{%- for pf in struct.packed.packed_fields %}
{%- if pf.field.kind|is_object_kind %}
Deserialize_(input->{{pf.field.name}}.ptr, &result->{{pf.field.name}});
+{%- elif pf.field.kind|is_interface_kind %}
+ if (input->{{pf.field.name}}.is_valid())
+ result->{{pf.field.name}}.Bind(mojo::MakeScopedHandle(mojo::internal::FetchAndReset(&input->{{pf.field.name}})));
{%- elif pf.field.kind|is_handle_kind %}
result->{{pf.field.name}}.reset(mojo::internal::FetchAndReset(&input->{{pf.field.name}}));
{%- elif pf.field.kind|is_enum_kind %}
diff --git a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
index 9a6bbb7..b14e711 100644
--- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
+++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py
@@ -128,7 +128,7 @@ def GetCppWrapperType(kind):
if isinstance(kind, (mojom.Array, mojom.FixedArray)):
return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind)
if isinstance(kind, mojom.Interface):
- return "mojo::ScopedMessagePipeHandle"
+ return "%sPtr" % GetNameForKind(kind)
if isinstance(kind, mojom.InterfaceRequest):
raise Exception("InterfaceRequest fields not supported!")
if kind.spec == 's':