| Index: net/base/net_util.cc
 | 
| ===================================================================
 | 
| --- net/base/net_util.cc	(revision 29772)
 | 
| +++ net/base/net_util.cc	(working copy)
 | 
| @@ -749,6 +749,18 @@
 | 
|    return result;
 | 
|  }
 | 
|  
 | 
| +// Converts a UTF-8 string to a FilePath string type.
 | 
| +//
 | 
| +// This is inline with the hope that the function will be "free" on non-Windows
 | 
| +// platforms.
 | 
| +inline FilePath::StringType UTF8ToFilePathString(const std::string& utf8) {
 | 
| +#if defined(OS_WIN)
 | 
| +  return FilePath::StringType(UTF8ToUTF16(utf8));
 | 
| +#else
 | 
| +  return utf8;
 | 
| +#endif
 | 
| +}
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  namespace net {
 | 
| @@ -805,19 +817,19 @@
 | 
|    return GetSpecificHeaderT(headers, name);
 | 
|  }
 | 
|  
 | 
| -std::wstring GetFileNameFromCD(const std::string& header,
 | 
| -                               const std::string& referrer_charset) {
 | 
| +std::string GetFileNameFromCD(const std::string& header,
 | 
| +                              const std::string& referrer_charset) {
 | 
|    std::string param_value = GetHeaderParamValue(header, "filename");
 | 
|    if (param_value.empty()) {
 | 
|      // Some servers use 'name' parameter.
 | 
|      param_value = GetHeaderParamValue(header, "name");
 | 
|    }
 | 
|    if (param_value.empty())
 | 
| -    return std::wstring();
 | 
| +    return std::string();
 | 
|    std::string decoded;
 | 
|    if (DecodeParamValue(param_value, referrer_charset, &decoded))
 | 
| -    return UTF8ToWide(decoded);
 | 
| -  return std::wstring();
 | 
| +    return decoded;
 | 
| +  return std::string();
 | 
|  }
 | 
|  
 | 
|  std::wstring GetHeaderParamValue(const std::wstring& field,
 | 
| @@ -1032,60 +1044,72 @@
 | 
|        text.substr(www.length()) : text;
 | 
|  }
 | 
|  
 | 
| -std::wstring GetSuggestedFilename(const GURL& url,
 | 
| -                                  const std::string& content_disposition,
 | 
| -                                  const std::string& referrer_charset,
 | 
| -                                  const std::wstring& default_name) {
 | 
| +FilePath GetSuggestedFilename(const GURL& url,
 | 
| +                              const std::string& content_disposition,
 | 
| +                              const std::string& referrer_charset,
 | 
| +                              const char* default_name) {
 | 
|    // TODO(rolandsteiner): as pointed out by darin in the code review, this is
 | 
|    // hardly ideal. "download" should be translated, or another solution found.
 | 
|    // (cf. http://code.google.com/p/chromium/issues/detail?id=25289)
 | 
| -  const wchar_t kFinalFallbackName[] = L"download";
 | 
| +  const char kFinalFallbackName[] = "download";
 | 
|  
 | 
|    // about: and data: URLs don't have file names, but esp. data: URLs may
 | 
|    // contain parts that look like ones (i.e., contain a slash).
 | 
|    // Therefore we don't attempt to divine a file name out of them.
 | 
| -  if (url.SchemeIs("about") || url.SchemeIs("data"))
 | 
| -    return default_name.empty() ? std::wstring(kFinalFallbackName)
 | 
| -                                : default_name;
 | 
| +  if (url.SchemeIs("about") || url.SchemeIs("data")) {
 | 
| +    return FilePath(UTF8ToFilePathString(
 | 
| +        default_name && default_name[0] ? default_name : kFinalFallbackName));
 | 
| +  }
 | 
|  
 | 
| -  std::wstring filename = GetFileNameFromCD(content_disposition,
 | 
| -                                            referrer_charset);
 | 
| +  std::string filename = GetFileNameFromCD(content_disposition,
 | 
| +                                           referrer_charset);
 | 
|    if (!filename.empty()) {
 | 
|      // Remove any path information the server may have sent, take the name
 | 
|      // only.
 | 
| -    filename = file_util::GetFilenameFromPath(filename);
 | 
| +#if defined(OS_WIN)
 | 
| +    filename = UTF16ToUTF8(FilePath(UTF8ToUTF16(filename)).BaseName().value());
 | 
| +#else
 | 
| +    filename = FilePath(filename).BaseName().value();
 | 
| +#endif
 | 
| +
 | 
|      // Next, remove "." from the beginning and end of the file name to avoid
 | 
|      // tricks with hidden files, "..", and "."
 | 
| -    TrimString(filename, L".", &filename);
 | 
| +    TrimString(filename, ".", &filename);
 | 
|    }
 | 
|    if (filename.empty()) {
 | 
|      if (url.is_valid()) {
 | 
| -      filename = UnescapeAndDecodeUTF8URLComponent(
 | 
| +      filename = UnescapeURLComponent(
 | 
|            url.ExtractFileName(),
 | 
|            UnescapeRule::SPACES | UnescapeRule::URL_SPECIAL_CHARS);
 | 
|      }
 | 
|    }
 | 
|  
 | 
|    // Trim '.' once more.
 | 
| -  TrimString(filename, L".", &filename);
 | 
| +  TrimString(filename, ".", &filename);
 | 
| +
 | 
|    // If there's no filename or it gets trimed to be empty, use
 | 
|    // the URL hostname or default_name
 | 
|    if (filename.empty()) {
 | 
| -    if (!default_name.empty()) {
 | 
| +    if (default_name && default_name[0]) {
 | 
|        filename = default_name;
 | 
|      } else if (url.is_valid()) {
 | 
|        // Some schemes (e.g. file) do not have a hostname. Even though it's
 | 
|        // not likely to reach here, let's hardcode the last fallback name.
 | 
|        // TODO(jungshik) : Decode a 'punycoded' IDN hostname. (bug 1264451)
 | 
| -      filename = url.host().empty() ? std::wstring(kFinalFallbackName)
 | 
| -                                    : UTF8ToWide(url.host());
 | 
| +      filename = url.host().empty() ? std::string(kFinalFallbackName)
 | 
| +                                    : url.host();
 | 
|      } else {
 | 
|        NOTREACHED();
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  file_util::ReplaceIllegalCharacters(&filename, '-');
 | 
| -  return filename;
 | 
| +#if defined(OS_WIN)
 | 
| +  FilePath::StringType file_path_string = UTF8ToWide(filename);
 | 
| +#else
 | 
| +  std::string& file_path_string = filename;
 | 
| +#endif
 | 
| +  file_util::ReplaceIllegalCharactersInPath(&file_path_string, '-');
 | 
| +  return FilePath(file_path_string);
 | 
|  }
 | 
|  
 | 
|  bool IsPortAllowedByDefault(int port) {
 | 
| 
 |