Home | History | Annotate | Download | only in shell
      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
      3 // found in the LICENSE file.
      4 
      5 #include "mojo/shell/mojo_url_resolver.h"
      6 
      7 #include "base/base_paths.h"
      8 #include "base/files/file_path.h"
      9 #include "base/logging.h"
     10 #include "base/path_service.h"
     11 #include "net/base/filename_util.h"
     12 #include "url/url_util.h"
     13 
     14 namespace mojo {
     15 namespace shell {
     16 namespace {
     17 
     18 std::string MakeSharedLibraryName(const std::string& host_name) {
     19 #if defined(OS_WIN)
     20   return host_name + ".dll";
     21 #elif defined(OS_LINUX) || defined(OS_ANDROID)
     22   return "lib" + host_name + ".so";
     23 #elif defined(OS_MACOSX)
     24   return host_name + ".so";
     25 #else
     26   NOTREACHED() << "dynamic loading of services not supported";
     27   return std::string();
     28 #endif
     29 }
     30 
     31 GURL AddTrailingSlashIfNeeded(const GURL& url) {
     32   if (!url.has_path() || *url.path().rbegin() == '/')
     33     return url;
     34 
     35   std::string path(url.path() + '/');
     36   GURL::Replacements replacements;
     37   replacements.SetPathStr(path);
     38   return url.ReplaceComponents(replacements);
     39 }
     40 
     41 }  // namespace
     42 
     43 MojoURLResolver::MojoURLResolver() {
     44   // Needed to treat first component of mojo URLs as host, not path.
     45   url::AddStandardScheme("mojo");
     46 
     47   // By default, resolve mojo URLs to files living alongside the shell.
     48   base::FilePath path;
     49   PathService::Get(base::DIR_MODULE, &path);
     50   default_base_url_ = AddTrailingSlashIfNeeded(net::FilePathToFileURL(path));
     51 }
     52 
     53 MojoURLResolver::~MojoURLResolver() {
     54 }
     55 
     56 void MojoURLResolver::SetBaseURL(const GURL& base_url) {
     57   DCHECK(base_url.is_valid());
     58   // Force a trailing slash on the base_url to simplify resolving
     59   // relative files and URLs below.
     60   base_url_ = AddTrailingSlashIfNeeded(base_url);
     61 }
     62 
     63 void MojoURLResolver::AddCustomMapping(const GURL& mojo_url,
     64                                        const GURL& resolved_url) {
     65   url_map_[mojo_url] = resolved_url;
     66 }
     67 
     68 void MojoURLResolver::AddLocalFileMapping(const GURL& mojo_url) {
     69   local_file_set_.insert(mojo_url);
     70 }
     71 
     72 GURL MojoURLResolver::Resolve(const GURL& mojo_url) const {
     73   std::map<GURL, GURL>::const_iterator it = url_map_.find(mojo_url);
     74   if (it != url_map_.end())
     75     return it->second;
     76 
     77   std::string lib = MakeSharedLibraryName(mojo_url.host());
     78 
     79   if (!base_url_.is_valid() ||
     80       local_file_set_.find(mojo_url) != local_file_set_.end()) {
     81     // Resolve to a local file URL.
     82     return default_base_url_.Resolve(lib);
     83   }
     84 
     85   // Otherwise, resolve to an URL relative to base_url_.
     86   return base_url_.Resolve(lib);
     87 }
     88 
     89 }  // namespace shell
     90 }  // namespace mojo
     91