Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: content/browser/frame_host/navigation_controller_impl.cc

Issue 1002953004: Ensure we properly set PageTransition for iframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address avi's comments Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 882 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 details->http_status_code = params.http_status_code; 893 details->http_status_code = params.http_status_code;
894 NotifyNavigationEntryCommitted(details); 894 NotifyNavigationEntryCommitted(details);
895 895
896 return true; 896 return true;
897 } 897 }
898 898
899 NavigationType NavigationControllerImpl::ClassifyNavigation( 899 NavigationType NavigationControllerImpl::ClassifyNavigation(
900 RenderFrameHostImpl* rfh, 900 RenderFrameHostImpl* rfh,
901 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) const { 901 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) const {
902 if (params.page_id == -1) { 902 if (params.page_id == -1) {
903 // TODO(nasko, creis): An out-of-process child frame has no way of 903 if (rfh->IsCrossProcessSubframe()) {
904 // knowing the page_id of its parent, so it is passing back -1. The 904 CHECK(!ui::PageTransitionIsMainFrame(params.transition));
Charlie Reis 2015/03/12 22:54:17 DCHECK. The renderer could be exploited or buggy
Nate Chapin 2015/03/13 21:48:35 Oops, I wasn't careful about this while testing an
905 // semantics here should be re-evaluated during session history refactor 905 if (ui::PageTransitionCoreTypeIs(params.transition,
906 // (see http://crbug.com/236848). For now, we assume this means the 906 ui::PAGE_TRANSITION_MANUAL_SUBFRAME)) {
907 // child frame loaded and proceed. Note that this may do the wrong thing 907 return NAVIGATION_TYPE_NEW_SUBFRAME;
908 // for cross-process AUTO_SUBFRAME navigations. 908 } else {
909 if (rfh->IsCrossProcessSubframe()) 909 return NAVIGATION_TYPE_AUTO_SUBFRAME;
910 return NAVIGATION_TYPE_NEW_SUBFRAME; 910 }
911 }
911 912
912 // The renderer generates the page IDs, and so if it gives us the invalid 913 // The renderer generates the page IDs, and so if it gives us the invalid
913 // page ID (-1) we know it didn't actually navigate. This happens in a few 914 // page ID (-1) we know it didn't actually navigate. This happens in a few
914 // cases: 915 // cases:
915 // 916 //
916 // - If a page makes a popup navigated to about blank, and then writes 917 // - If a page makes a popup navigated to about blank, and then writes
917 // stuff like a subframe navigated to a real page. We'll get the commit 918 // stuff like a subframe navigated to a real page. We'll get the commit
918 // for the subframe, but there won't be any commit for the outer page. 919 // for the subframe, but there won't be any commit for the outer page.
919 // 920 //
920 // - We were also getting these for failed loads (for example, bug 21849). 921 // - We were also getting these for failed loads (for example, bug 21849).
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 1226
1226 // If a transient entry was removed, the indices might have changed, so we 1227 // If a transient entry was removed, the indices might have changed, so we
1227 // have to query the entry index again. 1228 // have to query the entry index again.
1228 last_committed_entry_index_ = 1229 last_committed_entry_index_ =
1229 GetEntryIndexWithPageID(rfh->GetSiteInstance(), params.page_id); 1230 GetEntryIndexWithPageID(rfh->GetSiteInstance(), params.page_id);
1230 } 1231 }
1231 1232
1232 void NavigationControllerImpl::RendererDidNavigateNewSubframe( 1233 void NavigationControllerImpl::RendererDidNavigateNewSubframe(
1233 RenderFrameHostImpl* rfh, 1234 RenderFrameHostImpl* rfh,
1234 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { 1235 const FrameHostMsg_DidCommitProvisionalLoad_Params& params) {
1235 if (!ui::PageTransitionCoreTypeIs(params.transition, 1236 DCHECK(ui::PageTransitionCoreTypeIs(params.transition,
1236 ui::PAGE_TRANSITION_MANUAL_SUBFRAME)) { 1237 ui::PAGE_TRANSITION_MANUAL_SUBFRAME));
1237 // There was a comment here that said, "This is not user-initiated. Ignore."
1238 // But this makes no sense; non-user-initiated navigations should be
1239 // determined to be of type NAVIGATION_TYPE_AUTO_SUBFRAME and sent to
1240 // RendererDidNavigateAutoSubframe below.
1241 //
1242 // This if clause dates back to https://codereview.chromium.org/115919 and
1243 // the handling of immediate redirects. TODO(avi): Is this still valid? I'm
1244 // pretty sure that's there's nothing left of that code and that we should
1245 // take this out.
1246 //
1247 // Except for cross-process iframes; this doesn't work yet for them.
1248 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
1249 switches::kSitePerProcess)) {
1250 NOTREACHED();
1251 }
1252
1253 DiscardNonCommittedEntriesInternal();
1254 return;
1255 }
1256 1238
1257 // Manual subframe navigations just get the current entry cloned so the user 1239 // Manual subframe navigations just get the current entry cloned so the user
1258 // can go back or forward to it. The actual subframe information will be 1240 // can go back or forward to it. The actual subframe information will be
1259 // stored in the page state for each of those entries. This happens out of 1241 // stored in the page state for each of those entries. This happens out of
1260 // band with the actual navigations. 1242 // band with the actual navigations.
1261 DCHECK(GetLastCommittedEntry()) << "ClassifyNavigation should guarantee " 1243 DCHECK(GetLastCommittedEntry()) << "ClassifyNavigation should guarantee "
1262 << "that a last committed entry exists."; 1244 << "that a last committed entry exists.";
1263 NavigationEntryImpl* new_entry = GetLastCommittedEntry()->Clone(); 1245 NavigationEntryImpl* new_entry = GetLastCommittedEntry()->Clone();
1264 new_entry->SetPageID(params.page_id); 1246 new_entry->SetPageID(params.page_id);
1265 InsertOrReplaceEntry(new_entry, false); 1247 InsertOrReplaceEntry(new_entry, false);
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
1815 } 1797 }
1816 } 1798 }
1817 } 1799 }
1818 1800
1819 void NavigationControllerImpl::SetGetTimestampCallbackForTest( 1801 void NavigationControllerImpl::SetGetTimestampCallbackForTest(
1820 const base::Callback<base::Time()>& get_timestamp_callback) { 1802 const base::Callback<base::Time()>& get_timestamp_callback) {
1821 get_timestamp_callback_ = get_timestamp_callback; 1803 get_timestamp_callback_ = get_timestamp_callback;
1822 } 1804 }
1823 1805
1824 } // namespace content 1806 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/renderer/render_frame_impl.cc » ('j') | content/renderer/render_frame_impl.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698