| 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/application_manager.h" | 5 #include "mojo/shell/application_manager/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 11 matching lines...) Expand all Loading... |
| 22 #include "third_party/mojo_services/src/content_handler/public/interfaces/conten
t_handler.mojom.h" | 22 #include "third_party/mojo_services/src/content_handler/public/interfaces/conten
t_handler.mojom.h" |
| 23 | 23 |
| 24 namespace mojo { | 24 namespace mojo { |
| 25 namespace shell { | 25 namespace shell { |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 // Used by TestAPI. | 29 // Used by TestAPI. |
| 30 bool has_created_instance = false; | 30 bool has_created_instance = false; |
| 31 | 31 |
| 32 std::vector<std::string> Concatenate(const std::vector<std::string>& v1, |
| 33 const std::vector<std::string>& v2) { |
| 34 if (!v1.size()) |
| 35 return v2; |
| 36 if (!v2.size()) |
| 37 return v1; |
| 38 std::vector<std::string> result(v1); |
| 39 result.insert(result.end(), v1.begin(), v1.end()); |
| 40 return result; |
| 41 } |
| 42 |
| 32 } // namespace | 43 } // namespace |
| 33 | 44 |
| 34 ApplicationManager::Delegate::~Delegate() { | 45 ApplicationManager::Delegate::~Delegate() { |
| 35 } | 46 } |
| 36 | 47 |
| 37 GURL ApplicationManager::Delegate::ResolveURL(const GURL& url) { | 48 GURL ApplicationManager::Delegate::ResolveURL(const GURL& url) { |
| 38 return url; | 49 return url; |
| 39 } | 50 } |
| 40 | 51 |
| 41 GURL ApplicationManager::Delegate::ResolveMappings(const GURL& url) { | 52 GURL ApplicationManager::Delegate::ResolveMappings(const GURL& url) { |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 return; | 147 return; |
| 137 } | 148 } |
| 138 | 149 |
| 139 GURL resolved_url = delegate_->ResolveURL(mapped_url); | 150 GURL resolved_url = delegate_->ResolveURL(mapped_url); |
| 140 if (ConnectToRunningApplication(resolved_url, requestor_url, &services, | 151 if (ConnectToRunningApplication(resolved_url, requestor_url, &services, |
| 141 &exposed_services)) { | 152 &exposed_services)) { |
| 142 return; | 153 return; |
| 143 } | 154 } |
| 144 | 155 |
| 145 // The application is not running, let's compute the parameters. | 156 // The application is not running, let's compute the parameters. |
| 157 std::vector<std::string> parameters = |
| 158 Concatenate(pre_redirect_parameters, GetArgsForURL(resolved_url)); |
| 159 |
| 146 if (ConnectToApplicationWithLoader(mapped_url, requestor_url, &services, | 160 if (ConnectToApplicationWithLoader(mapped_url, requestor_url, &services, |
| 147 &exposed_services, on_application_end, | 161 &exposed_services, on_application_end, |
| 148 pre_redirect_parameters, | 162 parameters, GetLoaderForURL(mapped_url))) { |
| 149 GetLoaderForURL(mapped_url))) { | 163 return; |
| 164 } |
| 165 |
| 166 if (ConnectToApplicationWithLoader( |
| 167 resolved_url, requestor_url, &services, &exposed_services, |
| 168 on_application_end, parameters, GetLoaderForURL(resolved_url))) { |
| 150 return; | 169 return; |
| 151 } | 170 } |
| 152 | 171 |
| 153 if (ConnectToApplicationWithLoader(resolved_url, requestor_url, &services, | 172 if (ConnectToApplicationWithLoader(resolved_url, requestor_url, &services, |
| 154 &exposed_services, on_application_end, | 173 &exposed_services, on_application_end, |
| 155 pre_redirect_parameters, | 174 parameters, default_loader_.get())) { |
| 156 GetLoaderForURL(resolved_url))) { | |
| 157 return; | 175 return; |
| 158 } | 176 } |
| 159 | 177 |
| 160 if (ConnectToApplicationWithLoader( | 178 auto callback = base::Bind( |
| 161 resolved_url, requestor_url, &services, &exposed_services, | 179 &ApplicationManager::HandleFetchCallback, weak_ptr_factory_.GetWeakPtr(), |
| 162 on_application_end, pre_redirect_parameters, default_loader_.get())) { | 180 requestor_url, base::Passed(services.Pass()), |
| 163 return; | 181 base::Passed(exposed_services.Pass()), on_application_end, |
| 164 } | 182 parameters); |
| 165 | |
| 166 auto callback = base::Bind(&ApplicationManager::HandleFetchCallback, | |
| 167 weak_ptr_factory_.GetWeakPtr(), requestor_url, | |
| 168 base::Passed(services.Pass()), | |
| 169 base::Passed(exposed_services.Pass()), | |
| 170 on_application_end, pre_redirect_parameters); | |
| 171 | 183 |
| 172 if (resolved_url.SchemeIsFile()) { | 184 if (resolved_url.SchemeIsFile()) { |
| 173 new LocalFetcher( | 185 new LocalFetcher( |
| 174 resolved_url, GetBaseURLAndQuery(resolved_url, nullptr), | 186 resolved_url, GetBaseURLAndQuery(resolved_url, nullptr), |
| 175 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE)); | 187 base::Bind(callback, NativeApplicationCleanup::DONT_DELETE)); |
| 176 return; | 188 return; |
| 177 } | 189 } |
| 178 | 190 |
| 179 if (!network_service_) | 191 if (!network_service_) |
| 180 ConnectToService(GURL("mojo:network_service"), &network_service_); | 192 ConnectToService(GURL("mojo:network_service"), &network_service_); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 356 | 368 |
| 357 TRACE_EVENT1("mojo_shell", "ApplicationManager::RunNativeApplication", "path", | 369 TRACE_EVENT1("mojo_shell", "ApplicationManager::RunNativeApplication", "path", |
| 358 path.AsUTF8Unsafe()); | 370 path.AsUTF8Unsafe()); |
| 359 NativeRunner* runner = native_runner_factory_->Create(options).release(); | 371 NativeRunner* runner = native_runner_factory_->Create(options).release(); |
| 360 native_runners_.push_back(runner); | 372 native_runners_.push_back(runner); |
| 361 runner->Start(path, cleanup, application_request.Pass(), | 373 runner->Start(path, cleanup, application_request.Pass(), |
| 362 base::Bind(&ApplicationManager::CleanupRunner, | 374 base::Bind(&ApplicationManager::CleanupRunner, |
| 363 weak_ptr_factory_.GetWeakPtr(), runner)); | 375 weak_ptr_factory_.GetWeakPtr(), runner)); |
| 364 } | 376 } |
| 365 | 377 |
| 378 void ApplicationManager::RegisterExternalApplication( |
| 379 const GURL& url, |
| 380 const std::vector<std::string>& args, |
| 381 ApplicationPtr application) { |
| 382 const auto& args_it = url_to_args_.find(url); |
| 383 if (args_it != url_to_args_.end()) { |
| 384 LOG(WARNING) << "--args-for provided for external application " << url |
| 385 << " <ignored>"; |
| 386 } |
| 387 Identity identity(url); |
| 388 ShellImpl* shell_impl = |
| 389 new ShellImpl(application.Pass(), this, identity, base::Closure()); |
| 390 identity_to_shell_impl_[identity] = shell_impl; |
| 391 shell_impl->InitializeApplication(Array<String>::From(args)); |
| 392 } |
| 393 |
| 366 void ApplicationManager::RegisterContentHandler( | 394 void ApplicationManager::RegisterContentHandler( |
| 367 const std::string& mime_type, | 395 const std::string& mime_type, |
| 368 const GURL& content_handler_url) { | 396 const GURL& content_handler_url) { |
| 369 DCHECK(content_handler_url.is_valid()) | 397 DCHECK(content_handler_url.is_valid()) |
| 370 << "Content handler URL is invalid for mime type " << mime_type; | 398 << "Content handler URL is invalid for mime type " << mime_type; |
| 371 mime_type_to_url_[mime_type] = content_handler_url; | 399 mime_type_to_url_[mime_type] = content_handler_url; |
| 372 } | 400 } |
| 373 | 401 |
| 374 void ApplicationManager::LoadWithContentHandler( | 402 void ApplicationManager::LoadWithContentHandler( |
| 375 const GURL& content_handler_url, | 403 const GURL& content_handler_url, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 399 | 427 |
| 400 void ApplicationManager::SetLoaderForScheme( | 428 void ApplicationManager::SetLoaderForScheme( |
| 401 scoped_ptr<ApplicationLoader> loader, | 429 scoped_ptr<ApplicationLoader> loader, |
| 402 const std::string& scheme) { | 430 const std::string& scheme) { |
| 403 SchemeToLoaderMap::iterator it = scheme_to_loader_.find(scheme); | 431 SchemeToLoaderMap::iterator it = scheme_to_loader_.find(scheme); |
| 404 if (it != scheme_to_loader_.end()) | 432 if (it != scheme_to_loader_.end()) |
| 405 delete it->second; | 433 delete it->second; |
| 406 scheme_to_loader_[scheme] = loader.release(); | 434 scheme_to_loader_[scheme] = loader.release(); |
| 407 } | 435 } |
| 408 | 436 |
| 437 void ApplicationManager::SetArgsForURL(const std::vector<std::string>& args, |
| 438 const GURL& url) { |
| 439 url_to_args_[url].insert(url_to_args_[url].end(), args.begin(), args.end()); |
| 440 GURL mapped_url = delegate_->ResolveMappings(url); |
| 441 if (mapped_url != url) { |
| 442 url_to_args_[mapped_url].insert(url_to_args_[mapped_url].end(), |
| 443 args.begin(), args.end()); |
| 444 } |
| 445 GURL resolved_url = delegate_->ResolveURL(mapped_url); |
| 446 if (resolved_url != mapped_url) { |
| 447 url_to_args_[resolved_url].insert(url_to_args_[resolved_url].end(), |
| 448 args.begin(), args.end()); |
| 449 } |
| 450 } |
| 451 |
| 409 void ApplicationManager::SetNativeOptionsForURL( | 452 void ApplicationManager::SetNativeOptionsForURL( |
| 410 const NativeRunnerFactory::Options& options, | 453 const NativeRunnerFactory::Options& options, |
| 411 const GURL& url) { | 454 const GURL& url) { |
| 412 DCHECK(!url.has_query()); // Precondition. | 455 DCHECK(!url.has_query()); // Precondition. |
| 413 // Apply mappings and resolution to get the resolved URL. | 456 // Apply mappings and resolution to get the resolved URL. |
| 414 GURL resolved_url = delegate_->ResolveURL(delegate_->ResolveMappings(url)); | 457 GURL resolved_url = delegate_->ResolveURL(delegate_->ResolveMappings(url)); |
| 415 DCHECK(!resolved_url.has_query()); // Still shouldn't have query. | 458 DCHECK(!resolved_url.has_query()); // Still shouldn't have query. |
| 416 // TODO(vtl): We should probably also remove/disregard the query string (and | 459 // TODO(vtl): We should probably also remove/disregard the query string (and |
| 417 // maybe canonicalize in other ways). | 460 // maybe canonicalize in other ways). |
| 418 DVLOG(2) << "Storing native options for resolved URL " << resolved_url | 461 DVLOG(2) << "Storing native options for resolved URL " << resolved_url |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 const GURL& application_url, | 500 const GURL& application_url, |
| 458 const std::string& interface_name) { | 501 const std::string& interface_name) { |
| 459 ServiceProviderPtr services; | 502 ServiceProviderPtr services; |
| 460 ConnectToApplication(application_url, GURL(), GetProxy(&services), nullptr, | 503 ConnectToApplication(application_url, GURL(), GetProxy(&services), nullptr, |
| 461 base::Closure()); | 504 base::Closure()); |
| 462 MessagePipe pipe; | 505 MessagePipe pipe; |
| 463 services->ConnectToService(interface_name, pipe.handle1.Pass()); | 506 services->ConnectToService(interface_name, pipe.handle1.Pass()); |
| 464 return pipe.handle0.Pass(); | 507 return pipe.handle0.Pass(); |
| 465 } | 508 } |
| 466 | 509 |
| 510 std::vector<std::string> ApplicationManager::GetArgsForURL(const GURL& url) { |
| 511 const auto& args_it = url_to_args_.find(url); |
| 512 if (args_it != url_to_args_.end()) |
| 513 return args_it->second; |
| 514 return std::vector<std::string>(); |
| 515 } |
| 516 |
| 467 void ApplicationManager::CleanupRunner(NativeRunner* runner) { | 517 void ApplicationManager::CleanupRunner(NativeRunner* runner) { |
| 468 native_runners_.erase( | 518 native_runners_.erase( |
| 469 std::find(native_runners_.begin(), native_runners_.end(), runner)); | 519 std::find(native_runners_.begin(), native_runners_.end(), runner)); |
| 470 } | 520 } |
| 471 | 521 |
| 472 } // namespace shell | 522 } // namespace shell |
| 473 } // namespace mojo | 523 } // namespace mojo |
| OLD | NEW |