| 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(const LoadURLParams& params) { |
| 579 if (content::HandleDebugURL(params.url, params.transition_type)) |
| 591 return; | 580 return; |
| 592 | 581 |
| 593 bool override = ShouldKeepOverride(GetLastCommittedEntry()); | 582 // Checks 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 if (!params.url.SchemeIs(chrome::kHttpScheme) && |
| 588 !params.url.SchemeIs(chrome::kHttpsScheme)) { |
| 589 NOTREACHED() << "Http post load must use http(s) scheme."; |
| 590 return; |
| 591 } |
| 592 break; |
| 593 case LOAD_TYPE_DATA: |
| 594 if (!params.url.SchemeIs(chrome::kDataScheme)) { |
| 595 NOTREACHED() << "Data load must use data scheme."; |
| 596 return; |
| 597 } |
| 598 break; |
| 599 default: |
| 600 NOTREACHED(); |
| 601 break; |
| 602 }; |
| 597 | 603 |
| 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. | 604 // The user initiated a load, we don't need to reload anymore. |
| 616 needs_reload_ = false; | 605 needs_reload_ = false; |
| 617 | 606 |
| 607 bool override = false; |
| 608 switch (params.override_user_agent) { |
| 609 case UA_OVERRIDE_INHERIT: |
| 610 override = ShouldKeepOverride(GetLastCommittedEntry()); |
| 611 break; |
| 612 case UA_OVERRIDE_TRUE: |
| 613 override = true; |
| 614 break; |
| 615 case UA_OVERRIDE_FALSE: |
| 616 override = false; |
| 617 break; |
| 618 default: |
| 619 NOTREACHED(); |
| 620 break; |
| 621 } |
| 622 |
| 618 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( | 623 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( |
| 619 CreateNavigationEntry( | 624 CreateNavigationEntry( |
| 620 url, referrer, transition, is_renderer_initiated, extra_headers, | 625 params.url, |
| 626 params.referrer, |
| 627 params.transition_type, |
| 628 params.is_renderer_initiated, |
| 629 params.extra_headers, |
| 621 browser_context_)); | 630 browser_context_)); |
| 622 entry->SetIsOverridingUserAgent(is_overriding_user_agent); | 631 entry->SetIsOverridingUserAgent(override); |
| 632 entry->set_transferred_global_request_id( |
| 633 params.transferred_global_request_id); |
| 634 |
| 635 switch (params.load_type) { |
| 636 case LOAD_TYPE_DEFAULT: |
| 637 break; |
| 638 case LOAD_TYPE_BROWSER_INITIATED_HTTP_POST: |
| 639 entry->SetHasPostData(true); |
| 640 entry->SetBrowserInitiatedPostData( |
| 641 params.browser_initiated_post_data); |
| 642 break; |
| 643 case LOAD_TYPE_DATA: |
| 644 entry->SetBaseURLForDataURL(params.base_url_for_data_url); |
| 645 entry->SetVirtualURL(params.virtual_url_for_data_url); |
| 646 break; |
| 647 default: |
| 648 NOTREACHED(); |
| 649 break; |
| 650 }; |
| 623 | 651 |
| 624 LoadEntry(entry); | 652 LoadEntry(entry); |
| 625 } | 653 } |
| 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 | 654 |
| 685 void NavigationControllerImpl::DocumentLoadedInFrame() { | 655 void NavigationControllerImpl::DocumentLoadedInFrame() { |
| 686 last_document_loaded_ = base::TimeTicks::Now(); | 656 last_document_loaded_ = base::TimeTicks::Now(); |
| 687 } | 657 } |
| 688 | 658 |
| 689 bool NavigationControllerImpl::RendererDidNavigate( | 659 bool NavigationControllerImpl::RendererDidNavigate( |
| 690 const ViewHostMsg_FrameNavigate_Params& params, | 660 const ViewHostMsg_FrameNavigate_Params& params, |
| 691 content::LoadCommittedDetails* details) { | 661 content::LoadCommittedDetails* details) { |
| 692 | 662 |
| 693 // Save the previous state before we clobber it. | 663 // Save the previous state before we clobber it. |
| (...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1571 for (int i = 0; i < max_index; i++) { | 1541 for (int i = 0; i < max_index; i++) { |
| 1572 // When cloning a tab, copy all entries except interstitial pages | 1542 // When cloning a tab, copy all entries except interstitial pages |
| 1573 if (source.entries_[i].get()->GetPageType() != | 1543 if (source.entries_[i].get()->GetPageType() != |
| 1574 content::PAGE_TYPE_INTERSTITIAL) { | 1544 content::PAGE_TYPE_INTERSTITIAL) { |
| 1575 entries_.insert(entries_.begin() + insert_index++, | 1545 entries_.insert(entries_.begin() + insert_index++, |
| 1576 linked_ptr<NavigationEntryImpl>( | 1546 linked_ptr<NavigationEntryImpl>( |
| 1577 new NavigationEntryImpl(*source.entries_[i]))); | 1547 new NavigationEntryImpl(*source.entries_[i]))); |
| 1578 } | 1548 } |
| 1579 } | 1549 } |
| 1580 } | 1550 } |
| OLD | NEW |