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