Index: mojo/shell/application_manager.cc |
diff --git a/mojo/shell/application_manager.cc b/mojo/shell/application_manager.cc |
index 7116c7b296010bdb04f2644c5ec40b98fd65cf96..91c8e5d2ddf57dfa2939737e2a028f8c4f4b75bf 100644 |
--- a/mojo/shell/application_manager.cc |
+++ b/mojo/shell/application_manager.cc |
@@ -20,10 +20,9 @@ |
#include "mojo/public/cpp/bindings/binding.h" |
#include "mojo/services/package_manager/loader.h" |
#include "mojo/shell/application_instance.h" |
-#include "mojo/shell/fetcher.h" |
-#include "mojo/shell/package_manager.h" |
+#include "mojo/shell/connect_util.h" |
+#include "mojo/shell/content_handler_connection.h" |
#include "mojo/shell/public/cpp/connect.h" |
-#include "mojo/shell/query_util.h" |
#include "mojo/shell/shell_application_loader.h" |
#include "mojo/shell/switches.h" |
#include "mojo/util/filename_util.h" |
@@ -60,28 +59,24 @@ bool ApplicationManager::TestAPI::HasRunningInstanceForURL( |
} |
ApplicationManager::ApplicationManager( |
- scoped_ptr<PackageManager> package_manager, |
bool register_mojo_url_schemes) |
- : ApplicationManager(std::move(package_manager), nullptr, nullptr, |
- register_mojo_url_schemes) {} |
+ : ApplicationManager(nullptr, nullptr, register_mojo_url_schemes) {} |
ApplicationManager::ApplicationManager( |
- scoped_ptr<PackageManager> package_manager, |
scoped_ptr<NativeRunnerFactory> native_runner_factory, |
base::TaskRunner* task_runner, |
bool register_mojo_url_schemes) |
- : use_remote_package_manager_(false), |
- package_manager_(std::move(package_manager)), |
- task_runner_(task_runner), |
+ : task_runner_(task_runner), |
native_runner_factory_(std::move(native_runner_factory)), |
weak_ptr_factory_(this) { |
- package_manager_->SetApplicationManager(this); |
SetLoaderForURL(make_scoped_ptr(new ShellApplicationLoader(this)), |
- GURL("mojo:shell")); |
- if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kDontUseRemotePackageManager)) { |
- UseRemotePackageManager(register_mojo_url_schemes); |
- } |
+ GURL("mojo://shell/")); |
+ |
+ GURL package_manager_url("mojo://package_manager/"); |
+ SetLoaderForURL(make_scoped_ptr(new package_manager::Loader( |
+ task_runner_, register_mojo_url_schemes)), package_manager_url); |
+ |
+ ConnectToInterface(this, package_manager_url, &shell_resolver_); |
} |
ApplicationManager::~ApplicationManager() { |
@@ -110,10 +105,9 @@ void ApplicationManager::ConnectToApplication( |
ApplicationLoader* loader = GetLoaderForURL(params->target().url()); |
if (loader) { |
GURL url = params->target().url(); |
- package_manager_->BuiltinAppLoaded(url); |
mojom::ShellClientRequest request; |
- std::string application_name = |
- package_manager_->GetApplicationName(params->target().url().spec()); |
+ // TODO(beng): move this to OnGotResolvedURL & read from manifest. |
+ std::string application_name = url.spec(); |
ApplicationInstance* instance = CreateAndConnectToInstance( |
std::move(params), nullptr, nullptr, application_name, &request); |
loader->Load(url, std::move(request)); |
@@ -121,52 +115,11 @@ void ApplicationManager::ConnectToApplication( |
return; |
} |
- if (use_remote_package_manager_) { |
- std::string url = params->target().url().spec(); |
- shell_resolver_->ResolveMojoURL( |
- url, |
- base::Bind(&ApplicationManager::OnGotResolvedURL, |
- weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms))); |
- } else { |
- URLRequestPtr original_url_request = params->TakeTargetURLRequest(); |
- auto callback = |
- base::Bind(&ApplicationManager::HandleFetchCallback, |
- weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms)); |
- package_manager_->FetchRequest(std::move(original_url_request), callback); |
- } |
-} |
- |
-void ApplicationManager::UseRemotePackageManager( |
- bool register_mojo_url_schemes) { |
- use_remote_package_manager_ = true; |
- |
- GURL package_manager_url("mojo://package_manager/"); |
- |
- SetLoaderForURL(make_scoped_ptr(new package_manager::Loader( |
- task_runner_, register_mojo_url_schemes)), package_manager_url); |
- |
- shell::mojom::InterfaceProviderPtr interfaces; |
- scoped_ptr<ConnectToApplicationParams> params(new ConnectToApplicationParams); |
- params->set_source(Identity(GURL("mojo:shell"), std::string(), |
- GetPermissiveCapabilityFilter())); |
- params->set_remote_interfaces(GetProxy(&interfaces)); |
- |
- if (false) { |
- GURL file_url = |
- package_manager_->ResolveMojoURL(package_manager_url); |
- params->SetTarget(Identity(file_url, std::string(), |
- GetPermissiveCapabilityFilter())); |
- // TODO(beng): Fish the name out of a manifest. There's a chicken-and-egg |
- // issue here as the package manager reads the manifests. The solution is |
- //probably to defer application name loading. |
- CreateAndRunLocalApplication(std::move(params), "Package Manager", |
- file_url); |
- } else { |
- params->SetTarget(Identity(package_manager_url, std::string(), |
- GetPermissiveCapabilityFilter())); |
- ConnectToApplication(std::move(params)); |
- } |
- GetInterface(interfaces.get(), &shell_resolver_); |
+ std::string url = params->target().url().spec(); |
+ shell_resolver_->ResolveMojoURL( |
+ url, |
+ base::Bind(&ApplicationManager::OnGotResolvedURL, |
+ weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms))); |
} |
bool ApplicationManager::ConnectToRunningApplication( |
@@ -199,9 +152,10 @@ void ApplicationManager::CreateInstanceForHandle( |
CapabilityFilter local_filter = filter->filter.To<CapabilityFilter>(); |
Identity target_id(url, std::string(), local_filter); |
mojom::ShellClientRequest request; |
+ // TODO(beng): do better than url.spec() for application name. |
ApplicationInstance* instance = CreateInstance( |
target_id, EmptyConnectCallback(), base::Closure(), |
- package_manager_->GetApplicationName(url.spec()), &request); |
+ url.spec(), &request); |
instance->BindPIDReceiver(std::move(pid_receiver)); |
scoped_ptr<NativeRunner> runner = |
native_runner_factory_->Create(base::FilePath()); |
@@ -280,6 +234,44 @@ ApplicationInstance* ApplicationManager::CreateInstance( |
return instance; |
} |
+uint32_t ApplicationManager::StartContentHandler( |
+ const Identity& source, |
+ const Identity& content_handler, |
+ const GURL& url, |
+ mojom::ShellClientRequest request) { |
+ URLResponsePtr response(URLResponse::New()); |
+ response->url = url.spec(); |
+ ContentHandlerConnection* connection = |
+ GetContentHandler(content_handler, source); |
+ connection->StartApplication(std::move(request), std::move(response)); |
+ return connection->id(); |
+} |
+ |
+ContentHandlerConnection* ApplicationManager::GetContentHandler( |
+ const Identity& content_handler_identity, |
+ const Identity& source_identity) { |
+ auto it = identity_to_content_handler_.find(content_handler_identity); |
+ if (it != identity_to_content_handler_.end()) |
+ return it->second; |
+ |
+ ContentHandlerConnection* connection = new ContentHandlerConnection( |
+ this, source_identity, |
+ content_handler_identity, |
+ ++content_handler_id_counter_, |
+ base::Bind(&ApplicationManager::OnContentHandlerConnectionClosed, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ identity_to_content_handler_[content_handler_identity] = connection; |
+ return connection; |
+} |
+ |
+void ApplicationManager::OnContentHandlerConnectionClosed( |
+ ContentHandlerConnection* connection) { |
+ // Remove the mapping. |
+ auto it = identity_to_content_handler_.find(connection->identity()); |
+ DCHECK(it != identity_to_content_handler_.end()); |
+ identity_to_content_handler_.erase(it); |
+} |
+ |
void ApplicationManager::OnGotResolvedURL( |
scoped_ptr<ConnectToApplicationParams> params, |
const String& resolved_url, |
@@ -307,7 +299,7 @@ void ApplicationManager::OnGotResolvedURL( |
ApplicationInstance* instance = CreateAndConnectToInstance( |
std::move(params), &source, &target, application_name, &request); |
- uint32_t content_handler_id = package_manager_->StartContentHandler( |
+ uint32_t content_handler_id = StartContentHandler( |
source, Identity(resolved_gurl, target.qualifier(), capability_filter), |
target.url(), std::move(request)); |
CHECK(content_handler_id != mojom::Shell::kInvalidApplicationID); |
@@ -328,86 +320,19 @@ void ApplicationManager::CreateAndRunLocalApplication( |
ApplicationInstance* instance = CreateAndConnectToInstance( |
std::move(params), &source, &target, application_name, &request); |
- scoped_ptr<Fetcher> fetcher; |
bool start_sandboxed = false; |
- RunNativeApplication(std::move(request), start_sandboxed, std::move(fetcher), |
- instance, util::UrlToFilePath(file_url), true); |
- instance->RunConnectCallback(); |
-} |
- |
-void ApplicationManager::HandleFetchCallback( |
- scoped_ptr<ConnectToApplicationParams> params, |
- scoped_ptr<Fetcher> fetcher) { |
- if (!fetcher) { |
- // Network error. Drop |params| to tell the requestor. |
- params->connect_callback().Run(mojom::Shell::kInvalidApplicationID, |
- mojom::Shell::kInvalidApplicationID); |
- return; |
- } |
- |
- GURL redirect_url = fetcher->GetRedirectURL(); |
- if (!redirect_url.is_empty()) { |
- // And around we go again... Whee! |
- // TODO(sky): this loses the original URL info. |
- URLRequestPtr new_request = URLRequest::New(); |
- new_request->url = redirect_url.spec(); |
- HttpHeaderPtr header = HttpHeader::New(); |
- header->name = "Referer"; |
- header->value = fetcher->GetRedirectReferer().spec(); |
- new_request->headers.push_back(std::move(header)); |
- params->SetTargetURLRequest(std::move(new_request)); |
- ConnectToApplication(std::move(params)); |
- return; |
- } |
- |
- // We already checked if the application was running before we fetched it, but |
- // it might have started while the fetch was outstanding. We don't want to |
- // have two copies of the app running, so check again. |
- if (ConnectToRunningApplication(¶ms)) |
- return; |
- |
- Identity source, target; |
- mojom::ShellClientRequest request; |
- std::string application_name = |
- package_manager_->GetApplicationName(params->target().url().spec()); |
- ApplicationInstance* instance = CreateAndConnectToInstance( |
- std::move(params), &source, &target, application_name, &request); |
- |
- uint32_t content_handler_id = package_manager_->HandleWithContentHandler( |
- fetcher.get(), source, target.url(), target.filter(), &request); |
- if (content_handler_id != mojom::Shell::kInvalidApplicationID) { |
- instance->set_requesting_content_handler_id(content_handler_id); |
- } else { |
- bool start_sandboxed = false; |
- fetcher->AsPath( |
- task_runner_, |
- base::Bind(&ApplicationManager::RunNativeApplication, |
- weak_ptr_factory_.GetWeakPtr(), |
- base::Passed(std::move(request)), start_sandboxed, |
- base::Passed(std::move(fetcher)), |
- base::Unretained(instance))); |
- } |
+ RunNativeApplication(std::move(request), start_sandboxed, instance, |
+ util::UrlToFilePath(file_url)); |
instance->RunConnectCallback(); |
} |
void ApplicationManager::RunNativeApplication( |
InterfaceRequest<mojom::ShellClient> request, |
bool start_sandboxed, |
- scoped_ptr<Fetcher> fetcher, |
ApplicationInstance* instance, |
- const base::FilePath& path, |
- bool path_exists) { |
- // We only passed fetcher to keep it alive. Done with it now. |
- fetcher.reset(); |
- |
+ const base::FilePath& path) { |
DCHECK(request.is_pending()); |
- if (!path_exists) { |
- LOG(ERROR) << "Library not started because library path '" << path.value() |
- << "' does not exist."; |
- return; |
- } |
- |
TRACE_EVENT1("mojo_shell", "ApplicationManager::RunNativeApplication", "path", |
path.AsUTF8Unsafe()); |
scoped_ptr<NativeRunner> runner = native_runner_factory_->Create(path); |
@@ -429,7 +354,7 @@ void ApplicationManager::SetLoaderForURL(scoped_ptr<ApplicationLoader> loader, |
} |
ApplicationLoader* ApplicationManager::GetLoaderForURL(const GURL& url) { |
- auto url_it = url_to_loader_.find(GetBaseURLAndQuery(url, nullptr)); |
+ auto url_it = url_to_loader_.find(url); |
if (url_it != url_to_loader_.end()) |
return url_it->second; |
return default_loader_.get(); |
@@ -441,10 +366,7 @@ mojom::ApplicationInfoPtr ApplicationManager::CreateApplicationInfoForInstance( |
info->id = instance->id(); |
info->url = instance->identity().url().spec(); |
info->qualifier = instance->identity().qualifier(); |
- if (use_remote_package_manager_) |
- info->name = instance->application_name(); |
- else |
- info->name = package_manager_->GetApplicationName(info->url); |
+ info->name = instance->application_name(); |
if (instance->identity().url().spec() == "mojo://shell/") |
info->pid = base::Process::Current().Pid(); |
else |