OLD | NEW |
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 "content/browser/tab_contents/navigation_controller.h" | 5 #include "content/browser/tab_contents/navigation_controller.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_util.h" | 9 #include "base/string_util.h" |
10 #include "base/time.h" | 10 #include "base/time.h" |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 // If an interstitial page is showing, going back is equivalent to hiding the | 335 // If an interstitial page is showing, going back is equivalent to hiding the |
336 // interstitial. | 336 // interstitial. |
337 if (tab_contents_->interstitial_page()) { | 337 if (tab_contents_->interstitial_page()) { |
338 tab_contents_->interstitial_page()->DontProceed(); | 338 tab_contents_->interstitial_page()->DontProceed(); |
339 return; | 339 return; |
340 } | 340 } |
341 | 341 |
342 // Base the navigation on where we are now... | 342 // Base the navigation on where we are now... |
343 int current_index = GetCurrentEntryIndex(); | 343 int current_index = GetCurrentEntryIndex(); |
344 | 344 |
| 345 LOG(ERROR) << "GoBack"; |
| 346 for (int i = 0; i < current_index; ++i) { |
| 347 LOG(ERROR) << entries_[i]->url().spec(); |
| 348 } |
| 349 |
345 DiscardNonCommittedEntries(); | 350 DiscardNonCommittedEntries(); |
346 | 351 |
347 pending_entry_index_ = current_index - 1; | 352 pending_entry_index_ = current_index - 1; |
348 entries_[pending_entry_index_]->set_transition_type( | 353 entries_[pending_entry_index_]->set_transition_type( |
349 entries_[pending_entry_index_]->transition_type() | | 354 entries_[pending_entry_index_]->transition_type() | |
350 PageTransition::FORWARD_BACK); | 355 PageTransition::FORWARD_BACK); |
351 NavigateToPendingEntry(NO_RELOAD); | 356 NavigateToPendingEntry(NO_RELOAD); |
352 } | 357 } |
353 | 358 |
354 void NavigationController::GoForward() { | 359 void NavigationController::GoForward() { |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 } | 614 } |
610 | 615 |
611 // Now we know that the notification is for an existing page. Find that entry. | 616 // Now we know that the notification is for an existing page. Find that entry. |
612 int existing_entry_index = GetEntryIndexWithPageID( | 617 int existing_entry_index = GetEntryIndexWithPageID( |
613 tab_contents_->GetSiteInstance(), | 618 tab_contents_->GetSiteInstance(), |
614 params.page_id); | 619 params.page_id); |
615 if (existing_entry_index == -1) { | 620 if (existing_entry_index == -1) { |
616 // The page was not found. It could have been pruned because of the limit on | 621 // The page was not found. It could have been pruned because of the limit on |
617 // back/forward entries (not likely since we'll usually tell it to navigate | 622 // back/forward entries (not likely since we'll usually tell it to navigate |
618 // to such entries). It could also mean that the renderer is smoking crack. | 623 // to such entries). It could also mean that the renderer is smoking crack. |
619 NOTREACHED(); | 624 //NOTREACHED(); |
620 | 625 |
621 // Because the unknown entry has committed, we risk showing the wrong URL in | 626 // Because the unknown entry has committed, we risk showing the wrong URL in |
622 // release builds. Instead, we'll kill the renderer process to be safe. | 627 // release builds. Instead, we'll kill the renderer process to be safe. |
623 LOG(ERROR) << "terminating renderer for bad navigation: " << params.url; | 628 LOG(ERROR) << "terminating renderer for bad navigation: " << params.url; |
624 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_NC")); | 629 UserMetrics::RecordAction(UserMetricsAction("BadMessageTerminate_NC")); |
625 if (tab_contents_->GetSiteInstance()->HasProcess()) | 630 if (tab_contents_->GetSiteInstance()->HasProcess()) |
626 tab_contents_->GetSiteInstance()->GetProcess()->ReceivedBadMessage(); | 631 tab_contents_->GetSiteInstance()->GetProcess()->ReceivedBadMessage(); |
627 return NavigationType::NAV_IGNORE; | 632 return NavigationType::NAV_IGNORE; |
628 } | 633 } |
629 NavigationEntry* existing_entry = entries_[existing_entry_index].get(); | 634 NavigationEntry* existing_entry = entries_[existing_entry_index].get(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 // For main frame transition, we judge by params.transition. | 674 // For main frame transition, we judge by params.transition. |
670 // Otherwise, by params.redirects. | 675 // Otherwise, by params.redirects. |
671 if (PageTransition::IsMainFrame(params.transition)) { | 676 if (PageTransition::IsMainFrame(params.transition)) { |
672 return PageTransition::IsRedirect(params.transition); | 677 return PageTransition::IsRedirect(params.transition); |
673 } | 678 } |
674 return params.redirects.size() > 1; | 679 return params.redirects.size() > 1; |
675 } | 680 } |
676 | 681 |
677 void NavigationController::RendererDidNavigateToNewPage( | 682 void NavigationController::RendererDidNavigateToNewPage( |
678 const ViewHostMsg_FrameNavigate_Params& params, bool* did_replace_entry) { | 683 const ViewHostMsg_FrameNavigate_Params& params, bool* did_replace_entry) { |
| 684 LOG(ERROR) << "RendererDidNavigateToNewPage." |
| 685 << " url=" << params.url; |
679 NavigationEntry* new_entry; | 686 NavigationEntry* new_entry; |
680 bool update_virtual_url; | 687 bool update_virtual_url; |
681 if (pending_entry_) { | 688 if (pending_entry_) { |
| 689 LOG(ERROR) << "Pending Entry exists"; |
682 // TODO(brettw) this assumes that the pending entry is appropriate for the | 690 // TODO(brettw) this assumes that the pending entry is appropriate for the |
683 // new page that was just loaded. I don't think this is necessarily the | 691 // new page that was just loaded. I don't think this is necessarily the |
684 // case! We should have some more tracking to know for sure. | 692 // case! We should have some more tracking to know for sure. |
685 new_entry = new NavigationEntry(*pending_entry_); | 693 new_entry = new NavigationEntry(*pending_entry_); |
686 | 694 |
687 // Don't use the page type from the pending entry. Some interstitial page | 695 // Don't use the page type from the pending entry. Some interstitial page |
688 // may have set the type to interstitial. Once we commit, however, the page | 696 // may have set the type to interstitial. Once we commit, however, the page |
689 // type must always be normal. | 697 // type must always be normal. |
690 new_entry->set_page_type(NORMAL_PAGE); | 698 new_entry->set_page_type(NORMAL_PAGE); |
691 update_virtual_url = new_entry->update_virtual_url_with_url(); | 699 update_virtual_url = new_entry->update_virtual_url_with_url(); |
(...skipping 13 matching lines...) Expand all Loading... |
705 new_entry->set_page_id(params.page_id); | 713 new_entry->set_page_id(params.page_id); |
706 new_entry->set_transition_type(params.transition); | 714 new_entry->set_transition_type(params.transition); |
707 new_entry->set_site_instance(tab_contents_->GetSiteInstance()); | 715 new_entry->set_site_instance(tab_contents_->GetSiteInstance()); |
708 new_entry->set_has_post_data(params.is_post); | 716 new_entry->set_has_post_data(params.is_post); |
709 | 717 |
710 InsertOrReplaceEntry(new_entry, *did_replace_entry); | 718 InsertOrReplaceEntry(new_entry, *did_replace_entry); |
711 } | 719 } |
712 | 720 |
713 void NavigationController::RendererDidNavigateToExistingPage( | 721 void NavigationController::RendererDidNavigateToExistingPage( |
714 const ViewHostMsg_FrameNavigate_Params& params) { | 722 const ViewHostMsg_FrameNavigate_Params& params) { |
| 723 LOG(ERROR) << "RendererDidNavigateToExistingPage." |
| 724 << " url=" << params.url; |
715 // We should only get here for main frame navigations. | 725 // We should only get here for main frame navigations. |
716 DCHECK(PageTransition::IsMainFrame(params.transition)); | 726 DCHECK(PageTransition::IsMainFrame(params.transition)); |
717 | 727 |
718 // This is a back/forward navigation. The existing page for the ID is | 728 // This is a back/forward navigation. The existing page for the ID is |
719 // guaranteed to exist by ClassifyNavigation, and we just need to update it | 729 // guaranteed to exist by ClassifyNavigation, and we just need to update it |
720 // with new information from the renderer. | 730 // with new information from the renderer. |
721 int entry_index = GetEntryIndexWithPageID(tab_contents_->GetSiteInstance(), | 731 int entry_index = GetEntryIndexWithPageID(tab_contents_->GetSiteInstance(), |
722 params.page_id); | 732 params.page_id); |
723 DCHECK(entry_index >= 0 && | 733 DCHECK(entry_index >= 0 && |
724 entry_index < static_cast<int>(entries_.size())); | 734 entry_index < static_cast<int>(entries_.size())); |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
924 last_committed_entry_index_ = entry_count() - 1; | 934 last_committed_entry_index_ = entry_count() - 1; |
925 if (pending_entry_index_ != -1) | 935 if (pending_entry_index_ != -1) |
926 pending_entry_index_ = entry_count() - 1; | 936 pending_entry_index_ = entry_count() - 1; |
927 if (transient_entry_index_ != -1) { | 937 if (transient_entry_index_ != -1) { |
928 // There's a transient entry. In this case we want the last committed to | 938 // There's a transient entry. In this case we want the last committed to |
929 // point to the previous entry. | 939 // point to the previous entry. |
930 transient_entry_index_ = entry_count() - 1; | 940 transient_entry_index_ = entry_count() - 1; |
931 if (last_committed_entry_index_ != -1) | 941 if (last_committed_entry_index_ != -1) |
932 last_committed_entry_index_--; | 942 last_committed_entry_index_--; |
933 } | 943 } |
| 944 |
| 945 LOG(ERROR) << "OffsetAndPrune." |
| 946 << " last_committed_entry_index_=" << last_committed_entry_index_; |
| 947 // Send a message to active render view asking to offset messages. |
| 948 tab_contents_->OffsetAndPruneHistory(entry_count() - 1); |
934 } | 949 } |
935 | 950 |
936 void NavigationController::PruneAllButActive() { | 951 void NavigationController::PruneAllButActive() { |
937 if (transient_entry_index_ != -1) { | 952 if (transient_entry_index_ != -1) { |
938 // There is a transient entry. Prune up to it. | 953 // There is a transient entry. Prune up to it. |
939 DCHECK_EQ(entry_count() - 1, transient_entry_index_); | 954 DCHECK_EQ(entry_count() - 1, transient_entry_index_); |
940 entries_.erase(entries_.begin(), entries_.begin() + transient_entry_index_); | 955 entries_.erase(entries_.begin(), entries_.begin() + transient_entry_index_); |
941 transient_entry_index_ = 0; | 956 transient_entry_index_ = 0; |
942 last_committed_entry_index_ = -1; | 957 last_committed_entry_index_ = -1; |
943 pending_entry_index_ = -1; | 958 pending_entry_index_ = -1; |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 size_t insert_index = 0; | 1183 size_t insert_index = 0; |
1169 for (int i = 0; i < max_index; i++) { | 1184 for (int i = 0; i < max_index; i++) { |
1170 // When cloning a tab, copy all entries except interstitial pages | 1185 // When cloning a tab, copy all entries except interstitial pages |
1171 if (source.entries_[i].get()->page_type() != INTERSTITIAL_PAGE) { | 1186 if (source.entries_[i].get()->page_type() != INTERSTITIAL_PAGE) { |
1172 entries_.insert(entries_.begin() + insert_index++, | 1187 entries_.insert(entries_.begin() + insert_index++, |
1173 linked_ptr<NavigationEntry>( | 1188 linked_ptr<NavigationEntry>( |
1174 new NavigationEntry(*source.entries_[i]))); | 1189 new NavigationEntry(*source.entries_[i]))); |
1175 } | 1190 } |
1176 } | 1191 } |
1177 } | 1192 } |
OLD | NEW |