Index: chrome/browser/navigation_controller.cc |
=================================================================== |
--- chrome/browser/navigation_controller.cc (revision 2538) |
+++ chrome/browser/navigation_controller.cc (working copy) |
@@ -586,6 +586,16 @@ |
// main frame. |
if (PageTransition::IsMainFrame(params.transition)) |
return NAV_NEW_PAGE; |
+ |
+ // When this is a new subframe navigation, we should have a committed page |
+ // for which it's a suframe in. This may not be the case when an iframe is |
+ // navigated on a popup navigated to about:blank (the iframe would be |
+ // written into the popup by script on the main page). For these cases, |
+ // there isn't any navigation stuff we can do, so just ignore it. |
+ if (!GetLastCommittedEntry()) |
+ return NAV_IGNORE; |
+ |
+ // Valid subframe navigation. |
return NAV_NEW_SUBFRAME; |
} |
@@ -621,11 +631,16 @@ |
if (AreURLsInPageNavigation(existing_entry->url(), params.url)) |
return NAV_IN_PAGE; |
- if (!PageTransition::IsMainFrame(params.transition)) |
- return NAV_AUTO_SUBFRAME; // All manual subframes would get new IDs and |
- // were handled above. |
+ if (!PageTransition::IsMainFrame(params.transition)) { |
+ // All manual subframes would get new IDs and were handled above, so we |
+ // know this is auto. Since the current page was found in the navigation |
+ // entry list, we're guaranteed to have a last committed entry. |
+ DCHECK(GetLastCommittedEntry()); |
+ return NAV_AUTO_SUBFRAME; |
+ } |
+ |
// Since we weeded out "new" navigations above, we know this is an existing |
- // navigation. |
+ // (back/forward) navigation. |
return NAV_EXISTING_PAGE; |
} |
@@ -663,8 +678,8 @@ |
DCHECK(PageTransition::IsMainFrame(params.transition)); |
// This is a back/forward navigation. The existing page for the ID is |
- // guaranteed to exist, and we just need to update it with new information |
- // from the renderer. |
+ // guaranteed to exist by ClassifyNavigation, and we just need to update it |
+ // with new information from the renderer. |
int entry_index = GetEntryIndexWithPageID( |
active_contents_->type(), |
active_contents_->GetSiteInstance(), |
@@ -698,7 +713,8 @@ |
void NavigationController::RendererDidNavigateToSamePage( |
const ViewHostMsg_FrameNavigate_Params& params) { |
// This mode implies we have a pending entry that's the same as an existing |
- // entry for this page ID. All we need to do is update the existing entry. |
+ // entry for this page ID. This entry is guaranteed to exist by |
+ // ClassifyNavigation. All we need to do is update the existing entry. |
NavigationEntry* existing_entry = GetEntryWithPageID( |
active_contents_->type(), |
active_contents_->GetSiteInstance(), |
@@ -737,7 +753,8 @@ |
// can go back or forward to it. The actual subframe information will be |
// stored in the page state for each of those entries. This happens out of |
// band with the actual navigations. |
- DCHECK(GetLastCommittedEntry()); |
+ DCHECK(GetLastCommittedEntry()) << "ClassifyNavigation should guarantee " |
+ << "that a last committed entry exists."; |
NavigationEntry* new_entry = new NavigationEntry(*GetLastCommittedEntry()); |
new_entry->set_page_id(params.page_id); |
InsertEntry(new_entry); |