| Index: content/renderer/render_frame_impl.cc
 | 
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
 | 
| index 41daf307a3cf84ae2fd2c504e9845f93a172996f..b45d41f0d69164d81ac5306efef1f79e1b866d94 100644
 | 
| --- a/content/renderer/render_frame_impl.cc
 | 
| +++ b/content/renderer/render_frame_impl.cc
 | 
| @@ -3720,8 +3720,12 @@ void RenderFrameImpl::willSendRequest(
 | 
|      // If the navigation is browser-initiated, the NavigationState contains the
 | 
|      // correct value instead of the WebDataSource.
 | 
|      //
 | 
| -    // TODO(davidben): Avoid this awkward duplication of state. See comment on
 | 
| -    // NavigationState::should_replace_current_entry().
 | 
| +    // TODO(creis): Remove should_replace_current_entry from NavigationState
 | 
| +    // once we verify this is correct, since the WebDataSource should now be
 | 
| +    // correct.  Currently failing in NewAndAutoSubframe test with CHECK_EQ.
 | 
| +    CHECK(
 | 
| +        !navigation_state->common_params().should_replace_current_entry ||
 | 
| +        data_source->replacesCurrentHistoryItem());
 | 
|      should_replace_current_entry =
 | 
|          navigation_state->common_params().should_replace_current_entry;
 | 
|    }
 | 
| @@ -4382,7 +4386,14 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad(
 | 
|    params.is_post = false;
 | 
|    params.intended_as_new_entry =
 | 
|        navigation_state->request_params().intended_as_new_entry;
 | 
| -  params.did_create_new_entry = commit_type == blink::WebStandardCommit;
 | 
| +  // We create a new entry for standard commits, as well as location.replace
 | 
| +  // navigations that replace the current entry with a different document.
 | 
| +  params.did_create_new_entry = commit_type == blink::WebStandardCommit ||
 | 
| +      (ds->replacesCurrentHistoryItem() &&
 | 
| +       !navigation_state->WasWithinSamePage());
 | 
| +  CHECK(!navigation_state->common_params().should_replace_current_entry ||
 | 
| +        ds->replacesCurrentHistoryItem());
 | 
| +  params.should_replace_current_entry = ds->replacesCurrentHistoryItem();
 | 
|    params.post_id = -1;
 | 
|    params.page_id = render_view_->page_id_;
 | 
|    params.nav_entry_id = navigation_state->request_params().nav_entry_id;
 | 
| @@ -4551,7 +4562,7 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad(
 | 
|      // generated a new session history entry. When they do generate a session
 | 
|      // history entry, it means the user initiated the navigation and we should
 | 
|      // mark it as such.
 | 
| -    if (commit_type == blink::WebStandardCommit)
 | 
| +    if (params.did_create_new_entry)
 | 
|        params.transition = ui::PAGE_TRANSITION_MANUAL_SUBFRAME;
 | 
|      else
 | 
|        params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME;
 | 
| @@ -4972,8 +4983,17 @@ void RenderFrameImpl::OpenURL(const GURL& url,
 | 
|      // This is necessary to preserve the should_replace_current_entry value on
 | 
|      // cross-process redirects, in the event it was set by a previous process.
 | 
|      //
 | 
| -    // TODO(davidben): Avoid this awkward duplication of state. See comment on
 | 
| -    // NavigationState::should_replace_current_entry().
 | 
| +    // TODO(creis): Remove should_replace_current_entry from NavigationState
 | 
| +    // once we verify this is correct, since the WebDataSource should now be
 | 
| +    // correct.
 | 
| +    WebDataSource* ds = frame_->provisionalDataSource();
 | 
| +    if (ds) {
 | 
| +      DocumentState* document_state = DocumentState::FromDataSource(ds);
 | 
| +      NavigationStateImpl* navigation_state =
 | 
| +          static_cast<NavigationStateImpl*>(document_state->navigation_state());
 | 
| +      CHECK_EQ(navigation_state->common_params().should_replace_current_entry,
 | 
| +               ds->replacesCurrentHistoryItem());
 | 
| +    }
 | 
|      params.should_replace_current_entry =
 | 
|          pending_navigation_params_->common_params.should_replace_current_entry;
 | 
|    } else {
 | 
| @@ -5060,8 +5080,12 @@ void RenderFrameImpl::NavigateInternal(
 | 
|    pending_navigation_params_->common_params.navigation_start =
 | 
|        base::TimeTicks();
 | 
|  
 | 
| -  // Create parameters for a standard navigation.
 | 
| -  blink::WebFrameLoadType load_type = blink::WebFrameLoadType::Standard;
 | 
| +  // Create parameters for a standard navigation, indicating whether it should
 | 
| +  // replace the current NavigationEntry.
 | 
| +  blink::WebFrameLoadType load_type =
 | 
| +      common_params.should_replace_current_entry ?
 | 
| +          blink::WebFrameLoadType::ReplaceCurrentItem :
 | 
| +          blink::WebFrameLoadType::Standard;
 | 
|    blink::WebHistoryLoadType history_load_type =
 | 
|        blink::WebHistoryDifferentDocumentLoad;
 | 
|    bool should_load_request = false;
 | 
| 
 |