OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/common/mojo/mojo_shell_connection_impl.h" | 5 #include "content/common/mojo/mojo_shell_connection_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/lazy_instance.h" | 8 #include "base/lazy_instance.h" |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "base/threading/thread_local.h" | 10 #include "base/threading/thread_local.h" |
11 #include "content/common/mojo/embedded_application_runner.h" | 11 #include "content/common/mojo/embedded_application_runner.h" |
12 #include "services/shell/public/cpp/shell_client.h" | 12 #include "services/shell/public/cpp/service.h" |
13 #include "services/shell/public/cpp/shell_connection.h" | 13 #include "services/shell/public/cpp/shell_connection.h" |
14 #include "services/shell/runner/common/client_util.h" | 14 #include "services/shell/runner/common/client_util.h" |
15 | 15 |
16 namespace content { | 16 namespace content { |
17 namespace { | 17 namespace { |
18 | 18 |
19 using MojoShellConnectionPtr = | 19 using MojoShellConnectionPtr = |
20 base::ThreadLocalPointer<MojoShellConnection>; | 20 base::ThreadLocalPointer<MojoShellConnection>; |
21 | 21 |
22 // Env is thread local so that aura may be used on multiple threads. | 22 // Env is thread local so that aura may be used on multiple threads. |
(...skipping 27 matching lines...) Expand all Loading... |
50 } | 50 } |
51 | 51 |
52 // static | 52 // static |
53 void MojoShellConnection::SetFactoryForTest(Factory* factory) { | 53 void MojoShellConnection::SetFactoryForTest(Factory* factory) { |
54 DCHECK(!lazy_tls_ptr.Pointer()->Get()); | 54 DCHECK(!lazy_tls_ptr.Pointer()->Get()); |
55 mojo_shell_connection_factory = factory; | 55 mojo_shell_connection_factory = factory; |
56 } | 56 } |
57 | 57 |
58 // static | 58 // static |
59 std::unique_ptr<MojoShellConnection> MojoShellConnection::Create( | 59 std::unique_ptr<MojoShellConnection> MojoShellConnection::Create( |
60 shell::mojom::ShellClientRequest request) { | 60 shell::mojom::ServiceRequest request) { |
61 if (mojo_shell_connection_factory) | 61 if (mojo_shell_connection_factory) |
62 return mojo_shell_connection_factory->Run(); | 62 return mojo_shell_connection_factory->Run(); |
63 return base::WrapUnique(new MojoShellConnectionImpl(std::move(request))); | 63 return base::WrapUnique(new MojoShellConnectionImpl(std::move(request))); |
64 } | 64 } |
65 | 65 |
66 MojoShellConnection::~MojoShellConnection() {} | 66 MojoShellConnection::~MojoShellConnection() {} |
67 | 67 |
68 //////////////////////////////////////////////////////////////////////////////// | 68 //////////////////////////////////////////////////////////////////////////////// |
69 // MojoShellConnectionImpl, public: | 69 // MojoShellConnectionImpl, public: |
70 | 70 |
71 MojoShellConnectionImpl::MojoShellConnectionImpl( | 71 MojoShellConnectionImpl::MojoShellConnectionImpl( |
72 shell::mojom::ShellClientRequest request) | 72 shell::mojom::ServiceRequest request) |
73 : shell_connection_(new shell::ShellConnection(this, std::move(request))) {} | 73 : shell_connection_(new shell::ShellConnection(this, std::move(request))) {} |
74 | 74 |
75 MojoShellConnectionImpl::~MojoShellConnectionImpl() {} | 75 MojoShellConnectionImpl::~MojoShellConnectionImpl() {} |
76 | 76 |
77 //////////////////////////////////////////////////////////////////////////////// | 77 //////////////////////////////////////////////////////////////////////////////// |
78 // MojoShellConnectionImpl, shell::ShellClient implementation: | 78 // MojoShellConnectionImpl, shell::Service implementation: |
79 | 79 |
80 void MojoShellConnectionImpl::Initialize(shell::Connector* connector, | 80 void MojoShellConnectionImpl::OnStart(shell::Connector* connector, |
81 const shell::Identity& identity, | 81 const shell::Identity& identity, |
82 uint32_t id) { | 82 uint32_t id) { |
83 for (auto& client : embedded_shell_clients_) | 83 for (auto& client : embedded_services_) |
84 client->Initialize(connector, identity, id); | 84 client->OnStart(connector, identity, id); |
85 } | 85 } |
86 | 86 |
87 bool MojoShellConnectionImpl::AcceptConnection(shell::Connection* connection) { | 87 bool MojoShellConnectionImpl::OnConnect(shell::Connection* connection) { |
88 std::string remote_app = connection->GetRemoteIdentity().name(); | 88 std::string remote_app = connection->GetRemoteIdentity().name(); |
89 if (remote_app == "mojo:shell") { | 89 if (remote_app == "mojo:shell") { |
90 // Only expose the SCF interface to the shell. | 90 // Only expose the SCF interface to the shell. |
91 connection->AddInterface<shell::mojom::ShellClientFactory>(this); | 91 connection->AddInterface<shell::mojom::ServiceFactory>(this); |
92 return true; | 92 return true; |
93 } | 93 } |
94 | 94 |
95 bool accept = false; | 95 bool accept = false; |
96 for (auto& client : embedded_shell_clients_) | 96 for (auto& client : embedded_services_) |
97 accept |= client->AcceptConnection(connection); | 97 accept |= client->OnConnect(connection); |
98 | 98 |
99 // Reject all other connections to this application. | 99 // Reject all other connections to this application. |
100 return accept; | 100 return accept; |
101 } | 101 } |
102 | 102 |
103 shell::InterfaceRegistry* | 103 shell::InterfaceRegistry* |
104 MojoShellConnectionImpl::GetInterfaceRegistryForConnection() { | 104 MojoShellConnectionImpl::GetInterfaceRegistryForConnection() { |
105 // TODO(beng): This is really horrible since obviously subject to issues | 105 // TODO(beng): This is really horrible since obviously subject to issues |
106 // of ordering, but is no more horrible than this API is in general. | 106 // of ordering, but is no more horrible than this API is in general. |
107 shell::InterfaceRegistry* registry = nullptr; | 107 shell::InterfaceRegistry* registry = nullptr; |
108 for (auto& client : embedded_shell_clients_) { | 108 for (auto& client : embedded_services_) { |
109 registry = client->GetInterfaceRegistryForConnection(); | 109 registry = client->GetInterfaceRegistryForConnection(); |
110 if (registry) | 110 if (registry) |
111 return registry; | 111 return registry; |
112 } | 112 } |
113 return nullptr; | 113 return nullptr; |
114 } | 114 } |
115 | 115 |
116 shell::InterfaceProvider* | 116 shell::InterfaceProvider* |
117 MojoShellConnectionImpl::GetInterfaceProviderForConnection() { | 117 MojoShellConnectionImpl::GetInterfaceProviderForConnection() { |
118 // TODO(beng): This is really horrible since obviously subject to issues | 118 // TODO(beng): This is really horrible since obviously subject to issues |
119 // of ordering, but is no more horrible than this API is in general. | 119 // of ordering, but is no more horrible than this API is in general. |
120 shell::InterfaceProvider* provider = nullptr; | 120 shell::InterfaceProvider* provider = nullptr; |
121 for (auto& client : embedded_shell_clients_) { | 121 for (auto& client : embedded_services_) { |
122 provider = client->GetInterfaceProviderForConnection(); | 122 provider = client->GetInterfaceProviderForConnection(); |
123 if (provider) | 123 if (provider) |
124 return provider; | 124 return provider; |
125 } | 125 } |
126 return nullptr; | 126 return nullptr; |
127 } | 127 } |
128 | 128 |
129 //////////////////////////////////////////////////////////////////////////////// | 129 //////////////////////////////////////////////////////////////////////////////// |
130 // MojoShellConnectionImpl, | 130 // MojoShellConnectionImpl, |
131 // shell::InterfaceFactory<shell::mojom::ShellClientFactory> implementation: | 131 // shell::InterfaceFactory<shell::mojom::ServiceFactory> implementation: |
132 | 132 |
133 void MojoShellConnectionImpl::Create( | 133 void MojoShellConnectionImpl::Create( |
134 shell::Connection* connection, | 134 shell::Connection* connection, |
135 shell::mojom::ShellClientFactoryRequest request) { | 135 shell::mojom::ServiceFactoryRequest request) { |
136 factory_bindings_.AddBinding(this, std::move(request)); | 136 factory_bindings_.AddBinding(this, std::move(request)); |
137 } | 137 } |
138 | 138 |
139 //////////////////////////////////////////////////////////////////////////////// | 139 //////////////////////////////////////////////////////////////////////////////// |
140 // MojoShellConnectionImpl, shell::mojom::ShellClientFactory implementation: | 140 // MojoShellConnectionImpl, shell::mojom::ServiceFactory implementation: |
141 | 141 |
142 void MojoShellConnectionImpl::CreateShellClient( | 142 void MojoShellConnectionImpl::CreateService( |
143 shell::mojom::ShellClientRequest request, | 143 shell::mojom::ServiceRequest request, |
144 const mojo::String& name) { | 144 const mojo::String& name) { |
145 auto it = request_handlers_.find(name); | 145 auto it = request_handlers_.find(name); |
146 if (it != request_handlers_.end()) | 146 if (it != request_handlers_.end()) |
147 it->second.Run(std::move(request)); | 147 it->second.Run(std::move(request)); |
148 } | 148 } |
149 | 149 |
150 //////////////////////////////////////////////////////////////////////////////// | 150 //////////////////////////////////////////////////////////////////////////////// |
151 // MojoShellConnectionImpl, MojoShellConnection implementation: | 151 // MojoShellConnectionImpl, MojoShellConnection implementation: |
152 | 152 |
153 shell::ShellConnection* MojoShellConnectionImpl::GetShellConnection() { | 153 shell::ShellConnection* MojoShellConnectionImpl::GetShellConnection() { |
154 return shell_connection_.get(); | 154 return shell_connection_.get(); |
155 } | 155 } |
156 | 156 |
157 shell::Connector* MojoShellConnectionImpl::GetConnector() { | 157 shell::Connector* MojoShellConnectionImpl::GetConnector() { |
158 DCHECK(shell_connection_); | 158 DCHECK(shell_connection_); |
159 return shell_connection_->connector(); | 159 return shell_connection_->connector(); |
160 } | 160 } |
161 | 161 |
162 const shell::Identity& MojoShellConnectionImpl::GetIdentity() const { | 162 const shell::Identity& MojoShellConnectionImpl::GetIdentity() const { |
163 DCHECK(shell_connection_); | 163 DCHECK(shell_connection_); |
164 return shell_connection_->identity(); | 164 return shell_connection_->identity(); |
165 } | 165 } |
166 | 166 |
167 void MojoShellConnectionImpl::SetConnectionLostClosure( | 167 void MojoShellConnectionImpl::SetConnectionLostClosure( |
168 const base::Closure& closure) { | 168 const base::Closure& closure) { |
169 shell_connection_->SetConnectionLostClosure(closure); | 169 shell_connection_->SetConnectionLostClosure(closure); |
170 } | 170 } |
171 | 171 |
172 void MojoShellConnectionImpl::AddEmbeddedShellClient( | 172 void MojoShellConnectionImpl::MergeService( |
173 std::unique_ptr<shell::ShellClient> shell_client) { | 173 std::unique_ptr<shell::Service> service) { |
174 embedded_shell_clients_.push_back(shell_client.get()); | 174 embedded_services_.push_back(service.get()); |
175 owned_shell_clients_.push_back(std::move(shell_client)); | 175 owned_services_.push_back(std::move(service)); |
176 } | 176 } |
177 | 177 |
178 void MojoShellConnectionImpl::AddEmbeddedShellClient( | 178 void MojoShellConnectionImpl::MergeService( |
179 shell::ShellClient* shell_client) { | 179 shell::Service* service) { |
180 embedded_shell_clients_.push_back(shell_client); | 180 embedded_services_.push_back(service); |
181 } | 181 } |
182 | 182 |
183 void MojoShellConnectionImpl::AddEmbeddedService( | 183 void MojoShellConnectionImpl::AddEmbeddedService( |
184 const std::string& name, | 184 const std::string& name, |
185 const MojoApplicationInfo& info) { | 185 const MojoApplicationInfo& info) { |
186 std::unique_ptr<EmbeddedApplicationRunner> app( | 186 std::unique_ptr<EmbeddedApplicationRunner> app( |
187 new EmbeddedApplicationRunner(name, info)); | 187 new EmbeddedApplicationRunner(name, info)); |
188 AddShellClientRequestHandler( | 188 AddServiceRequestHandler( |
189 name, base::Bind(&EmbeddedApplicationRunner::BindShellClientRequest, | 189 name, base::Bind(&EmbeddedApplicationRunner::BindServiceRequest, |
190 base::Unretained(app.get()))); | 190 base::Unretained(app.get()))); |
191 auto result = embedded_apps_.insert(std::make_pair(name, std::move(app))); | 191 auto result = embedded_apps_.insert(std::make_pair(name, std::move(app))); |
192 DCHECK(result.second); | 192 DCHECK(result.second); |
193 } | 193 } |
194 | 194 |
195 void MojoShellConnectionImpl::AddShellClientRequestHandler( | 195 void MojoShellConnectionImpl::AddServiceRequestHandler( |
196 const std::string& name, | 196 const std::string& name, |
197 const ShellClientRequestHandler& handler) { | 197 const ServiceRequestHandler& handler) { |
198 auto result = request_handlers_.insert(std::make_pair(name, handler)); | 198 auto result = request_handlers_.insert(std::make_pair(name, handler)); |
199 DCHECK(result.second); | 199 DCHECK(result.second); |
200 } | 200 } |
201 | 201 |
202 } // namespace content | 202 } // namespace content |
OLD | NEW |