OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "mojo/shell/application_manager.h" | 5 #include "mojo/shell/application_manager.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 | 52 |
53 ApplicationManager::ApplicationManager( | 53 ApplicationManager::ApplicationManager( |
54 scoped_ptr<PackageManager> package_manager) | 54 scoped_ptr<PackageManager> package_manager) |
55 : package_manager_(package_manager.Pass()), | 55 : package_manager_(package_manager.Pass()), |
56 content_handler_id_counter_(0u), | 56 content_handler_id_counter_(0u), |
57 weak_ptr_factory_(this) { | 57 weak_ptr_factory_(this) { |
58 package_manager_->SetApplicationManager(this); | 58 package_manager_->SetApplicationManager(this); |
59 } | 59 } |
60 | 60 |
61 ApplicationManager::~ApplicationManager() { | 61 ApplicationManager::~ApplicationManager() { |
62 URLToContentHandlerMap url_to_content_handler(url_to_content_handler_); | 62 IdentityToContentHandlerMap identity_to_content_handler( |
63 for (auto& pair : url_to_content_handler) | 63 identity_to_content_handler_); |
| 64 for (auto& pair : identity_to_content_handler) |
64 pair.second->CloseConnection(); | 65 pair.second->CloseConnection(); |
65 TerminateShellConnections(); | 66 TerminateShellConnections(); |
66 STLDeleteValues(&url_to_loader_); | 67 STLDeleteValues(&url_to_loader_); |
67 } | 68 } |
68 | 69 |
69 void ApplicationManager::TerminateShellConnections() { | 70 void ApplicationManager::TerminateShellConnections() { |
70 STLDeleteValues(&identity_to_instance_); | 71 STLDeleteValues(&identity_to_instance_); |
71 } | 72 } |
72 | 73 |
73 void ApplicationManager::ConnectToApplication( | 74 void ApplicationManager::ConnectToApplication( |
74 ApplicationInstance* originator, | |
75 URLRequestPtr app_url_request, | |
76 const std::string& qualifier, | |
77 InterfaceRequest<ServiceProvider> services, | |
78 ServiceProviderPtr exposed_services, | |
79 const CapabilityFilter& filter, | |
80 const base::Closure& on_application_end, | |
81 const Shell::ConnectToApplicationCallback& connect_callback) { | |
82 scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); | |
83 params->SetOriginatorInfo(originator); | |
84 params->SetURLInfo(app_url_request.Pass()); | |
85 params->set_qualifier(qualifier); | |
86 params->set_services(services.Pass()); | |
87 params->set_exposed_services(exposed_services.Pass()); | |
88 params->set_filter(filter); | |
89 params->set_on_application_end(on_application_end); | |
90 params->set_connect_callback(connect_callback); | |
91 | |
92 ConnectToApplication(params.Pass()); | |
93 } | |
94 | |
95 void ApplicationManager::ConnectToApplication( | |
96 scoped_ptr<ConnectToApplicationParams> params) { | 75 scoped_ptr<ConnectToApplicationParams> params) { |
97 GURL original_url = params->app_url(); | 76 GURL original_url = params->app_url(); |
98 URLRequestPtr original_url_request = params->TakeAppURLRequest(); | 77 URLRequestPtr original_url_request = params->TakeAppURLRequest(); |
99 | 78 |
100 TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::ConnectToApplication", | 79 TRACE_EVENT_INSTANT1("mojo_shell", "ApplicationManager::ConnectToApplication", |
101 TRACE_EVENT_SCOPE_THREAD, "original_url", | 80 TRACE_EVENT_SCOPE_THREAD, "original_url", |
102 original_url.spec()); | 81 original_url.spec()); |
103 DCHECK(original_url.is_valid()); | 82 DCHECK(original_url.is_valid()); |
104 DCHECK(original_url_request); | 83 DCHECK(original_url_request); |
105 | 84 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 return true; | 120 return true; |
142 } | 121 } |
143 | 122 |
144 void ApplicationManager::ConnectToApplicationWithLoader( | 123 void ApplicationManager::ConnectToApplicationWithLoader( |
145 scoped_ptr<ConnectToApplicationParams>* params, | 124 scoped_ptr<ConnectToApplicationParams>* params, |
146 const GURL& resolved_url, | 125 const GURL& resolved_url, |
147 ApplicationLoader* loader) { | 126 ApplicationLoader* loader) { |
148 if (!(*params)->app_url().SchemeIs("mojo")) | 127 if (!(*params)->app_url().SchemeIs("mojo")) |
149 (*params)->SetURLInfo(resolved_url); | 128 (*params)->SetURLInfo(resolved_url); |
150 | 129 |
151 loader->Load(resolved_url, RegisterInstance(params->Pass(), nullptr)); | 130 loader->Load(resolved_url, CreateInstance(params->Pass(), nullptr)); |
152 } | 131 } |
153 | 132 |
154 InterfaceRequest<Application> ApplicationManager::RegisterInstance( | 133 InterfaceRequest<Application> ApplicationManager::CreateInstance( |
155 scoped_ptr<ConnectToApplicationParams> params, | 134 scoped_ptr<ConnectToApplicationParams> params, |
156 ApplicationInstance** resulting_instance) { | 135 ApplicationInstance** resulting_instance) { |
157 Identity app_identity(params->app_url(), params->qualifier()); | 136 Identity app_identity(params->app_url(), params->qualifier()); |
158 | 137 |
159 ApplicationPtr application; | 138 ApplicationPtr application; |
160 InterfaceRequest<Application> application_request = GetProxy(&application); | 139 InterfaceRequest<Application> application_request = GetProxy(&application); |
161 ApplicationInstance* instance = new ApplicationInstance( | 140 ApplicationInstance* instance = new ApplicationInstance( |
162 application.Pass(), this, params->originator_identity(), app_identity, | 141 application.Pass(), this, params->originator_identity(), app_identity, |
163 params->filter(), Shell::kInvalidContentHandlerID, | 142 params->filter(), Shell::kInvalidContentHandlerID, |
164 params->on_application_end()); | 143 params->on_application_end()); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 | 197 |
219 Identity originator_identity = params->originator_identity(); | 198 Identity originator_identity = params->originator_identity(); |
220 CapabilityFilter originator_filter = params->originator_filter(); | 199 CapabilityFilter originator_filter = params->originator_filter(); |
221 CapabilityFilter filter = params->filter(); | 200 CapabilityFilter filter = params->filter(); |
222 GURL app_url = params->app_url(); | 201 GURL app_url = params->app_url(); |
223 std::string qualifier = params->qualifier(); | 202 std::string qualifier = params->qualifier(); |
224 Shell::ConnectToApplicationCallback connect_callback = | 203 Shell::ConnectToApplicationCallback connect_callback = |
225 params->connect_callback(); | 204 params->connect_callback(); |
226 params->set_connect_callback(EmptyConnectCallback()); | 205 params->set_connect_callback(EmptyConnectCallback()); |
227 ApplicationInstance* app = nullptr; | 206 ApplicationInstance* app = nullptr; |
228 InterfaceRequest<Application> request(RegisterInstance(params.Pass(), &app)); | 207 InterfaceRequest<Application> request(CreateInstance(params.Pass(), &app)); |
229 | 208 |
230 | 209 |
231 GURL content_handler_url; | 210 GURL content_handler_url; |
232 URLResponsePtr new_response; | 211 URLResponsePtr new_response; |
233 if (package_manager_->HandleWithContentHandler(fetcher.get(), | 212 if (package_manager_->HandleWithContentHandler(fetcher.get(), |
234 app_url, | 213 app_url, |
235 blocking_pool_, | 214 blocking_pool_, |
236 &new_response, | 215 &new_response, |
237 &content_handler_url, | 216 &content_handler_url, |
238 &qualifier)) { | 217 &qualifier)) { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 const Identity& originator_identity, | 271 const Identity& originator_identity, |
293 const CapabilityFilter& originator_filter, | 272 const CapabilityFilter& originator_filter, |
294 const GURL& content_handler_url, | 273 const GURL& content_handler_url, |
295 const std::string& qualifier, | 274 const std::string& qualifier, |
296 const CapabilityFilter& filter, | 275 const CapabilityFilter& filter, |
297 const Shell::ConnectToApplicationCallback& connect_callback, | 276 const Shell::ConnectToApplicationCallback& connect_callback, |
298 ApplicationInstance* app, | 277 ApplicationInstance* app, |
299 InterfaceRequest<Application> application_request, | 278 InterfaceRequest<Application> application_request, |
300 URLResponsePtr url_response) { | 279 URLResponsePtr url_response) { |
301 ContentHandlerConnection* connection = nullptr; | 280 ContentHandlerConnection* connection = nullptr; |
302 std::pair<GURL, std::string> key(content_handler_url, qualifier); | 281 Identity content_handler_identity(content_handler_url, qualifier); |
303 // TODO(beng): Figure out the extent to which capability filter should be | 282 // TODO(beng): Figure out the extent to which capability filter should be |
304 // factored into handler identity. | 283 // factored into handler identity. |
305 URLToContentHandlerMap::iterator iter = url_to_content_handler_.find(key); | 284 IdentityToContentHandlerMap::iterator iter = |
306 if (iter != url_to_content_handler_.end()) { | 285 identity_to_content_handler_.find(content_handler_identity); |
| 286 if (iter != identity_to_content_handler_.end()) { |
307 connection = iter->second; | 287 connection = iter->second; |
308 } else { | 288 } else { |
309 connection = new ContentHandlerConnection( | 289 connection = new ContentHandlerConnection( |
310 this, originator_identity, originator_filter, content_handler_url, | 290 this, originator_identity, originator_filter, content_handler_url, |
311 qualifier, filter, ++content_handler_id_counter_); | 291 qualifier, filter, ++content_handler_id_counter_); |
312 url_to_content_handler_[key] = connection; | 292 identity_to_content_handler_[content_handler_identity] = connection; |
313 } | 293 } |
314 | 294 |
315 app->set_requesting_content_handler_id(connection->id()); | 295 app->set_requesting_content_handler_id(connection->id()); |
316 connection->content_handler()->StartApplication(application_request.Pass(), | 296 connection->content_handler()->StartApplication(application_request.Pass(), |
317 url_response.Pass()); | 297 url_response.Pass()); |
318 connect_callback.Run(connection->id()); | 298 connect_callback.Run(connection->id()); |
319 } | 299 } |
320 | 300 |
321 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, | 301 void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, |
322 const GURL& url) { | 302 const GURL& url) { |
(...skipping 20 matching lines...) Expand all Loading... |
343 DCHECK(it != identity_to_instance_.end()); | 323 DCHECK(it != identity_to_instance_.end()); |
344 delete it->second; | 324 delete it->second; |
345 identity_to_instance_.erase(it); | 325 identity_to_instance_.erase(it); |
346 if (!on_application_end.is_null()) | 326 if (!on_application_end.is_null()) |
347 on_application_end.Run(); | 327 on_application_end.Run(); |
348 } | 328 } |
349 | 329 |
350 void ApplicationManager::OnContentHandlerConnectionClosed( | 330 void ApplicationManager::OnContentHandlerConnectionClosed( |
351 ContentHandlerConnection* content_handler) { | 331 ContentHandlerConnection* content_handler) { |
352 // Remove the mapping to the content handler. | 332 // Remove the mapping to the content handler. |
353 auto it = url_to_content_handler_.find( | 333 auto it = identity_to_content_handler_.find( |
354 std::make_pair(content_handler->content_handler_url(), | 334 Identity(content_handler->content_handler_url(), |
355 content_handler->content_handler_qualifier())); | 335 content_handler->content_handler_qualifier())); |
356 DCHECK(it != url_to_content_handler_.end()); | 336 DCHECK(it != identity_to_content_handler_.end()); |
357 url_to_content_handler_.erase(it); | 337 identity_to_content_handler_.erase(it); |
358 } | 338 } |
359 | 339 |
360 void ApplicationManager::CleanupRunner(NativeRunner* runner) { | 340 void ApplicationManager::CleanupRunner(NativeRunner* runner) { |
361 native_runners_.erase( | 341 native_runners_.erase( |
362 std::find(native_runners_.begin(), native_runners_.end(), runner)); | 342 std::find(native_runners_.begin(), native_runners_.end(), runner)); |
363 } | 343 } |
364 | 344 |
365 ScopedMessagePipeHandle ApplicationManager::ConnectToServiceByName( | |
366 const GURL& application_url, | |
367 const std::string& interface_name) { | |
368 ServiceProviderPtr services; | |
369 scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); | |
370 params->SetURLInfo(application_url); | |
371 params->set_services(GetProxy(&services)); | |
372 params->set_filter(GetPermissiveCapabilityFilter()); | |
373 ConnectToApplication(params.Pass()); | |
374 MessagePipe pipe; | |
375 services->ConnectToService(interface_name, pipe.handle1.Pass()); | |
376 return pipe.handle0.Pass(); | |
377 } | |
378 | |
379 Shell::ConnectToApplicationCallback EmptyConnectCallback() { | 345 Shell::ConnectToApplicationCallback EmptyConnectCallback() { |
380 return base::Bind(&OnEmptyOnConnectCallback); | 346 return base::Bind(&OnEmptyOnConnectCallback); |
381 } | 347 } |
382 | 348 |
383 } // namespace shell | 349 } // namespace shell |
384 } // namespace mojo | 350 } // namespace mojo |
OLD | NEW |