| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/frame_host/navigation_controller_impl.h" | 5 #include "content/browser/frame_host/navigation_controller_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 NavigationEntryImpl* new_entry; | 1043 NavigationEntryImpl* new_entry; |
| 1044 bool update_virtual_url; | 1044 bool update_virtual_url; |
| 1045 // Only make a copy of the pending entry if it is appropriate for the new page | 1045 // Only make a copy of the pending entry if it is appropriate for the new page |
| 1046 // that was just loaded. We verify this at a coarse grain by checking that | 1046 // that was just loaded. We verify this at a coarse grain by checking that |
| 1047 // the SiteInstance hasn't been assigned to something else. | 1047 // the SiteInstance hasn't been assigned to something else. |
| 1048 if (pending_entry_ && | 1048 if (pending_entry_ && |
| 1049 (!pending_entry_->site_instance() || | 1049 (!pending_entry_->site_instance() || |
| 1050 pending_entry_->site_instance() == rfh->GetSiteInstance())) { | 1050 pending_entry_->site_instance() == rfh->GetSiteInstance())) { |
| 1051 new_entry = new NavigationEntryImpl(*pending_entry_); | 1051 new_entry = new NavigationEntryImpl(*pending_entry_); |
| 1052 | 1052 |
| 1053 // Don't use the page type from the pending entry. Some interstitial page | |
| 1054 // may have set the type to interstitial. Once we commit, however, the page | |
| 1055 // type must always be normal. | |
| 1056 new_entry->set_page_type(PAGE_TYPE_NORMAL); | |
| 1057 update_virtual_url = new_entry->update_virtual_url_with_url(); | 1053 update_virtual_url = new_entry->update_virtual_url_with_url(); |
| 1058 } else { | 1054 } else { |
| 1059 new_entry = new NavigationEntryImpl; | 1055 new_entry = new NavigationEntryImpl; |
| 1060 | 1056 |
| 1061 // Find out whether the new entry needs to update its virtual URL on URL | 1057 // Find out whether the new entry needs to update its virtual URL on URL |
| 1062 // change and set up the entry accordingly. This is needed to correctly | 1058 // change and set up the entry accordingly. This is needed to correctly |
| 1063 // update the virtual URL when replaceState is called after a pushState. | 1059 // update the virtual URL when replaceState is called after a pushState. |
| 1064 GURL url = params.url; | 1060 GURL url = params.url; |
| 1065 bool needs_update = false; | 1061 bool needs_update = false; |
| 1066 BrowserURLHandlerImpl::GetInstance()->RewriteURLIfNecessary( | 1062 BrowserURLHandlerImpl::GetInstance()->RewriteURLIfNecessary( |
| 1067 &url, browser_context_, &needs_update); | 1063 &url, browser_context_, &needs_update); |
| 1068 new_entry->set_update_virtual_url_with_url(needs_update); | 1064 new_entry->set_update_virtual_url_with_url(needs_update); |
| 1069 | 1065 |
| 1070 // When navigating to a new page, give the browser URL handler a chance to | 1066 // When navigating to a new page, give the browser URL handler a chance to |
| 1071 // update the virtual URL based on the new URL. For example, this is needed | 1067 // update the virtual URL based on the new URL. For example, this is needed |
| 1072 // to show chrome://bookmarks/#1 when the bookmarks webui extension changes | 1068 // to show chrome://bookmarks/#1 when the bookmarks webui extension changes |
| 1073 // the URL. | 1069 // the URL. |
| 1074 update_virtual_url = needs_update; | 1070 update_virtual_url = needs_update; |
| 1075 } | 1071 } |
| 1076 | 1072 |
| 1077 if (params.url_is_unreachable) | 1073 // Don't use the page type from the pending entry. Some interstitial page |
| 1078 new_entry->set_page_type(PAGE_TYPE_ERROR); | 1074 // may have set the type to interstitial. Once we commit, however, the page |
| 1075 // type must always be normal or error. |
| 1076 new_entry->set_page_type(params.url_is_unreachable ? PAGE_TYPE_ERROR |
| 1077 : PAGE_TYPE_NORMAL); |
| 1079 new_entry->SetURL(params.url); | 1078 new_entry->SetURL(params.url); |
| 1080 if (update_virtual_url) | 1079 if (update_virtual_url) |
| 1081 UpdateVirtualURLToURL(new_entry, params.url); | 1080 UpdateVirtualURLToURL(new_entry, params.url); |
| 1082 new_entry->SetReferrer(params.referrer); | 1081 new_entry->SetReferrer(params.referrer); |
| 1083 new_entry->SetPageID(params.page_id); | 1082 new_entry->SetPageID(params.page_id); |
| 1084 new_entry->SetTransitionType(params.transition); | 1083 new_entry->SetTransitionType(params.transition); |
| 1085 new_entry->set_site_instance( | 1084 new_entry->set_site_instance( |
| 1086 static_cast<SiteInstanceImpl*>(rfh->GetSiteInstance())); | 1085 static_cast<SiteInstanceImpl*>(rfh->GetSiteInstance())); |
| 1087 new_entry->SetHasPostData(params.is_post); | 1086 new_entry->SetHasPostData(params.is_post); |
| 1088 new_entry->SetPostID(params.post_id); | 1087 new_entry->SetPostID(params.post_id); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1119 // This is a back/forward navigation. The existing page for the ID is | 1118 // This is a back/forward navigation. The existing page for the ID is |
| 1120 // guaranteed to exist by ClassifyNavigation, and we just need to update it | 1119 // guaranteed to exist by ClassifyNavigation, and we just need to update it |
| 1121 // with new information from the renderer. | 1120 // with new information from the renderer. |
| 1122 int entry_index = GetEntryIndexWithPageID(rfh->GetSiteInstance(), | 1121 int entry_index = GetEntryIndexWithPageID(rfh->GetSiteInstance(), |
| 1123 params.page_id); | 1122 params.page_id); |
| 1124 DCHECK(entry_index >= 0 && | 1123 DCHECK(entry_index >= 0 && |
| 1125 entry_index < static_cast<int>(entries_.size())); | 1124 entry_index < static_cast<int>(entries_.size())); |
| 1126 NavigationEntryImpl* entry = entries_[entry_index].get(); | 1125 NavigationEntryImpl* entry = entries_[entry_index].get(); |
| 1127 | 1126 |
| 1128 // The URL may have changed due to redirects. | 1127 // The URL may have changed due to redirects. |
| 1128 entry->set_page_type(params.url_is_unreachable ? PAGE_TYPE_ERROR |
| 1129 : PAGE_TYPE_NORMAL); |
| 1129 entry->SetURL(params.url); | 1130 entry->SetURL(params.url); |
| 1130 entry->SetReferrer(params.referrer); | 1131 entry->SetReferrer(params.referrer); |
| 1131 if (entry->update_virtual_url_with_url()) | 1132 if (entry->update_virtual_url_with_url()) |
| 1132 UpdateVirtualURLToURL(entry, params.url); | 1133 UpdateVirtualURLToURL(entry, params.url); |
| 1133 | 1134 |
| 1134 // The redirected to page should not inherit the favicon from the previous | 1135 // The redirected to page should not inherit the favicon from the previous |
| 1135 // page. | 1136 // page. |
| 1136 if (ui::PageTransitionIsRedirect(params.transition)) | 1137 if (ui::PageTransitionIsRedirect(params.transition)) |
| 1137 entry->GetFavicon() = FaviconStatus(); | 1138 entry->GetFavicon() = FaviconStatus(); |
| 1138 | 1139 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 // ClassifyNavigation. All we need to do is update the existing entry. | 1172 // ClassifyNavigation. All we need to do is update the existing entry. |
| 1172 NavigationEntryImpl* existing_entry = GetEntryWithPageID( | 1173 NavigationEntryImpl* existing_entry = GetEntryWithPageID( |
| 1173 rfh->GetSiteInstance(), params.page_id); | 1174 rfh->GetSiteInstance(), params.page_id); |
| 1174 | 1175 |
| 1175 // We assign the entry's unique ID to be that of the new one. Since this is | 1176 // We assign the entry's unique ID to be that of the new one. Since this is |
| 1176 // always the result of a user action, we want to dismiss infobars, etc. like | 1177 // always the result of a user action, we want to dismiss infobars, etc. like |
| 1177 // a regular user-initiated navigation. | 1178 // a regular user-initiated navigation. |
| 1178 existing_entry->set_unique_id(pending_entry_->GetUniqueID()); | 1179 existing_entry->set_unique_id(pending_entry_->GetUniqueID()); |
| 1179 | 1180 |
| 1180 // The URL may have changed due to redirects. | 1181 // The URL may have changed due to redirects. |
| 1182 existing_entry->set_page_type(params.url_is_unreachable ? PAGE_TYPE_ERROR |
| 1183 : PAGE_TYPE_NORMAL); |
| 1181 if (existing_entry->update_virtual_url_with_url()) | 1184 if (existing_entry->update_virtual_url_with_url()) |
| 1182 UpdateVirtualURLToURL(existing_entry, params.url); | 1185 UpdateVirtualURLToURL(existing_entry, params.url); |
| 1183 existing_entry->SetURL(params.url); | 1186 existing_entry->SetURL(params.url); |
| 1184 existing_entry->SetReferrer(params.referrer); | 1187 existing_entry->SetReferrer(params.referrer); |
| 1185 | 1188 |
| 1186 // The page may have been requested with a different HTTP method. | 1189 // The page may have been requested with a different HTTP method. |
| 1187 existing_entry->SetHasPostData(params.is_post); | 1190 existing_entry->SetHasPostData(params.is_post); |
| 1188 existing_entry->SetPostID(params.post_id); | 1191 existing_entry->SetPostID(params.post_id); |
| 1189 | 1192 |
| 1190 DiscardNonCommittedEntries(); | 1193 DiscardNonCommittedEntries(); |
| 1191 } | 1194 } |
| 1192 | 1195 |
| 1193 void NavigationControllerImpl::RendererDidNavigateInPage( | 1196 void NavigationControllerImpl::RendererDidNavigateInPage( |
| 1194 RenderFrameHost* rfh, | 1197 RenderFrameHost* rfh, |
| 1195 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, | 1198 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, |
| 1196 bool* did_replace_entry) { | 1199 bool* did_replace_entry) { |
| 1197 DCHECK(ui::PageTransitionIsMainFrame(params.transition)) << | 1200 DCHECK(ui::PageTransitionIsMainFrame(params.transition)) << |
| 1198 "WebKit should only tell us about in-page navs for the main frame."; | 1201 "WebKit should only tell us about in-page navs for the main frame."; |
| 1199 // We're guaranteed to have an entry for this one. | 1202 // We're guaranteed to have an entry for this one. |
| 1200 NavigationEntryImpl* existing_entry = GetEntryWithPageID( | 1203 NavigationEntryImpl* existing_entry = GetEntryWithPageID( |
| 1201 rfh->GetSiteInstance(), params.page_id); | 1204 rfh->GetSiteInstance(), params.page_id); |
| 1202 | 1205 |
| 1203 // Reference fragment navigation. We're guaranteed to have the last_committed | 1206 // Reference fragment navigation. We're guaranteed to have the last_committed |
| 1204 // entry and it will be the same page as the new navigation (minus the | 1207 // entry and it will be the same page as the new navigation (minus the |
| 1205 // reference fragments, of course). We'll update the URL of the existing | 1208 // reference fragments, of course). We'll update the URL of the existing |
| 1206 // entry without pruning the forward history. | 1209 // entry without pruning the forward history. |
| 1210 existing_entry->set_page_type(params.url_is_unreachable ? PAGE_TYPE_ERROR |
| 1211 : PAGE_TYPE_NORMAL); |
| 1207 existing_entry->SetURL(params.url); | 1212 existing_entry->SetURL(params.url); |
| 1208 if (existing_entry->update_virtual_url_with_url()) | 1213 if (existing_entry->update_virtual_url_with_url()) |
| 1209 UpdateVirtualURLToURL(existing_entry, params.url); | 1214 UpdateVirtualURLToURL(existing_entry, params.url); |
| 1210 | 1215 |
| 1211 existing_entry->SetHasPostData(params.is_post); | 1216 existing_entry->SetHasPostData(params.is_post); |
| 1212 existing_entry->SetPostID(params.post_id); | 1217 existing_entry->SetPostID(params.post_id); |
| 1213 | 1218 |
| 1214 // This replaces the existing entry since the page ID didn't change. | 1219 // This replaces the existing entry since the page ID didn't change. |
| 1215 *did_replace_entry = true; | 1220 *did_replace_entry = true; |
| 1216 | 1221 |
| (...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1790 } | 1795 } |
| 1791 } | 1796 } |
| 1792 } | 1797 } |
| 1793 | 1798 |
| 1794 void NavigationControllerImpl::SetGetTimestampCallbackForTest( | 1799 void NavigationControllerImpl::SetGetTimestampCallbackForTest( |
| 1795 const base::Callback<base::Time()>& get_timestamp_callback) { | 1800 const base::Callback<base::Time()>& get_timestamp_callback) { |
| 1796 get_timestamp_callback_ = get_timestamp_callback; | 1801 get_timestamp_callback_ = get_timestamp_callback; |
| 1797 } | 1802 } |
| 1798 | 1803 |
| 1799 } // namespace content | 1804 } // namespace content |
| OLD | NEW |