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

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

Issue 7068007: Revise about: and chrome: url handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments. Created 9 years, 6 months 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 // Otherwise, we need to look at things carefully. 400 // Otherwise, we need to look at things carefully.
401 std::string scheme; 401 std::string scheme;
402 if (!GetValidScheme(text, &parts->scheme, &scheme)) { 402 if (!GetValidScheme(text, &parts->scheme, &scheme)) {
403 // Couldn't determine the scheme, so just pick one. 403 // Couldn't determine the scheme, so just pick one.
404 parts->scheme.reset(); 404 parts->scheme.reset();
405 scheme.assign(StartsWithASCII(text, "ftp.", false) ? 405 scheme.assign(StartsWithASCII(text, "ftp.", false) ?
406 chrome::kFtpScheme : chrome::kHttpScheme); 406 chrome::kFtpScheme : chrome::kHttpScheme);
407 } 407 }
408 408
409 // Not segmenting file schemes or nonstandard schemes. 409 // Not segmenting file schemes or nonstandard schemes.
410 if ((scheme == chrome::kFileScheme) || 410 if ((scheme != chrome::kAboutScheme) && (scheme != chrome::kChromeUIScheme) &&
411 !url_util::IsStandard(scheme.c_str(), 411 ((scheme == chrome::kFileScheme) || !url_util::IsStandard(scheme.c_str(),
412 url_parse::Component(0, static_cast<int>(scheme.length())))) 412 url_parse::Component(0, static_cast<int>(scheme.length())))))
413 return scheme; 413 return scheme;
414 414
415 if (parts->scheme.is_valid()) { 415 if (parts->scheme.is_valid()) {
416 // Have the GURL parser do the heavy lifting for us. 416 // Have the GURL parser do the heavy lifting for us.
417 url_parse::ParseStandardURL(text.data(), static_cast<int>(text.length()), 417 url_parse::ParseStandardURL(text.data(), static_cast<int>(text.length()),
418 parts); 418 parts);
419 return scheme; 419 return scheme;
420 } 420 }
421 421
422 // We need to add a scheme in order for ParseStandardURL to be happy. 422 // We need to add a scheme in order for ParseStandardURL to be happy.
423 // Find the first non-whitespace character. 423 // Find the first non-whitespace character.
424 std::string::const_iterator first_nonwhite = text.begin(); 424 std::string::const_iterator first_nonwhite = text.begin();
425 while ((first_nonwhite != text.end()) && IsWhitespace(*first_nonwhite)) 425 while ((first_nonwhite != text.end()) && IsWhitespace(*first_nonwhite))
426 ++first_nonwhite; 426 ++first_nonwhite;
427 427
428 // Construct the text to parse by inserting the scheme. 428 // Construct the text to parse by inserting the scheme.
429 std::string inserted_text(scheme); 429 std::string inserted_text(scheme);
430 inserted_text.append("://"); 430 inserted_text.append(chrome::kStandardSchemeSeparator);
431 std::string text_to_parse(text.begin(), first_nonwhite); 431 std::string text_to_parse(text.begin(), first_nonwhite);
432 text_to_parse.append(inserted_text); 432 text_to_parse.append(inserted_text);
433 text_to_parse.append(first_nonwhite, text.end()); 433 text_to_parse.append(first_nonwhite, text.end());
434 434
435 // Have the GURL parser do the heavy lifting for us. 435 // Have the GURL parser do the heavy lifting for us.
436 url_parse::ParseStandardURL(text_to_parse.data(), 436 url_parse::ParseStandardURL(text_to_parse.data(),
437 static_cast<int>(text_to_parse.length()), 437 static_cast<int>(text_to_parse.length()),
438 parts); 438 parts);
439 439
440 // Offset the results of the parse to match the original text. 440 // Offset the results of the parse to match the original text.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 } 475 }
476 476
477 // We handle the file scheme separately. 477 // We handle the file scheme separately.
478 if (scheme == chrome::kFileScheme) 478 if (scheme == chrome::kFileScheme)
479 return GURL(parts.scheme.is_valid() ? text : FixupPath(text)); 479 return GURL(parts.scheme.is_valid() ? text : FixupPath(text));
480 480
481 // For some schemes whose layouts we understand, we rebuild it. 481 // For some schemes whose layouts we understand, we rebuild it.
482 if (url_util::IsStandard(scheme.c_str(), 482 if (url_util::IsStandard(scheme.c_str(),
483 url_parse::Component(0, static_cast<int>(scheme.length())))) { 483 url_parse::Component(0, static_cast<int>(scheme.length())))) {
484 std::string url(scheme); 484 std::string url(scheme);
485 url.append("://"); 485 url.append(chrome::kStandardSchemeSeparator);
486 486
487 // We need to check whether the |username| is valid because it is our 487 // We need to check whether the |username| is valid because it is our
488 // responsibility to append the '@' to delineate the user information from 488 // responsibility to append the '@' to delineate the user information from
489 // the host portion of the URL. 489 // the host portion of the URL.
490 if (parts.username.is_valid()) { 490 if (parts.username.is_valid()) {
491 FixupUsername(trimmed, parts.username, &url); 491 FixupUsername(trimmed, parts.username, &url);
492 FixupPassword(trimmed, parts.password, &url); 492 FixupPassword(trimmed, parts.password, &url);
493 url.append("@"); 493 url.append("@");
494 } 494 }
495 495
496 FixupHost(trimmed, parts.host, parts.scheme.is_valid(), desired_tld, &url); 496 FixupHost(trimmed, parts.host, parts.scheme.is_valid(), desired_tld, &url);
497 FixupPort(trimmed, parts.port, &url); 497 FixupPort(trimmed, parts.port, &url);
498 FixupPath(trimmed, parts.path, &url); 498 FixupPath(trimmed, parts.path, &url);
499 FixupQuery(trimmed, parts.query, &url); 499 FixupQuery(trimmed, parts.query, &url);
500 FixupRef(trimmed, parts.ref, &url); 500 FixupRef(trimmed, parts.ref, &url);
501 501
502 return GURL(url); 502 return GURL(url);
503 } 503 }
504 504
505 // In the worst-case, we insert a scheme if the URL lacks one. 505 // In the worst-case, we insert a scheme if the URL lacks one.
506 if (!parts.scheme.is_valid()) { 506 if (!parts.scheme.is_valid()) {
507 std::string fixed_scheme(scheme); 507 std::string fixed_scheme(scheme);
508 fixed_scheme.append("://"); 508 fixed_scheme.append(chrome::kStandardSchemeSeparator);
509 trimmed.insert(0, fixed_scheme); 509 trimmed.insert(0, fixed_scheme);
510 } 510 }
511 511
512 return GURL(trimmed); 512 return GURL(trimmed);
513 } 513 }
514 514
515 GURL URLFixerUpper::FixupChromeURL(const GURL& url) {
516 DCHECK(url.SchemeIs(chrome::kAboutScheme) ||
517 url.SchemeIs(chrome::kChromeUIScheme));
518
519 // Segment the URL.
520 url_parse::Parsed parts;
521 SegmentURL(url.spec(), &parts);
522 std::string new_url(chrome::kChromeUIScheme);
523 new_url.append(chrome::kStandardSchemeSeparator);
524
525 // We need to check whether the |username| is valid because it is our
526 // responsibility to append the '@' to delineate the user information from
527 // the host portion of the URL.
528 if (parts.username.is_valid()) {
529 FixupUsername(url.spec(), parts.username, &new_url);
530 FixupPassword(url.spec(), parts.password, &new_url);
531 new_url.append("@");
532 }
533
534 if (parts.host.is_valid())
535 FixupHost(url.spec(), parts.host, true, std::string(), &new_url);
536 else
537 new_url.append(chrome::kChromeUIVersionHost);
538 FixupPort(url.spec(), parts.port, &new_url);
539 FixupPath(url.spec(), parts.path, &new_url);
540 FixupQuery(url.spec(), parts.query, &new_url);
541 FixupRef(url.spec(), parts.ref, &new_url);
542 return GURL(new_url);
543 }
544
515 // The rules are different here than for regular fixup, since we need to handle 545 // The rules are different here than for regular fixup, since we need to handle
516 // input like "hello.html" and know to look in the current directory. Regular 546 // input like "hello.html" and know to look in the current directory. Regular
517 // fixup will look for cues that it is actually a file path before trying to 547 // fixup will look for cues that it is actually a file path before trying to
518 // figure out what file it is. If our logic doesn't work, we will fall back on 548 // figure out what file it is. If our logic doesn't work, we will fall back on
519 // regular fixup. 549 // regular fixup.
520 GURL URLFixerUpper::FixupRelativeFile(const FilePath& base_dir, 550 GURL URLFixerUpper::FixupRelativeFile(const FilePath& base_dir,
521 const FilePath& text) { 551 const FilePath& text) {
522 FilePath old_cur_directory; 552 FilePath old_cur_directory;
523 if (!base_dir.empty()) { 553 if (!base_dir.empty()) {
524 // Save the old current directory before we move to the new one. 554 // Save the old current directory before we move to the new one.
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 616
587 if (part->is_valid()) { 617 if (part->is_valid()) {
588 // Offset the location of this component. 618 // Offset the location of this component.
589 part->begin += offset; 619 part->begin += offset;
590 620
591 // This part might not have existed in the original text. 621 // This part might not have existed in the original text.
592 if (part->begin < 0) 622 if (part->begin < 0)
593 part->reset(); 623 part->reset();
594 } 624 }
595 } 625 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698