| 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 |