| Index: mojo/fetcher/local_fetcher.cc
|
| diff --git a/mojo/fetcher/local_fetcher.cc b/mojo/fetcher/local_fetcher.cc
|
| index 13f370232079d54bd9716a76ab541091482dc859..1bce4a545689213c30b13eee6c8302354ea411e6 100644
|
| --- a/mojo/fetcher/local_fetcher.cc
|
| +++ b/mojo/fetcher/local_fetcher.cc
|
| @@ -5,6 +5,7 @@
|
| #include "mojo/fetcher/local_fetcher.h"
|
|
|
| #include "base/bind.h"
|
| +#include "base/command_line.h"
|
| #include "base/files/file_util.h"
|
| #include "base/format_macros.h"
|
| #include "base/message_loop/message_loop.h"
|
| @@ -15,6 +16,7 @@
|
| #include "mojo/common/data_pipe_utils.h"
|
| #include "mojo/common/url_type_converters.h"
|
| #include "mojo/services/network/public/interfaces/network_service.mojom.h"
|
| +#include "mojo/shell/switches.h"
|
| #include "mojo/util/filename_util.h"
|
| #include "url/url_util.h"
|
|
|
| @@ -31,10 +33,12 @@ void IgnoreResult(bool result) {
|
| LocalFetcher::LocalFetcher(NetworkService* network_service,
|
| const GURL& url,
|
| const GURL& url_without_query,
|
| + const base::FilePath& shell_file_root,
|
| const FetchCallback& loader_callback)
|
| : Fetcher(loader_callback),
|
| url_(url),
|
| - path_(util::UrlToFilePath(url_without_query)) {
|
| + path_(util::UrlToFilePath(url_without_query)),
|
| + shell_file_root_(shell_file_root) {
|
| TRACE_EVENT1("mojo_shell", "LocalFetcher::LocalFetcher", "url", url.spec());
|
| const std::string ext(base::FilePath(path_.Extension()).AsUTF8Unsafe());
|
| if (network_service && !base::EqualsCaseInsensitiveASCII(ext, ".mojo")) {
|
| @@ -47,6 +51,8 @@ LocalFetcher::LocalFetcher(NetworkService* network_service,
|
| }
|
| }
|
|
|
| +LocalFetcher::~LocalFetcher() {}
|
| +
|
| void LocalFetcher::GetMimeTypeFromFileCallback(const mojo::String& mime_type) {
|
| mime_type_ = mime_type.To<std::string>();
|
| loader_callback_.Run(make_scoped_ptr(this));
|
| @@ -57,6 +63,32 @@ const GURL& LocalFetcher::GetURL() const {
|
| }
|
|
|
| GURL LocalFetcher::GetRedirectURL() const {
|
| + // Use Mandoline's Google Storage bucket if the Mojo component does not exist.
|
| + // TODO(msw): Integrate with Mandoline's component updater? crbug.com/479169
|
| + // TODO(msw): Integrate with planned Omaha fetcher and updater work.
|
| + // TODO(msw): Support fetching apps with resource files.
|
| + // TODO(msw): Handle broken URLs. (unavailable component files, etc.)
|
| + // TODO(msw): Avoid kPredictableAppFilenames switch? (need executable bit set)
|
| + if (!base::PathExists(path_) && shell_file_root_.IsParent(path_) &&
|
| + path_.MatchesExtension(FILE_PATH_LITERAL(".mojo")) &&
|
| + base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kPredictableAppFilenames)) {
|
| + GURL url("https://storage.googleapis.com/mandoline/");
|
| + const std::string version("latest/");
|
| +#if defined(OS_WIN)
|
| + const std::string platform("win/");
|
| +#elif defined(OS_LINUX)
|
| + const std::string platform("linux/");
|
| +#else
|
| + const std::string platform("unknown/");
|
| +#endif
|
| + // Get the app path relative to the shell (and Google Storage) file root.
|
| + base::FilePath app_path;
|
| + bool result = shell_file_root_.AppendRelativePath(path_, &app_path);
|
| + DCHECK(result);
|
| + url = url.Resolve(version).Resolve(platform).Resolve(app_path.value());
|
| + return url;
|
| + }
|
| return GURL::EmptyGURL();
|
| }
|
|
|
|
|