| 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 /* | 5 /* |
| 6 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. | 6 * Copyright (C) 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
| 7 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 7 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
| 9 * (http://www.torchmobile.com/) | 9 * (http://www.torchmobile.com/) |
| 10 * | 10 * |
| (...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 697 frame_tree_node_id = node->frame_tree_node_id(); | 697 frame_tree_node_id = node->frame_tree_node_id(); |
| 698 | 698 |
| 699 // In --site-per-process, create an identical NavigationEntry with a | 699 // In --site-per-process, create an identical NavigationEntry with a |
| 700 // new FrameNavigationEntry for the target subframe. | 700 // new FrameNavigationEntry for the target subframe. |
| 701 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { | 701 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { |
| 702 entry = GetLastCommittedEntry()->Clone(); | 702 entry = GetLastCommittedEntry()->Clone(); |
| 703 entry->SetPageID(-1); | 703 entry->SetPageID(-1); |
| 704 entry->AddOrUpdateFrameEntry( | 704 entry->AddOrUpdateFrameEntry( |
| 705 node, -1, -1, nullptr, | 705 node, -1, -1, nullptr, |
| 706 static_cast<SiteInstanceImpl*>(params.source_site_instance.get()), | 706 static_cast<SiteInstanceImpl*>(params.source_site_instance.get()), |
| 707 params.url, params.referrer, PageState(), "GET", -1); | 707 params.url, params.referrer, params.redirect_chain, PageState(), |
| 708 "GET", -1); |
| 708 } | 709 } |
| 709 } | 710 } |
| 710 } | 711 } |
| 711 | 712 |
| 712 // Otherwise, create a pending entry for the main frame. | 713 // Otherwise, create a pending entry for the main frame. |
| 713 if (!entry) { | 714 if (!entry) { |
| 714 entry = NavigationEntryImpl::FromNavigationEntry(CreateNavigationEntry( | 715 entry = NavigationEntryImpl::FromNavigationEntry(CreateNavigationEntry( |
| 715 params.url, params.referrer, params.transition_type, | 716 params.url, params.referrer, params.transition_type, |
| 716 params.is_renderer_initiated, params.extra_headers, browser_context_)); | 717 params.is_renderer_initiated, params.extra_headers, browser_context_)); |
| 717 entry->set_source_site_instance( | 718 entry->set_source_site_instance( |
| 718 static_cast<SiteInstanceImpl*>(params.source_site_instance.get())); | 719 static_cast<SiteInstanceImpl*>(params.source_site_instance.get())); |
| 720 entry->SetRedirectChain(params.redirect_chain); |
| 719 } | 721 } |
| 720 | 722 |
| 721 // Set the FTN ID (only used in non-site-per-process, for tests). | 723 // Set the FTN ID (only used in non-site-per-process, for tests). |
| 722 entry->set_frame_tree_node_id(frame_tree_node_id); | 724 entry->set_frame_tree_node_id(frame_tree_node_id); |
| 723 if (params.redirect_chain.size() > 0) | |
| 724 entry->SetRedirectChain(params.redirect_chain); | |
| 725 // Don't allow an entry replacement if there is no entry to replace. | 725 // Don't allow an entry replacement if there is no entry to replace. |
| 726 // http://crbug.com/457149 | 726 // http://crbug.com/457149 |
| 727 if (params.should_replace_current_entry && entries_.size() > 0) | 727 if (params.should_replace_current_entry && entries_.size() > 0) |
| 728 entry->set_should_replace_entry(true); | 728 entry->set_should_replace_entry(true); |
| 729 entry->set_should_clear_history_list(params.should_clear_history_list); | 729 entry->set_should_clear_history_list(params.should_clear_history_list); |
| 730 entry->SetIsOverridingUserAgent(override); | 730 entry->SetIsOverridingUserAgent(override); |
| 731 entry->set_transferred_global_request_id( | 731 entry->set_transferred_global_request_id( |
| 732 params.transferred_global_request_id); | 732 params.transferred_global_request_id); |
| 733 | 733 |
| 734 #if defined(OS_ANDROID) | 734 #if defined(OS_ANDROID) |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 863 base::debug::DumpWithoutCrashing(); | 863 base::debug::DumpWithoutCrashing(); |
| 864 NOTREACHED() << "Shouldn't see an empty PageState at commit."; | 864 NOTREACHED() << "Shouldn't see an empty PageState at commit."; |
| 865 } | 865 } |
| 866 NavigationEntryImpl* active_entry = GetLastCommittedEntry(); | 866 NavigationEntryImpl* active_entry = GetLastCommittedEntry(); |
| 867 active_entry->SetTimestamp(timestamp); | 867 active_entry->SetTimestamp(timestamp); |
| 868 active_entry->SetHttpStatusCode(params.http_status_code); | 868 active_entry->SetHttpStatusCode(params.http_status_code); |
| 869 | 869 |
| 870 FrameNavigationEntry* frame_entry = | 870 FrameNavigationEntry* frame_entry = |
| 871 active_entry->GetFrameEntry(rfh->frame_tree_node()); | 871 active_entry->GetFrameEntry(rfh->frame_tree_node()); |
| 872 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { | 872 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { |
| 873 // Update the frame-specific PageState. | 873 // Update the frame-specific PageState and RedirectChain |
| 874 // We may not find a frame_entry in some cases; ignore the PageState if so. | 874 // We may not find a frame_entry in some cases; ignore the PageState if so. |
| 875 // TODO(creis): Remove the "if" once https://crbug.com/522193 is fixed. | 875 // TODO(creis): Remove the "if" once https://crbug.com/522193 is fixed. |
| 876 if (frame_entry) | 876 if (frame_entry) { |
| 877 frame_entry->SetPageState(params.page_state); | 877 frame_entry->SetPageState(params.page_state); |
| 878 frame_entry->set_redirect_chain(params.redirects); |
| 879 } |
| 878 } else { | 880 } else { |
| 879 active_entry->SetPageState(params.page_state); | 881 active_entry->SetPageState(params.page_state); |
| 882 active_entry->SetRedirectChain(params.redirects); |
| 880 } | 883 } |
| 881 active_entry->SetRedirectChain(params.redirects); | |
| 882 | 884 |
| 883 // Use histogram to track memory impact of redirect chain because it's now | 885 // Use histogram to track memory impact of redirect chain because it's now |
| 884 // not cleared for committed entries. | 886 // not cleared for committed entries. |
| 885 size_t redirect_chain_size = 0; | 887 size_t redirect_chain_size = 0; |
| 886 for (size_t i = 0; i < params.redirects.size(); ++i) { | 888 for (size_t i = 0; i < params.redirects.size(); ++i) { |
| 887 redirect_chain_size += params.redirects[i].spec().length(); | 889 redirect_chain_size += params.redirects[i].spec().length(); |
| 888 } | 890 } |
| 889 UMA_HISTOGRAM_COUNTS("Navigation.RedirectChainSize", redirect_chain_size); | 891 UMA_HISTOGRAM_COUNTS("Navigation.RedirectChainSize", redirect_chain_size); |
| 890 | 892 |
| 891 // Once it is committed, we no longer need to track several pieces of state on | 893 // Once it is committed, we no longer need to track several pieces of state on |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1203 // The site instance will normally be the same except during session restore, | 1205 // The site instance will normally be the same except during session restore, |
| 1204 // when no site instance will be assigned. | 1206 // when no site instance will be assigned. |
| 1205 DCHECK(entry->site_instance() == nullptr || | 1207 DCHECK(entry->site_instance() == nullptr || |
| 1206 entry->site_instance() == rfh->GetSiteInstance()); | 1208 entry->site_instance() == rfh->GetSiteInstance()); |
| 1207 | 1209 |
| 1208 // Update the existing FrameNavigationEntry to ensure all of its members | 1210 // Update the existing FrameNavigationEntry to ensure all of its members |
| 1209 // reflect the parameters coming from the renderer process. | 1211 // reflect the parameters coming from the renderer process. |
| 1210 entry->AddOrUpdateFrameEntry( | 1212 entry->AddOrUpdateFrameEntry( |
| 1211 rfh->frame_tree_node(), params.item_sequence_number, | 1213 rfh->frame_tree_node(), params.item_sequence_number, |
| 1212 params.document_sequence_number, rfh->GetSiteInstance(), nullptr, | 1214 params.document_sequence_number, rfh->GetSiteInstance(), nullptr, |
| 1213 params.url, params.referrer, params.page_state, params.method, | 1215 params.url, params.referrer, params.redirects, params.page_state, |
| 1214 params.post_id); | 1216 params.method, params.post_id); |
| 1215 | 1217 |
| 1216 // The redirected to page should not inherit the favicon from the previous | 1218 // The redirected to page should not inherit the favicon from the previous |
| 1217 // page. | 1219 // page. |
| 1218 if (ui::PageTransitionIsRedirect(params.transition) && !is_in_page) | 1220 if (ui::PageTransitionIsRedirect(params.transition) && !is_in_page) |
| 1219 entry->GetFavicon() = FaviconStatus(); | 1221 entry->GetFavicon() = FaviconStatus(); |
| 1220 | 1222 |
| 1221 // The entry we found in the list might be pending if the user hit | 1223 // The entry we found in the list might be pending if the user hit |
| 1222 // back/forward/reload. This load should commit it (since it's already in the | 1224 // back/forward/reload. This load should commit it (since it's already in the |
| 1223 // list, we can just discard the pending pointer). We should also discard the | 1225 // list, we can just discard the pending pointer). We should also discard the |
| 1224 // pending entry if it corresponds to a different navigation, since that one | 1226 // pending entry if it corresponds to a different navigation, since that one |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1261 // If a user presses enter in the omnibox and the server redirects, the URL | 1263 // If a user presses enter in the omnibox and the server redirects, the URL |
| 1262 // might change (but it's still considered a SAME_PAGE navigation). So we must | 1264 // might change (but it's still considered a SAME_PAGE navigation). So we must |
| 1263 // update the SSL status. | 1265 // update the SSL status. |
| 1264 existing_entry->GetSSL() = rfh->navigation_handle()->ssl_status(); | 1266 existing_entry->GetSSL() = rfh->navigation_handle()->ssl_status(); |
| 1265 | 1267 |
| 1266 // Update the existing FrameNavigationEntry to ensure all of its members | 1268 // Update the existing FrameNavigationEntry to ensure all of its members |
| 1267 // reflect the parameters coming from the renderer process. | 1269 // reflect the parameters coming from the renderer process. |
| 1268 existing_entry->AddOrUpdateFrameEntry( | 1270 existing_entry->AddOrUpdateFrameEntry( |
| 1269 rfh->frame_tree_node(), params.item_sequence_number, | 1271 rfh->frame_tree_node(), params.item_sequence_number, |
| 1270 params.document_sequence_number, rfh->GetSiteInstance(), nullptr, | 1272 params.document_sequence_number, rfh->GetSiteInstance(), nullptr, |
| 1271 params.url, params.referrer, params.page_state, params.method, | 1273 params.url, params.referrer, params.redirects, params.page_state, |
| 1272 params.post_id); | 1274 params.method, params.post_id); |
| 1273 | 1275 |
| 1274 DiscardNonCommittedEntries(); | 1276 DiscardNonCommittedEntries(); |
| 1275 } | 1277 } |
| 1276 | 1278 |
| 1277 void NavigationControllerImpl::RendererDidNavigateNewSubframe( | 1279 void NavigationControllerImpl::RendererDidNavigateNewSubframe( |
| 1278 RenderFrameHostImpl* rfh, | 1280 RenderFrameHostImpl* rfh, |
| 1279 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, | 1281 const FrameHostMsg_DidCommitProvisionalLoad_Params& params, |
| 1280 bool is_in_page, | 1282 bool is_in_page, |
| 1281 bool replace_entry) { | 1283 bool replace_entry) { |
| 1282 DCHECK(ui::PageTransitionCoreTypeIs(params.transition, | 1284 DCHECK(ui::PageTransitionCoreTypeIs(params.transition, |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1360 } | 1362 } |
| 1361 } | 1363 } |
| 1362 | 1364 |
| 1363 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { | 1365 if (SiteIsolationPolicy::UseSubframeNavigationEntries()) { |
| 1364 // This may be a "new auto" case where we add a new FrameNavigationEntry, or | 1366 // This may be a "new auto" case where we add a new FrameNavigationEntry, or |
| 1365 // it may be a "history auto" case where we update an existing one. | 1367 // it may be a "history auto" case where we update an existing one. |
| 1366 NavigationEntryImpl* last_committed = GetLastCommittedEntry(); | 1368 NavigationEntryImpl* last_committed = GetLastCommittedEntry(); |
| 1367 last_committed->AddOrUpdateFrameEntry( | 1369 last_committed->AddOrUpdateFrameEntry( |
| 1368 rfh->frame_tree_node(), params.item_sequence_number, | 1370 rfh->frame_tree_node(), params.item_sequence_number, |
| 1369 params.document_sequence_number, rfh->GetSiteInstance(), nullptr, | 1371 params.document_sequence_number, rfh->GetSiteInstance(), nullptr, |
| 1370 params.url, params.referrer, params.page_state, params.method, | 1372 params.url, params.referrer, params.redirects, params.page_state, |
| 1371 params.post_id); | 1373 params.method, params.post_id); |
| 1372 } | 1374 } |
| 1373 | 1375 |
| 1374 return send_commit_notification; | 1376 return send_commit_notification; |
| 1375 } | 1377 } |
| 1376 | 1378 |
| 1377 int NavigationControllerImpl::GetIndexOfEntry( | 1379 int NavigationControllerImpl::GetIndexOfEntry( |
| 1378 const NavigationEntryImpl* entry) const { | 1380 const NavigationEntryImpl* entry) const { |
| 1379 for (size_t i = 0; i < entries_.size(); ++i) { | 1381 for (size_t i = 0; i < entries_.size(); ++i) { |
| 1380 if (entries_[i].get() == entry) | 1382 if (entries_[i].get() == entry) |
| 1381 return i; | 1383 return i; |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2104 } | 2106 } |
| 2105 } | 2107 } |
| 2106 } | 2108 } |
| 2107 | 2109 |
| 2108 void NavigationControllerImpl::SetGetTimestampCallbackForTest( | 2110 void NavigationControllerImpl::SetGetTimestampCallbackForTest( |
| 2109 const base::Callback<base::Time()>& get_timestamp_callback) { | 2111 const base::Callback<base::Time()>& get_timestamp_callback) { |
| 2110 get_timestamp_callback_ = get_timestamp_callback; | 2112 get_timestamp_callback_ = get_timestamp_callback; |
| 2111 } | 2113 } |
| 2112 | 2114 |
| 2113 } // namespace content | 2115 } // namespace content |
| OLD | NEW |