OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #if defined(OS_POSIX) | 9 #if defined(OS_POSIX) |
10 #include "base/environment.h" | 10 #include "base/environment.h" |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 // Tries to create a file: URL from |text| if it looks like a filename, even if | 149 // Tries to create a file: URL from |text| if it looks like a filename, even if |
150 // it doesn't resolve as a valid path or to an existing file. Returns a | 150 // it doesn't resolve as a valid path or to an existing file. Returns a |
151 // (possibly invalid) file: URL in |fixed_up_url| for input beginning | 151 // (possibly invalid) file: URL in |fixed_up_url| for input beginning |
152 // with a drive specifier or "\\". Returns the unchanged input in other cases | 152 // with a drive specifier or "\\". Returns the unchanged input in other cases |
153 // (including file: URLs: these don't look like filenames). | 153 // (including file: URLs: these don't look like filenames). |
154 static std::string FixupPath(const std::string& text) { | 154 static std::string FixupPath(const std::string& text) { |
155 DCHECK(!text.empty()); | 155 DCHECK(!text.empty()); |
156 | 156 |
157 base::FilePath::StringType filename; | 157 base::FilePath::StringType filename; |
158 #if defined(OS_WIN) | 158 #if defined(OS_WIN) |
159 base::FilePath input_path(UTF8ToWide(text)); | 159 base::FilePath input_path(base::UTF8ToWide(text)); |
160 PrepareStringForFileOps(input_path, &filename); | 160 PrepareStringForFileOps(input_path, &filename); |
161 | 161 |
162 // Fixup Windows-style drive letters, where "C:" gets rewritten to "C|". | 162 // Fixup Windows-style drive letters, where "C:" gets rewritten to "C|". |
163 if (filename.length() > 1 && filename[1] == '|') | 163 if (filename.length() > 1 && filename[1] == '|') |
164 filename[1] = ':'; | 164 filename[1] = ':'; |
165 #elif defined(OS_POSIX) | 165 #elif defined(OS_POSIX) |
166 base::FilePath input_path(text); | 166 base::FilePath input_path(text); |
167 PrepareStringForFileOps(input_path, &filename); | 167 PrepareStringForFileOps(input_path, &filename); |
168 if (filename.length() > 0 && filename[0] == '~') | 168 if (filename.length() > 0 && filename[0] == '~') |
169 filename = FixupHomedir(filename); | 169 filename = FixupHomedir(filename); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
556 // Avoid recognizing definite non-file URLs as file paths. | 556 // Avoid recognizing definite non-file URLs as file paths. |
557 GURL gurl(trimmed); | 557 GURL gurl(trimmed); |
558 if (gurl.is_valid() && gurl.IsStandard()) | 558 if (gurl.is_valid() && gurl.IsStandard()) |
559 is_file = false; | 559 is_file = false; |
560 base::FilePath full_path; | 560 base::FilePath full_path; |
561 if (is_file && !ValidPathForFile(trimmed, &full_path)) { | 561 if (is_file && !ValidPathForFile(trimmed, &full_path)) { |
562 // Not a path as entered, try unescaping it in case the user has | 562 // Not a path as entered, try unescaping it in case the user has |
563 // escaped things. We need to go through 8-bit since the escaped values | 563 // escaped things. We need to go through 8-bit since the escaped values |
564 // only represent 8-bit values. | 564 // only represent 8-bit values. |
565 #if defined(OS_WIN) | 565 #if defined(OS_WIN) |
566 std::wstring unescaped = UTF8ToWide(net::UnescapeURLComponent( | 566 std::wstring unescaped = base::UTF8ToWide(net::UnescapeURLComponent( |
567 WideToUTF8(trimmed), | 567 base::WideToUTF8(trimmed), |
568 net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS)); | 568 net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS)); |
569 #elif defined(OS_POSIX) | 569 #elif defined(OS_POSIX) |
570 std::string unescaped = net::UnescapeURLComponent( | 570 std::string unescaped = net::UnescapeURLComponent( |
571 trimmed, | 571 trimmed, |
572 net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS); | 572 net::UnescapeRule::SPACES | net::UnescapeRule::URL_SPECIAL_CHARS); |
573 #endif | 573 #endif |
574 | 574 |
575 if (!ValidPathForFile(unescaped, &full_path)) | 575 if (!ValidPathForFile(unescaped, &full_path)) |
576 is_file = false; | 576 is_file = false; |
577 } | 577 } |
578 | 578 |
579 // Put back the current directory if we saved it. | 579 // Put back the current directory if we saved it. |
580 if (!base_dir.empty()) | 580 if (!base_dir.empty()) |
581 file_util::SetCurrentDirectory(old_cur_directory); | 581 file_util::SetCurrentDirectory(old_cur_directory); |
582 | 582 |
583 if (is_file) { | 583 if (is_file) { |
584 GURL file_url = net::FilePathToFileURL(full_path); | 584 GURL file_url = net::FilePathToFileURL(full_path); |
585 if (file_url.is_valid()) | 585 if (file_url.is_valid()) |
586 return GURL(UTF16ToUTF8(net::FormatUrl(file_url, std::string(), | 586 return GURL(UTF16ToUTF8(net::FormatUrl(file_url, std::string(), |
587 net::kFormatUrlOmitUsernamePassword, net::UnescapeRule::NORMAL, NULL, | 587 net::kFormatUrlOmitUsernamePassword, net::UnescapeRule::NORMAL, NULL, |
588 NULL, NULL))); | 588 NULL, NULL))); |
589 // Invalid files fall through to regular processing. | 589 // Invalid files fall through to regular processing. |
590 } | 590 } |
591 | 591 |
592 // Fall back on regular fixup for this input. | 592 // Fall back on regular fixup for this input. |
593 #if defined(OS_WIN) | 593 #if defined(OS_WIN) |
594 std::string text_utf8 = WideToUTF8(text.value()); | 594 std::string text_utf8 = base::WideToUTF8(text.value()); |
595 #elif defined(OS_POSIX) | 595 #elif defined(OS_POSIX) |
596 std::string text_utf8 = text.value(); | 596 std::string text_utf8 = text.value(); |
597 #endif | 597 #endif |
598 return FixupURL(text_utf8, std::string()); | 598 return FixupURL(text_utf8, std::string()); |
599 } | 599 } |
600 | 600 |
601 string16 URLFixerUpper::SegmentURL(const string16& text, | 601 string16 URLFixerUpper::SegmentURL(const string16& text, |
602 url_parse::Parsed* parts) { | 602 url_parse::Parsed* parts) { |
603 std::string text_utf8 = UTF16ToUTF8(text); | 603 std::string text_utf8 = UTF16ToUTF8(text); |
604 url_parse::Parsed parts_utf8; | 604 url_parse::Parsed parts_utf8; |
605 std::string scheme_utf8 = SegmentURL(text_utf8, &parts_utf8); | 605 std::string scheme_utf8 = SegmentURL(text_utf8, &parts_utf8); |
606 UTF8PartsToUTF16Parts(text_utf8, parts_utf8, parts); | 606 UTF8PartsToUTF16Parts(text_utf8, parts_utf8, parts); |
607 return UTF8ToUTF16(scheme_utf8); | 607 return UTF8ToUTF16(scheme_utf8); |
608 } | 608 } |
609 | 609 |
610 void URLFixerUpper::OffsetComponent(int offset, url_parse::Component* part) { | 610 void URLFixerUpper::OffsetComponent(int offset, url_parse::Component* part) { |
611 DCHECK(part); | 611 DCHECK(part); |
612 | 612 |
613 if (part->is_valid()) { | 613 if (part->is_valid()) { |
614 // Offset the location of this component. | 614 // Offset the location of this component. |
615 part->begin += offset; | 615 part->begin += offset; |
616 | 616 |
617 // This part might not have existed in the original text. | 617 // This part might not have existed in the original text. |
618 if (part->begin < 0) | 618 if (part->begin < 0) |
619 part->reset(); | 619 part->reset(); |
620 } | 620 } |
621 } | 621 } |
OLD | NEW |