| Index: content/browser/frame_host/navigation_controller_impl.cc
|
| diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
|
| index 9b3fd5e5e71d07b53a7e392405c6d1a49d36b913..7446d5153b845270ae510ff358d4c2fb960cf9e4 100644
|
| --- a/content/browser/frame_host/navigation_controller_impl.cc
|
| +++ b/content/browser/frame_host/navigation_controller_impl.cc
|
| @@ -736,7 +736,7 @@ void NavigationControllerImpl::LoadURLWithParams(const LoadURLParams& params) {
|
| if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
|
| entry = GetLastCommittedEntry()->Clone();
|
| entry->SetPageID(-1);
|
| - entry->AddOrUpdateFrameEntry(node, "", -1, -1, nullptr, params.url,
|
| + entry->AddOrUpdateFrameEntry(node, -1, -1, nullptr, params.url,
|
| params.referrer, PageState(), "GET", -1);
|
| }
|
| }
|
| @@ -977,7 +977,7 @@ NavigationType NavigationControllerImpl::ClassifyNavigation(
|
| // NavigationEntry.
|
| // TODO(creis): Have the renderer classify location.replace as
|
| // did_create_new_entry for all cases and eliminate this special case. This
|
| - // requires updating several test expectations. See https://crbug.com/317872.
|
| + // requires updating several test expectations. See https://crbug.com/596707.
|
| if (!rfh->GetParent() && GetLastCommittedEntry() &&
|
| GetLastCommittedEntry()->site_instance() != rfh->GetSiteInstance() &&
|
| params.should_replace_current_entry) {
|
| @@ -1190,6 +1190,13 @@ void NavigationControllerImpl::RendererDidNavigateToExistingPage(
|
| frame_entry->set_method(params.method);
|
| frame_entry->set_post_id(params.post_id);
|
|
|
| + // Update the ISN and DSN in case this was a location.replace, which can cause
|
| + // them to change.
|
| + // TODO(creis): Classify location.replace as NEW_PAGE instead of EXISTING_PAGE
|
| + // in https://crbug.com/596707.
|
| + frame_entry->set_item_sequence_number(params.item_sequence_number);
|
| + frame_entry->set_document_sequence_number(params.document_sequence_number);
|
| +
|
| // The redirected to page should not inherit the favicon from the previous
|
| // page.
|
| if (ui::PageTransitionIsRedirect(params.transition))
|
| @@ -1268,19 +1275,18 @@ void NavigationControllerImpl::RendererDidNavigateNewSubframe(
|
|
|
| std::unique_ptr<NavigationEntryImpl> new_entry;
|
| if (SiteIsolationPolicy::UseSubframeNavigationEntries()) {
|
| - // Make sure new_entry takes ownership of frame_entry in a scoped_refptr.
|
| - FrameNavigationEntry* frame_entry = new FrameNavigationEntry(
|
| - rfh->frame_tree_node()->frame_tree_node_id(), params.frame_unique_name,
|
| - params.item_sequence_number, params.document_sequence_number,
|
| - rfh->GetSiteInstance(), params.url, params.referrer, params.method,
|
| - params.post_id);
|
| + // Make sure we don't leak frame_entry if new_entry doesn't take ownership.
|
| + scoped_refptr<FrameNavigationEntry> frame_entry(new FrameNavigationEntry(
|
| + params.frame_unique_name, params.item_sequence_number,
|
| + params.document_sequence_number, rfh->GetSiteInstance(), params.url,
|
| + params.referrer, params.method, params.post_id));
|
| new_entry = GetLastCommittedEntry()->CloneAndReplace(rfh->frame_tree_node(),
|
| - frame_entry);
|
| + frame_entry.get());
|
|
|
| - // TODO(creis): Make sure the last committed entry always has the subframe
|
| - // entry to replace, and CHECK(frame_entry->HasOneRef). For now, we might
|
| - // not find the entry to replace, and new_entry will be deleted when it goes
|
| - // out of scope. See https://crbug.com/522193.
|
| + // TODO(creis): Update this to add the frame_entry if we can't find the one
|
| + // to replace, which can happen due to a unique name change. See
|
| + // https://crbug.com/607205. For now, frame_entry will be deleted when it
|
| + // goes out of scope if it doesn't get used.
|
| } else {
|
| new_entry = GetLastCommittedEntry()->Clone();
|
| }
|
| @@ -1332,10 +1338,9 @@ bool NavigationControllerImpl::RendererDidNavigateAutoSubframe(
|
| // it may be a "history auto" case where we update an existing one.
|
| NavigationEntryImpl* last_committed = GetLastCommittedEntry();
|
| last_committed->AddOrUpdateFrameEntry(
|
| - rfh->frame_tree_node(), params.frame_unique_name,
|
| - params.item_sequence_number, params.document_sequence_number,
|
| - rfh->GetSiteInstance(), params.url, params.referrer, params.page_state,
|
| - params.method, params.post_id);
|
| + rfh->frame_tree_node(), params.item_sequence_number,
|
| + params.document_sequence_number, rfh->GetSiteInstance(), params.url,
|
| + params.referrer, params.page_state, params.method, params.post_id);
|
|
|
| // Cross-process subframe navigations may leave a pending entry around.
|
| // Clear it if it's actually for the subframe.
|
|
|