Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: chrome/browser/net/url_fixer_upper.cc

Issue 372017: Fix various problems with inline autocomplete and URLs that change length dur... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/net/browser_url_util.cc ('k') | chrome/browser/net/url_fixer_upper_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/net/url_fixer_upper.h" 5 #include "chrome/browser/net/url_fixer_upper.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/string_util.h" 11 #include "base/string_util.h"
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 #if defined(OS_MACOSX) 139 #if defined(OS_MACOSX)
140 static const char kHome[] = "/Users/"; 140 static const char kHome[] = "/Users/";
141 #else 141 #else
142 static const char kHome[] = "/home/"; 142 static const char kHome[] = "/home/";
143 #endif 143 #endif
144 return kHome + text.substr(1); 144 return kHome + text.substr(1);
145 } 145 }
146 #endif 146 #endif
147 147
148 // Tries to create a file: URL from |text| if it looks like a filename, even if 148 // Tries to create a file: URL from |text| if it looks like a filename, even if
149 // it doesn't resolve as a valid path or to an existing file. Returns true 149 // it doesn't resolve as a valid path or to an existing file. Returns a
150 // with a (possibly invalid) file: URL in |fixed_up_url| for input beginning 150 // (possibly invalid) file: URL in |fixed_up_url| for input beginning
151 // with a drive specifier or "\\". Returns false in other cases (including 151 // with a drive specifier or "\\". Returns the unchanged input in other cases
152 // file: URLs: these don't look like filenames), leaving fixed_up_url 152 // (including file: URLs: these don't look like filenames).
153 // unchanged.
154 static string FixupPath(const string& text) { 153 static string FixupPath(const string& text) {
155 DCHECK(!text.empty()); 154 DCHECK(!text.empty());
156 155
157 FilePath::StringType filename; 156 FilePath::StringType filename;
158 #if defined(OS_WIN) 157 #if defined(OS_WIN)
159 FilePath input_path(UTF8ToWide(text)); 158 FilePath input_path(UTF8ToWide(text));
160 PrepareStringForFileOps(input_path, &filename); 159 PrepareStringForFileOps(input_path, &filename);
161 160
162 // Fixup Windows-style drive letters, where "C:" gets rewritten to "C|". 161 // Fixup Windows-style drive letters, where "C:" gets rewritten to "C|".
163 if (filename.length() > 1 && filename[1] == '|') 162 if (filename.length() > 1 && filename[1] == '|')
164 filename[1] = ':'; 163 filename[1] = ':';
165 #elif defined(OS_POSIX) 164 #elif defined(OS_POSIX)
166 FilePath input_path(text); 165 FilePath input_path(text);
167 PrepareStringForFileOps(input_path, &filename); 166 PrepareStringForFileOps(input_path, &filename);
168 if (filename.length() > 0 && filename[0] == '~') 167 if (filename.length() > 0 && filename[0] == '~')
169 filename = FixupHomedir(filename); 168 filename = FixupHomedir(filename);
170 #endif 169 #endif
171 170
172 // Here, we know the input looks like a file. 171 // Here, we know the input looks like a file.
173 GURL file_url = net::FilePathToFileURL(FilePath(filename)); 172 GURL file_url = net::FilePathToFileURL(FilePath(filename));
174 if (file_url.is_valid()) { 173 if (file_url.is_valid()) {
175 return WideToUTF8(net::FormatUrl(file_url, std::wstring(), true, 174 return WideToUTF8(net::FormatUrl(file_url, std::wstring(), true,
176 UnescapeRule::NORMAL, NULL, NULL)); 175 UnescapeRule::NORMAL, NULL, NULL, NULL));
177 } 176 }
178 177
179 // Invalid file URL, just return the input. 178 // Invalid file URL, just return the input.
180 return text; 179 return text;
181 } 180 }
182 181
183 // Checks |domain| to see if a valid TLD is already present. If not, appends 182 // Checks |domain| to see if a valid TLD is already present. If not, appends
184 // |desired_tld| to the domain, and prepends "www." unless it's already present. 183 // |desired_tld| to the domain, and prepends "www." unless it's already present.
185 // Then modifies |fixed_up_url| to reflect the changes.
186 static void AddDesiredTLD(const string& desired_tld, 184 static void AddDesiredTLD(const string& desired_tld,
187 string* domain) { 185 string* domain) {
188 if (desired_tld.empty() || domain->empty()) 186 if (desired_tld.empty() || domain->empty())
189 return; 187 return;
190 188
191 // Check the TLD. If the return value is positive, we already have a TLD, so 189 // Check the TLD. If the return value is positive, we already have a TLD, so
192 // abort; if the return value is string::npos, there's no valid host (e.g. if 190 // abort; if the return value is string::npos, there's no valid host (e.g. if
193 // the user pasted in garbage for which HistoryURLProvider is trying to 191 // the user pasted in garbage for which HistoryURLProvider is trying to
194 // suggest an exact match), so adding a TLD makes no sense. The only useful 192 // suggest an exact match), so adding a TLD makes no sense. The only useful
195 // case is where the return value is 0 (there's a valid host with no known 193 // case is where the return value is 0 (there's a valid host with no known
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 if (last_nondot < domain.length()) 259 if (last_nondot < domain.length())
262 domain.erase(last_nondot); 260 domain.erase(last_nondot);
263 } 261 }
264 262
265 // Add any user-specified TLD, if applicable. 263 // Add any user-specified TLD, if applicable.
266 AddDesiredTLD(desired_tld, &domain); 264 AddDesiredTLD(desired_tld, &domain);
267 265
268 url->append(domain); 266 url->append(domain);
269 } 267 }
270 268
271 // Looks for a port number, including initial colon, at port_start. If
272 // something invalid (which cannot be fixed up) is found, like ":foo" or
273 // ":7:7", returns false. Otherwise, removes any extra colons
274 // ("::1337" -> ":1337", ":/" -> "/") and returns true.
275 static void FixupPort(const string& text, 269 static void FixupPort(const string& text,
276 const url_parse::Component& part, 270 const url_parse::Component& part,
277 string* url) { 271 string* url) {
278 if (!part.is_valid()) 272 if (!part.is_valid())
279 return; 273 return;
280 274
281 // Look for non-digit in port and strip if found. 275 // We don't fix up the port at the moment.
282 string port(text, part.begin, part.len);
283 for (string::iterator i = port.begin(); i != port.end();) {
284 if (IsAsciiDigit(*i))
285 ++i;
286 else
287 i = port.erase(i);
288 }
289
290 if (port.empty())
291 return; // Nothing to append.
292
293 url->append(":"); 276 url->append(":");
294 url->append(port); 277 url->append(text, part.begin, part.len);
295 } 278 }
296 279
297 static inline void FixupPath(const string& text, 280 static inline void FixupPath(const string& text,
298 const url_parse::Component& part, 281 const url_parse::Component& part,
299 string* url) { 282 string* url) {
300 if (!part.is_valid() || part.len == 0) { 283 if (!part.is_valid() || part.len == 0) {
301 // We should always have a path. 284 // We should always have a path.
302 url->append("/"); 285 url->append("/");
303 return; 286 return;
304 } 287 }
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 549
567 // Put back the current directory if we saved it. 550 // Put back the current directory if we saved it.
568 if (!base_dir.empty()) { 551 if (!base_dir.empty()) {
569 file_util::SetCurrentDirectory(old_cur_directory); 552 file_util::SetCurrentDirectory(old_cur_directory);
570 } 553 }
571 554
572 if (is_file) { 555 if (is_file) {
573 GURL file_url = net::FilePathToFileURL(full_path); 556 GURL file_url = net::FilePathToFileURL(full_path);
574 if (file_url.is_valid()) 557 if (file_url.is_valid())
575 return WideToUTF8(net::FormatUrl(file_url, std::wstring(), 558 return WideToUTF8(net::FormatUrl(file_url, std::wstring(),
576 true, UnescapeRule::NORMAL, NULL, NULL)); 559 true, UnescapeRule::NORMAL, NULL, NULL, NULL));
577 // Invalid files fall through to regular processing. 560 // Invalid files fall through to regular processing.
578 } 561 }
579 562
580 // Fall back on regular fixup for this input. 563 // Fall back on regular fixup for this input.
581 #if defined(OS_WIN) 564 #if defined(OS_WIN)
582 string text_utf8 = WideToUTF8(text.value()); 565 string text_utf8 = WideToUTF8(text.value());
583 #elif defined(OS_POSIX) 566 #elif defined(OS_POSIX)
584 string text_utf8 = text.value(); 567 string text_utf8 = text.value();
585 #endif 568 #endif
586 return FixupURL(text_utf8, ""); 569 return FixupURL(text_utf8, "");
(...skipping 10 matching lines...) Expand all
597 } 580 }
598 wstring URLFixerUpper::FixupURL(const wstring& text, 581 wstring URLFixerUpper::FixupURL(const wstring& text,
599 const wstring& desired_tld) { 582 const wstring& desired_tld) {
600 return UTF8ToWide(FixupURL(WideToUTF8(text), WideToUTF8(desired_tld))); 583 return UTF8ToWide(FixupURL(WideToUTF8(text), WideToUTF8(desired_tld)));
601 } 584 }
602 wstring URLFixerUpper::FixupRelativeFile(const wstring& base_dir, 585 wstring URLFixerUpper::FixupRelativeFile(const wstring& base_dir,
603 const wstring& text) { 586 const wstring& text) {
604 return UTF8ToWide(FixupRelativeFile(FilePath::FromWStringHack(base_dir), 587 return UTF8ToWide(FixupRelativeFile(FilePath::FromWStringHack(base_dir),
605 FilePath::FromWStringHack(text))); 588 FilePath::FromWStringHack(text)));
606 } 589 }
OLDNEW
« no previous file with comments | « chrome/browser/net/browser_url_util.cc ('k') | chrome/browser/net/url_fixer_upper_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698