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/bind.h" | 7 #include "base/bind.h" |
8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/strings/string_number_conversions.h" // Temporary | 10 #include "base/strings/string_number_conversions.h" // Temporary |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
98 (*entries)[i]->SetTransitionType(PAGE_TRANSITION_RELOAD); | 98 (*entries)[i]->SetTransitionType(PAGE_TRANSITION_RELOAD); |
99 (*entries)[i]->set_restore_type(ControllerRestoreTypeToEntryType(type)); | 99 (*entries)[i]->set_restore_type(ControllerRestoreTypeToEntryType(type)); |
100 // NOTE(darin): This code is only needed for backwards compat. | 100 // NOTE(darin): This code is only needed for backwards compat. |
101 SetPageStateIfEmpty((*entries)[i].get()); | 101 SetPageStateIfEmpty((*entries)[i].get()); |
102 } | 102 } |
103 } | 103 } |
104 | 104 |
105 // See NavigationController::IsURLInPageNavigation for how this works and why. | 105 // See NavigationController::IsURLInPageNavigation for how this works and why. |
106 bool AreURLsInPageNavigation(const GURL& existing_url, | 106 bool AreURLsInPageNavigation(const GURL& existing_url, |
107 const GURL& new_url, | 107 const GURL& new_url, |
108 bool renderer_says_in_page) { | 108 bool renderer_says_in_page, |
109 NavigationType navigation_type) { | |
109 if (existing_url == new_url) | 110 if (existing_url == new_url) |
110 return renderer_says_in_page; | 111 return renderer_says_in_page; |
111 | 112 |
112 if (!new_url.has_ref()) { | 113 if (!new_url.has_ref()) { |
113 // TODO(jcampan): what about when navigating back from a ref URL to the top | 114 // When going back from the ref URL to the non ref one the navigation type |
114 // non ref URL? Nothing is loaded in that case but we return false here. | 115 // is IN_PAGE. |
115 // The user could also navigate from the ref URL to the non ref URL by | 116 return navigation_type == NAVIGATION_TYPE_IN_PAGE; |
116 // entering the non ref URL in the location bar or through a bookmark, in | |
117 // which case there would be a load. I am not sure if the non-load/load | |
118 // scenarios can be differentiated with the TransitionType. | |
Finnur
2013/08/30 11:52:00
Are we sure that nothing meaningful is lost by del
| |
119 return false; | |
120 } | 117 } |
121 | 118 |
122 url_canon::Replacements<char> replacements; | 119 url_canon::Replacements<char> replacements; |
123 replacements.ClearRef(); | 120 replacements.ClearRef(); |
124 return existing_url.ReplaceComponents(replacements) == | 121 return existing_url.ReplaceComponents(replacements) == |
125 new_url.ReplaceComponents(replacements); | 122 new_url.ReplaceComponents(replacements); |
126 } | 123 } |
127 | 124 |
128 // Determines whether or not we should be carrying over a user agent override | 125 // Determines whether or not we should be carrying over a user agent override |
129 // between two NavigationEntries. | 126 // between two NavigationEntries. |
(...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
733 DCHECK(pending_entry_index_ == -1 || pending_entry_->site_instance()); | 730 DCHECK(pending_entry_index_ == -1 || pending_entry_->site_instance()); |
734 | 731 |
735 // If we are doing a cross-site reload, we need to replace the existing | 732 // If we are doing a cross-site reload, we need to replace the existing |
736 // navigation entry, not add another entry to the history. This has the side | 733 // navigation entry, not add another entry to the history. This has the side |
737 // effect of removing forward browsing history, if such existed. | 734 // effect of removing forward browsing history, if such existed. |
738 // Or if we are doing a cross-site redirect navigation, | 735 // Or if we are doing a cross-site redirect navigation, |
739 // we will do a similar thing. | 736 // we will do a similar thing. |
740 details->did_replace_entry = | 737 details->did_replace_entry = |
741 pending_entry_ && pending_entry_->should_replace_entry(); | 738 pending_entry_ && pending_entry_->should_replace_entry(); |
742 | 739 |
743 // is_in_page must be computed before the entry gets committed. | |
744 details->is_in_page = IsURLInPageNavigation( | |
745 params.url, params.was_within_same_page); | |
746 | |
747 // Do navigation-type specific actions. These will make and commit an entry. | 740 // Do navigation-type specific actions. These will make and commit an entry. |
Finnur
2013/08/30 11:52:00
See how the comments on line 747 and 743 were mean
pstanek
2013/08/30 12:01:14
I don't think ClassifyNavigation() commits the ent
| |
748 details->type = ClassifyNavigation(params); | 741 details->type = ClassifyNavigation(params); |
749 | 742 |
743 // is_in_page must be computed before the entry gets committed. | |
744 details->is_in_page = IsURLInPageNavigation( | |
745 params.url, params.was_within_same_page, details->type); | |
746 | |
750 switch (details->type) { | 747 switch (details->type) { |
751 case NAVIGATION_TYPE_NEW_PAGE: | 748 case NAVIGATION_TYPE_NEW_PAGE: |
752 RendererDidNavigateToNewPage(params, details->did_replace_entry); | 749 RendererDidNavigateToNewPage(params, details->did_replace_entry); |
753 break; | 750 break; |
754 case NAVIGATION_TYPE_EXISTING_PAGE: | 751 case NAVIGATION_TYPE_EXISTING_PAGE: |
755 RendererDidNavigateToExistingPage(params); | 752 RendererDidNavigateToExistingPage(params); |
756 break; | 753 break; |
757 case NAVIGATION_TYPE_SAME_PAGE: | 754 case NAVIGATION_TYPE_SAME_PAGE: |
758 RendererDidNavigateToSamePage(params); | 755 RendererDidNavigateToSamePage(params); |
759 break; | 756 break; |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
949 // the pending entry and go back to where we were (the "existing entry"). | 946 // the pending entry and go back to where we were (the "existing entry"). |
950 return NAVIGATION_TYPE_SAME_PAGE; | 947 return NAVIGATION_TYPE_SAME_PAGE; |
951 } | 948 } |
952 | 949 |
953 // Any toplevel navigations with the same base (minus the reference fragment) | 950 // Any toplevel navigations with the same base (minus the reference fragment) |
954 // are in-page navigations. We weeded out subframe navigations above. Most of | 951 // are in-page navigations. We weeded out subframe navigations above. Most of |
955 // the time this doesn't matter since WebKit doesn't tell us about subframe | 952 // the time this doesn't matter since WebKit doesn't tell us about subframe |
956 // navigations that don't actually navigate, but it can happen when there is | 953 // navigations that don't actually navigate, but it can happen when there is |
957 // an encoding override (it always sends a navigation request). | 954 // an encoding override (it always sends a navigation request). |
958 if (AreURLsInPageNavigation(existing_entry->GetURL(), params.url, | 955 if (AreURLsInPageNavigation(existing_entry->GetURL(), params.url, |
959 params.was_within_same_page)) { | 956 params.was_within_same_page, |
957 NAVIGATION_TYPE_UNKNOWN)) { | |
960 return NAVIGATION_TYPE_IN_PAGE; | 958 return NAVIGATION_TYPE_IN_PAGE; |
961 } | 959 } |
962 | 960 |
963 // Since we weeded out "new" navigations above, we know this is an existing | 961 // Since we weeded out "new" navigations above, we know this is an existing |
964 // (back/forward) navigation. | 962 // (back/forward) navigation. |
965 return NAVIGATION_TYPE_EXISTING_PAGE; | 963 return NAVIGATION_TYPE_EXISTING_PAGE; |
966 } | 964 } |
967 | 965 |
968 bool NavigationControllerImpl::IsRedirect( | 966 bool NavigationControllerImpl::IsRedirect( |
969 const ViewHostMsg_FrameNavigate_Params& params) { | 967 const ViewHostMsg_FrameNavigate_Params& params) { |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1190 int NavigationControllerImpl::GetIndexOfEntry( | 1188 int NavigationControllerImpl::GetIndexOfEntry( |
1191 const NavigationEntryImpl* entry) const { | 1189 const NavigationEntryImpl* entry) const { |
1192 const NavigationEntries::const_iterator i(std::find( | 1190 const NavigationEntries::const_iterator i(std::find( |
1193 entries_.begin(), | 1191 entries_.begin(), |
1194 entries_.end(), | 1192 entries_.end(), |
1195 entry)); | 1193 entry)); |
1196 return (i == entries_.end()) ? -1 : static_cast<int>(i - entries_.begin()); | 1194 return (i == entries_.end()) ? -1 : static_cast<int>(i - entries_.begin()); |
1197 } | 1195 } |
1198 | 1196 |
1199 bool NavigationControllerImpl::IsURLInPageNavigation( | 1197 bool NavigationControllerImpl::IsURLInPageNavigation( |
1200 const GURL& url, bool renderer_says_in_page) const { | 1198 const GURL& url, |
1199 bool renderer_says_in_page, | |
1200 NavigationType navigation_type) const { | |
1201 NavigationEntry* last_committed = GetLastCommittedEntry(); | 1201 NavigationEntry* last_committed = GetLastCommittedEntry(); |
1202 return last_committed && AreURLsInPageNavigation( | 1202 return last_committed && AreURLsInPageNavigation( |
1203 last_committed->GetURL(), url, renderer_says_in_page); | 1203 last_committed->GetURL(), url, renderer_says_in_page, navigation_type); |
1204 } | 1204 } |
1205 | 1205 |
1206 void NavigationControllerImpl::CopyStateFrom( | 1206 void NavigationControllerImpl::CopyStateFrom( |
1207 const NavigationController& temp) { | 1207 const NavigationController& temp) { |
1208 const NavigationControllerImpl& source = | 1208 const NavigationControllerImpl& source = |
1209 static_cast<const NavigationControllerImpl&>(temp); | 1209 static_cast<const NavigationControllerImpl&>(temp); |
1210 // Verify that we look new. | 1210 // Verify that we look new. |
1211 DCHECK(GetEntryCount() == 0 && !GetPendingEntry()); | 1211 DCHECK(GetEntryCount() == 0 && !GetPendingEntry()); |
1212 | 1212 |
1213 if (source.GetEntryCount() == 0) | 1213 if (source.GetEntryCount() == 0) |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1684 } | 1684 } |
1685 } | 1685 } |
1686 } | 1686 } |
1687 | 1687 |
1688 void NavigationControllerImpl::SetGetTimestampCallbackForTest( | 1688 void NavigationControllerImpl::SetGetTimestampCallbackForTest( |
1689 const base::Callback<base::Time()>& get_timestamp_callback) { | 1689 const base::Callback<base::Time()>& get_timestamp_callback) { |
1690 get_timestamp_callback_ = get_timestamp_callback; | 1690 get_timestamp_callback_ = get_timestamp_callback; |
1691 } | 1691 } |
1692 | 1692 |
1693 } // namespace content | 1693 } // namespace content |
OLD | NEW |