| // 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/mojo_url_resolver.h" |
| |
| #include "base/base_paths.h" |
| #include "base/files/file_path.h" |
| #include "base/logging.h" |
| #include "base/path_service.h" |
| #include "net/base/filename_util.h" |
| #include "url/url_util.h" |
| |
| namespace mojo { |
| namespace shell { |
| namespace { |
| |
| std::string MakeSharedLibraryName(const std::string& host_name) { |
| #if defined(OS_WIN) |
| return host_name + ".dll"; |
| #elif defined(OS_LINUX) || defined(OS_ANDROID) |
| return "lib" + host_name + ".so"; |
| #elif defined(OS_MACOSX) |
| return host_name + ".so"; |
| #else |
| NOTREACHED() << "dynamic loading of services not supported"; |
| return std::string(); |
| #endif |
| } |
| |
| } // namespace |
| |
| MojoURLResolver::MojoURLResolver() { |
| // Needed to treat first component of mojo URLs as host, not path. |
| url::AddStandardScheme("mojo"); |
| } |
| |
| MojoURLResolver::~MojoURLResolver() { |
| } |
| |
| void MojoURLResolver::AddCustomMapping(const GURL& mojo_url, |
| const GURL& resolved_url) { |
| url_map_[mojo_url] = resolved_url; |
| } |
| |
| void MojoURLResolver::AddLocalFileMapping(const GURL& mojo_url) { |
| local_file_set_.insert(mojo_url); |
| } |
| |
| GURL MojoURLResolver::Resolve(const GURL& mojo_url) const { |
| std::map<GURL, GURL>::const_iterator it = url_map_.find(mojo_url); |
| if (it != url_map_.end()) |
| return it->second; |
| |
| std::string lib = MakeSharedLibraryName(mojo_url.host()); |
| |
| if (local_file_set_.find(mojo_url) != local_file_set_.end()) { |
| // Resolve to a local file URL. |
| base::FilePath path; |
| PathService::Get(base::DIR_MODULE, &path); |
| path = path.Append(base::FilePath::FromUTF8Unsafe(lib)); |
| return net::FilePathToFileURL(path); |
| } |
| |
| // Otherwise, resolve to an URL relative to origin_. |
| return GURL(origin_ + "/" + lib); |
| } |
| |
| } // namespace shell |
| } // namespace mojo |