Index: trunk/src/net/base/net_util_posix.cc |
=================================================================== |
--- trunk/src/net/base/net_util_posix.cc (revision 262497) |
+++ trunk/src/net/base/net_util_posix.cc (working copy) |
@@ -85,6 +85,40 @@ |
} // namespace |
+bool FileURLToFilePath(const GURL& url, base::FilePath* path) { |
+ *path = base::FilePath(); |
+ std::string& file_path_str = const_cast<std::string&>(path->value()); |
+ file_path_str.clear(); |
+ |
+ if (!url.is_valid()) |
+ return false; |
+ |
+ // Firefox seems to ignore the "host" of a file url if there is one. That is, |
+ // file://foo/bar.txt maps to /bar.txt. |
+ // TODO(dhg): This should probably take into account UNCs which could |
+ // include a hostname other than localhost or blank |
+ std::string old_path = url.path(); |
+ |
+ if (old_path.empty()) |
+ return false; |
+ |
+ // GURL stores strings as percent-encoded 8-bit, this will undo if possible. |
+ old_path = UnescapeURLComponent(old_path, |
+ UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS); |
+ |
+ // Collapse multiple path slashes into a single path slash. |
+ std::string new_path; |
+ do { |
+ new_path = old_path; |
+ ReplaceSubstringsAfterOffset(&new_path, 0, "//", "/"); |
+ old_path.swap(new_path); |
+ } while (new_path != old_path); |
+ |
+ file_path_str.assign(old_path); |
+ |
+ return !file_path_str.empty(); |
+} |
+ |
bool GetNetworkList(NetworkInterfaceList* networks, int policy) { |
#if defined(OS_ANDROID) |
std::string network_list = android::GetNetworkList(); |