| Index: mojo/shell/dynamic_application_loader.cc
|
| diff --git a/mojo/shell/dynamic_application_loader.cc b/mojo/shell/dynamic_application_loader.cc
|
| deleted file mode 100644
|
| index 1627aa99a00c8f2405b6f030564fa3fad070cf69..0000000000000000000000000000000000000000
|
| --- a/mojo/shell/dynamic_application_loader.cc
|
| +++ /dev/null
|
| @@ -1,259 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "mojo/shell/dynamic_application_loader.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/files/file_util.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "mojo/common/common_type_converters.h"
|
| -#include "mojo/common/data_pipe_utils.h"
|
| -#include "mojo/services/public/interfaces/network/url_loader.mojom.h"
|
| -#include "mojo/shell/context.h"
|
| -#include "mojo/shell/filename_util.h"
|
| -#include "mojo/shell/switches.h"
|
| -#include "url/url_util.h"
|
| -
|
| -namespace mojo {
|
| -namespace shell {
|
| -
|
| -// Encapsulates loading and running one individual application.
|
| -//
|
| -// Loaders are owned by DynamicApplicationLoader. DynamicApplicationLoader must
|
| -// ensure that all the parameters passed to Loader subclasses stay valid through
|
| -// Loader's lifetime.
|
| -//
|
| -// Async operations are done with WeakPtr to protect against
|
| -// DynamicApplicationLoader going away (and taking all the Loaders with it)
|
| -// while the async operation is outstanding.
|
| -class DynamicApplicationLoader::Loader {
|
| - public:
|
| - Loader(Context* context,
|
| - DynamicServiceRunnerFactory* runner_factory,
|
| - scoped_refptr<ApplicationLoader::LoadCallbacks> load_callbacks,
|
| - const LoaderCompleteCallback& loader_complete_callback)
|
| - : load_callbacks_(load_callbacks),
|
| - loader_complete_callback_(loader_complete_callback),
|
| - context_(context),
|
| - runner_factory_(runner_factory),
|
| - weak_ptr_factory_(this) {}
|
| -
|
| - virtual ~Loader() {}
|
| -
|
| - protected:
|
| - void RunLibrary(const base::FilePath& path, bool path_exists) {
|
| - ScopedMessagePipeHandle shell_handle =
|
| - load_callbacks_->RegisterApplication();
|
| - if (!shell_handle.is_valid()) {
|
| - LoaderComplete();
|
| - return;
|
| - }
|
| -
|
| - if (!path_exists) {
|
| - DVLOG(1) << "Library not started because library path '" << path.value()
|
| - << "' does not exist.";
|
| - LoaderComplete();
|
| - return;
|
| - }
|
| -
|
| - runner_ = runner_factory_->Create(context_);
|
| - runner_->Start(
|
| - path,
|
| - shell_handle.Pass(),
|
| - base::Bind(&Loader::LoaderComplete, weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| -
|
| - void LoaderComplete() { loader_complete_callback_.Run(this); }
|
| -
|
| - scoped_refptr<ApplicationLoader::LoadCallbacks> load_callbacks_;
|
| - LoaderCompleteCallback loader_complete_callback_;
|
| - Context* context_;
|
| -
|
| - private:
|
| - DynamicServiceRunnerFactory* runner_factory_;
|
| - scoped_ptr<DynamicServiceRunner> runner_;
|
| - base::WeakPtrFactory<Loader> weak_ptr_factory_;
|
| -};
|
| -
|
| -// A loader for local files.
|
| -class DynamicApplicationLoader::LocalLoader : public Loader {
|
| - public:
|
| - LocalLoader(const GURL& url,
|
| - Context* context,
|
| - DynamicServiceRunnerFactory* runner_factory,
|
| - scoped_refptr<ApplicationLoader::LoadCallbacks> load_callbacks,
|
| - const LoaderCompleteCallback& loader_complete_callback)
|
| - : Loader(context,
|
| - runner_factory,
|
| - load_callbacks,
|
| - loader_complete_callback),
|
| - weak_ptr_factory_(this) {
|
| - DCHECK(url.SchemeIsFile());
|
| - url::RawCanonOutputW<1024> output;
|
| - url::DecodeURLEscapeSequences(
|
| - url.path().data(), static_cast<int>(url.path().length()), &output);
|
| - base::string16 decoded_path =
|
| - base::string16(output.data(), output.length());
|
| -#if defined(OS_WIN)
|
| - base::FilePath path(decoded_path);
|
| -#else
|
| - base::FilePath path(base::UTF16ToUTF8(decoded_path));
|
| -#endif
|
| -
|
| - // Async for consistency with network case.
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&LocalLoader::RunLibrary,
|
| - weak_ptr_factory_.GetWeakPtr(),
|
| - path,
|
| - base::PathExists(path)));
|
| - }
|
| -
|
| - ~LocalLoader() override {}
|
| -
|
| - private:
|
| - base::WeakPtrFactory<LocalLoader> weak_ptr_factory_;
|
| -};
|
| -
|
| -// A loader for network files.
|
| -class DynamicApplicationLoader::NetworkLoader : public Loader {
|
| - public:
|
| - NetworkLoader(const GURL& url,
|
| - MimeTypeToURLMap* mime_type_to_url,
|
| - Context* context,
|
| - DynamicServiceRunnerFactory* runner_factory,
|
| - NetworkService* network_service,
|
| - scoped_refptr<ApplicationLoader::LoadCallbacks> load_callbacks,
|
| - const LoaderCompleteCallback& loader_complete_callback)
|
| - : Loader(context,
|
| - runner_factory,
|
| - load_callbacks,
|
| - loader_complete_callback),
|
| - mime_type_to_url_(mime_type_to_url),
|
| - weak_ptr_factory_(this) {
|
| - URLRequestPtr request(URLRequest::New());
|
| - request->url = String::From(url);
|
| - request->auto_follow_redirects = true;
|
| -
|
| - if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kDisableCache)) {
|
| - request->bypass_cache = true;
|
| - }
|
| -
|
| - network_service->CreateURLLoader(GetProxy(&url_loader_));
|
| - url_loader_->Start(request.Pass(),
|
| - base::Bind(&NetworkLoader::OnLoadComplete,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| -
|
| - ~NetworkLoader() override {
|
| - if (!file_.empty())
|
| - base::DeleteFile(file_, false);
|
| - }
|
| -
|
| - private:
|
| - void OnLoadComplete(URLResponsePtr response) {
|
| - if (response->error) {
|
| - LOG(ERROR) << "Error (" << response->error->code << ": "
|
| - << response->error->description << ") while fetching "
|
| - << response->url;
|
| - LoaderComplete();
|
| - return;
|
| - }
|
| -
|
| - MimeTypeToURLMap::iterator iter =
|
| - mime_type_to_url_->find(response->mime_type);
|
| - if (iter != mime_type_to_url_->end()) {
|
| - load_callbacks_->LoadWithContentHandler(iter->second, response.Pass());
|
| - return;
|
| - }
|
| -
|
| - base::CreateTemporaryFile(&file_);
|
| - common::CopyToFile(
|
| - response->body.Pass(),
|
| - file_,
|
| - context_->task_runners()->blocking_pool(),
|
| - base::Bind(
|
| - &NetworkLoader::RunLibrary, weak_ptr_factory_.GetWeakPtr(), file_));
|
| - }
|
| -
|
| - MimeTypeToURLMap* mime_type_to_url_;
|
| - URLLoaderPtr url_loader_;
|
| - base::FilePath file_;
|
| - base::WeakPtrFactory<NetworkLoader> weak_ptr_factory_;
|
| -};
|
| -
|
| -DynamicApplicationLoader::DynamicApplicationLoader(
|
| - Context* context,
|
| - scoped_ptr<DynamicServiceRunnerFactory> runner_factory)
|
| - : context_(context),
|
| - runner_factory_(runner_factory.Pass()),
|
| -
|
| - // Unretained() is correct here because DynamicApplicationLoader owns the
|
| - // loaders that we pass this callback to.
|
| - loader_complete_callback_(
|
| - base::Bind(&DynamicApplicationLoader::LoaderComplete,
|
| - base::Unretained(this))) {
|
| -}
|
| -
|
| -DynamicApplicationLoader::~DynamicApplicationLoader() {
|
| -}
|
| -
|
| -void DynamicApplicationLoader::RegisterContentHandler(
|
| - const std::string& mime_type,
|
| - const GURL& content_handler_url) {
|
| - mime_type_to_url_[mime_type] = content_handler_url;
|
| -}
|
| -
|
| -void DynamicApplicationLoader::Load(
|
| - ApplicationManager* manager,
|
| - const GURL& url,
|
| - scoped_refptr<LoadCallbacks> load_callbacks) {
|
| - GURL resolved_url;
|
| - if (url.SchemeIs("mojo")) {
|
| - resolved_url = context_->mojo_url_resolver()->Resolve(url);
|
| - } else {
|
| - resolved_url = url;
|
| - }
|
| -
|
| - if (resolved_url.SchemeIsFile()) {
|
| - loaders_.push_back(new LocalLoader(resolved_url,
|
| - context_,
|
| - runner_factory_.get(),
|
| - load_callbacks,
|
| - loader_complete_callback_));
|
| - return;
|
| - }
|
| -
|
| - if (!network_service_) {
|
| - context_->application_manager()->ConnectToService(
|
| - GURL("mojo:network_service"), &network_service_);
|
| - }
|
| -
|
| - loaders_.push_back(new NetworkLoader(resolved_url,
|
| - &mime_type_to_url_,
|
| - context_,
|
| - runner_factory_.get(),
|
| - network_service_.get(),
|
| - load_callbacks,
|
| - loader_complete_callback_));
|
| -}
|
| -
|
| -void DynamicApplicationLoader::OnApplicationError(ApplicationManager* manager,
|
| - const GURL& url) {
|
| - // TODO(darin): What should we do about service errors? This implies that
|
| - // the app closed its handle to the service manager. Maybe we don't care?
|
| -}
|
| -
|
| -void DynamicApplicationLoader::LoaderComplete(Loader* loader) {
|
| - loaders_.erase(std::find(loaders_.begin(), loaders_.end(), loader));
|
| -}
|
| -
|
| -} // namespace shell
|
| -} // namespace mojo
|
|
|