Chromium Code Reviews| 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 "content/browser/web_contents/navigation_controller_impl.h" | 5 #include "content/browser/web_contents/navigation_controller_impl.h" |
| 6 | 6 |
| 7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/string_number_conversions.h" // Temporary | 9 #include "base/string_number_conversions.h" // Temporary |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 556 int index = 0; | 556 int index = 0; |
| 557 if (last_committed_entry_index_ != -1) | 557 if (last_committed_entry_index_ != -1) |
| 558 index = last_committed_entry_index_ + 1; | 558 index = last_committed_entry_index_ + 1; |
| 559 DiscardTransientEntry(); | 559 DiscardTransientEntry(); |
| 560 entries_.insert( | 560 entries_.insert( |
| 561 entries_.begin() + index, linked_ptr<NavigationEntryImpl>(entry)); | 561 entries_.begin() + index, linked_ptr<NavigationEntryImpl>(entry)); |
| 562 transient_entry_index_ = index; | 562 transient_entry_index_ = index; |
| 563 web_contents_->NotifyNavigationStateChanged(kInvalidateAll); | 563 web_contents_->NotifyNavigationStateChanged(kInvalidateAll); |
| 564 } | 564 } |
| 565 | 565 |
| 566 void NavigationControllerImpl::TransferURL( | |
| 567 const GURL& url, | |
| 568 const content::Referrer& referrer, | |
| 569 content::PageTransition transition, | |
| 570 const std::string& extra_headers, | |
| 571 const GlobalRequestID& transferred_global_request_id, | |
| 572 bool is_renderer_initiated) { | |
| 573 // The user initiated a load, we don't need to reload anymore. | |
| 574 needs_reload_ = false; | |
| 575 | |
| 576 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( | |
| 577 CreateNavigationEntry( | |
| 578 url, referrer, transition, is_renderer_initiated, extra_headers, | |
| 579 browser_context_)); | |
| 580 entry->set_transferred_global_request_id(transferred_global_request_id); | |
| 581 | |
| 582 LoadEntry(entry); | |
| 583 } | |
| 584 | |
| 585 void NavigationControllerImpl::LoadURL( | 566 void NavigationControllerImpl::LoadURL( |
| 586 const GURL& url, | 567 const GURL& url, |
| 587 const content::Referrer& referrer, | 568 const content::Referrer& referrer, |
| 588 content::PageTransition transition, | 569 content::PageTransition transition, |
| 589 const std::string& extra_headers) { | 570 const std::string& extra_headers) { |
| 590 if (content::HandleDebugURL(url, transition)) | 571 LoadURLParams params(url); |
| 572 params.referrer = referrer; | |
| 573 params.transition_type = transition; | |
| 574 params.extra_headers = extra_headers; | |
| 575 LoadURLWithParams(params); | |
| 576 } | |
| 577 | |
| 578 void NavigationControllerImpl::LoadURLWithParams(LoadURLParams& params) { | |
| 579 if (content::HandleDebugURL(params.url, params.transition_type)) | |
| 591 return; | 580 return; |
| 592 | 581 |
| 593 bool override = ShouldKeepOverride(GetLastCommittedEntry()); | 582 // DCHECKs based on params.load_type |
| 594 LoadURLWithUserAgentOverride(url, referrer, transition, false, extra_headers, | 583 switch (params.load_type) { |
| 595 override); | 584 case LOAD_TYPE_DEFAULT: |
| 596 } | 585 break; |
| 586 case LOAD_TYPE_BROWSER_INITIATED_HTTP_POST: | |
| 587 DCHECK(params.url.SchemeIs(chrome::kHttpScheme) || | |
|
mnaganov (inactive)
2012/08/03 09:20:04
We need to bail out for safety (as the original co
boliu
2012/08/03 15:55:43
Done.
| |
| 588 params.url.SchemeIs(chrome::kHttpsScheme)); | |
| 589 break; | |
| 590 case LOAD_TYPE_DATA: | |
| 591 DCHECK(params.url.SchemeIs(chrome::kDataScheme)); | |
|
mnaganov (inactive)
2012/08/03 09:20:04
Same here
boliu
2012/08/03 15:55:43
Done.
| |
| 592 break; | |
| 593 default: | |
| 594 NOTREACHED(); | |
| 595 break; | |
| 596 }; | |
| 597 | 597 |
| 598 void NavigationControllerImpl::LoadURLFromRenderer( | |
| 599 const GURL& url, | |
| 600 const content::Referrer& referrer, | |
| 601 content::PageTransition transition, | |
| 602 const std::string& extra_headers) { | |
| 603 bool override = ShouldKeepOverride(GetLastCommittedEntry()); | |
| 604 LoadURLWithUserAgentOverride(url, referrer, transition, true, extra_headers, | |
| 605 override); | |
| 606 } | |
| 607 | |
| 608 void NavigationControllerImpl::LoadURLWithUserAgentOverride( | |
| 609 const GURL& url, | |
| 610 const content::Referrer& referrer, | |
| 611 content::PageTransition transition, | |
| 612 bool is_renderer_initiated, | |
| 613 const std::string& extra_headers, | |
| 614 bool is_overriding_user_agent) { | |
| 615 // The user initiated a load, we don't need to reload anymore. | 598 // The user initiated a load, we don't need to reload anymore. |
| 616 needs_reload_ = false; | 599 needs_reload_ = false; |
| 617 | 600 |
| 601 bool override = params.is_overriding_user_agent; | |
| 602 if(params.should_inherit_user_agent_override) { | |
| 603 override = ShouldKeepOverride(GetLastCommittedEntry()); | |
| 604 } | |
| 605 | |
| 618 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( | 606 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( |
| 619 CreateNavigationEntry( | 607 CreateNavigationEntry( |
| 620 url, referrer, transition, is_renderer_initiated, extra_headers, | 608 params.url, |
| 609 params.referrer, | |
| 610 params.transition_type, | |
| 611 params.is_renderer_initiated, | |
| 612 params.extra_headers, | |
| 621 browser_context_)); | 613 browser_context_)); |
| 622 entry->SetIsOverridingUserAgent(is_overriding_user_agent); | 614 entry->SetIsOverridingUserAgent(override); |
| 615 entry->set_transferred_global_request_id( | |
| 616 params.transferred_global_request_id); | |
| 617 | |
| 618 switch (params.load_type) { | |
| 619 case LOAD_TYPE_DEFAULT: | |
| 620 break; | |
| 621 case LOAD_TYPE_BROWSER_INITIATED_HTTP_POST: | |
| 622 entry->SetHasPostData(true); | |
| 623 entry->SetBrowserInitiatedPostData( | |
| 624 params.browser_initiated_post_data); | |
| 625 break; | |
| 626 case LOAD_TYPE_DATA: | |
| 627 entry->SetBaseURLForDataURL(params.base_url_for_data_url); | |
| 628 entry->SetVirtualURL(params.virtual_url); | |
| 629 break; | |
| 630 default: | |
| 631 NOTREACHED(); | |
| 632 break; | |
| 633 }; | |
| 623 | 634 |
| 624 LoadEntry(entry); | 635 LoadEntry(entry); |
| 625 } | 636 } |
| 626 | |
| 627 void NavigationControllerImpl::LoadDataWithBaseURL( | |
| 628 const GURL& data_url, | |
| 629 const content::Referrer& referrer, | |
| 630 const GURL& base_url, | |
| 631 const GURL& history_url, | |
| 632 bool is_overriding_user_agent) { | |
| 633 // Make sure we don't allow non-'data:' URLs. | |
| 634 if (!data_url.SchemeIs(chrome::kDataScheme)) { | |
| 635 NOTREACHED(); | |
| 636 return; | |
| 637 } | |
| 638 | |
| 639 needs_reload_ = false; | |
| 640 | |
| 641 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( | |
| 642 CreateNavigationEntry( | |
| 643 data_url, | |
| 644 referrer, | |
| 645 content::PAGE_TRANSITION_TYPED, | |
| 646 false, | |
| 647 std::string(), | |
| 648 browser_context_)); | |
| 649 entry->SetIsOverridingUserAgent(is_overriding_user_agent); | |
| 650 entry->SetBaseURLForDataURL(base_url); | |
| 651 entry->SetVirtualURL(history_url); | |
| 652 | |
| 653 LoadEntry(entry); | |
| 654 } | |
| 655 | |
| 656 void NavigationControllerImpl::PostURL( | |
| 657 const GURL& url, | |
| 658 const content::Referrer& referrer, | |
| 659 const base::RefCountedMemory& http_body, | |
| 660 bool is_overriding_user_agent) { | |
| 661 // Must be http scheme for a post request. | |
| 662 if (!url.SchemeIs(chrome::kHttpScheme) && | |
| 663 !url.SchemeIs(chrome::kHttpsScheme)) { | |
| 664 NOTREACHED(); | |
| 665 return; | |
| 666 } | |
| 667 | |
| 668 needs_reload_ = false; | |
| 669 | |
| 670 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( | |
| 671 CreateNavigationEntry( | |
| 672 url, | |
| 673 referrer, | |
| 674 content::PAGE_TRANSITION_TYPED, | |
| 675 false, | |
| 676 std::string(), | |
| 677 browser_context_)); | |
| 678 entry->SetIsOverridingUserAgent(is_overriding_user_agent); | |
| 679 entry->SetHasPostData(true); | |
| 680 entry->SetBrowserInitiatedPostData(&http_body); | |
| 681 | |
| 682 LoadEntry(entry); | |
| 683 } | |
| 684 | 637 |
| 685 void NavigationControllerImpl::DocumentLoadedInFrame() { | 638 void NavigationControllerImpl::DocumentLoadedInFrame() { |
| 686 last_document_loaded_ = base::TimeTicks::Now(); | 639 last_document_loaded_ = base::TimeTicks::Now(); |
| 687 } | 640 } |
| 688 | 641 |
| 689 bool NavigationControllerImpl::RendererDidNavigate( | 642 bool NavigationControllerImpl::RendererDidNavigate( |
| 690 const ViewHostMsg_FrameNavigate_Params& params, | 643 const ViewHostMsg_FrameNavigate_Params& params, |
| 691 content::LoadCommittedDetails* details) { | 644 content::LoadCommittedDetails* details) { |
| 692 | 645 |
| 693 // Save the previous state before we clobber it. | 646 // Save the previous state before we clobber it. |
| (...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1516 for (int i = 0; i < max_index; i++) { | 1469 for (int i = 0; i < max_index; i++) { |
| 1517 // When cloning a tab, copy all entries except interstitial pages | 1470 // When cloning a tab, copy all entries except interstitial pages |
| 1518 if (source.entries_[i].get()->GetPageType() != | 1471 if (source.entries_[i].get()->GetPageType() != |
| 1519 content::PAGE_TYPE_INTERSTITIAL) { | 1472 content::PAGE_TYPE_INTERSTITIAL) { |
| 1520 entries_.insert(entries_.begin() + insert_index++, | 1473 entries_.insert(entries_.begin() + insert_index++, |
| 1521 linked_ptr<NavigationEntryImpl>( | 1474 linked_ptr<NavigationEntryImpl>( |
| 1522 new NavigationEntryImpl(*source.entries_[i]))); | 1475 new NavigationEntryImpl(*source.entries_[i]))); |
| 1523 } | 1476 } |
| 1524 } | 1477 } |
| 1525 } | 1478 } |
| OLD | NEW |