| Index: content/browser/frame_host/frame_tree_node.cc
 | 
| diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc
 | 
| index cabc819f4322201f2a42b9a5881e457628fcf2f2..8ebfe44115d0f8bfe7d0f678033457b07fcf7cbf 100644
 | 
| --- a/content/browser/frame_host/frame_tree_node.cc
 | 
| +++ b/content/browser/frame_host/frame_tree_node.cc
 | 
| @@ -166,10 +166,15 @@ bool FrameTreeNode::IsLoading() const {
 | 
|        render_manager_.pending_frame_host();
 | 
|  
 | 
|    DCHECK(current_frame_host);
 | 
| -  // TODO(fdegans): Change the implementation logic for PlzNavigate once
 | 
| -  // DidStartLoading and DidStopLoading are properly called.
 | 
| -  if (pending_frame_host && pending_frame_host->is_loading())
 | 
| -    return true;
 | 
| +
 | 
| +  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
 | 
| +          switches::kEnableBrowserSideNavigation)) {
 | 
| +    if (navigation_request_)
 | 
| +      return true;
 | 
| +  } else {
 | 
| +    if (pending_frame_host && pending_frame_host->is_loading())
 | 
| +      return true;
 | 
| +  }
 | 
|    return current_frame_host->is_loading();
 | 
|  }
 | 
|  
 | 
| @@ -185,22 +190,38 @@ void FrameTreeNode::SetNavigationRequest(
 | 
|    CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
 | 
|        switches::kEnableBrowserSideNavigation));
 | 
|    ResetNavigationRequest(false);
 | 
| -  // TODO(clamy): perform the StartLoading logic here.
 | 
| +
 | 
| +  // Force the throbber to start to keep it in sync with what is happening in
 | 
| +  // the UI. Blink doesn't send throb notifications for JavaScript URLs, so it
 | 
| +  // is not done here either.
 | 
| +  if (!navigation_request->common_params().url.SchemeIs(
 | 
| +          url::kJavaScriptScheme)) {
 | 
| +    // TODO(fdegans): Check if this is a same-document navigation and set the
 | 
| +    // proper argument.
 | 
| +    DidStartLoading(true);
 | 
| +  }
 | 
| +
 | 
|    navigation_request_ = navigation_request.Pass();
 | 
|  }
 | 
|  
 | 
|  void FrameTreeNode::ResetNavigationRequest(bool is_commit) {
 | 
|    CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
 | 
|        switches::kEnableBrowserSideNavigation));
 | 
| -  // Upon commit the current NavigationRequest will be reset. There should be no
 | 
| -  // cleanup performed since the navigation is still ongoing. If the reset
 | 
| -  // corresponds to a cancelation, the RenderFrameHostManager should clean up
 | 
| -  // any speculative RenderFrameHost it created for the navigation.
 | 
| -  if (navigation_request_ && !is_commit) {
 | 
| -    // TODO(clamy): perform the StopLoading logic.
 | 
| -    render_manager_.CleanUpNavigation();
 | 
| -  }
 | 
| +  if (!navigation_request_)
 | 
| +    return;
 | 
|    navigation_request_.reset();
 | 
| +
 | 
| +  // During commit, the clean up of a speculative RenderFrameHost is done in
 | 
| +  // RenderFrameHostManager::DidNavigateFrame. The load is also still being
 | 
| +  // tracked.
 | 
| +  if (is_commit)
 | 
| +    return;
 | 
| +
 | 
| +  // If the reset corresponds to a cancelation, the RenderFrameHostManager
 | 
| +  // should clean up any speculative RenderFrameHost it created for the
 | 
| +  // navigation.
 | 
| +  DidStopLoading();
 | 
| +  render_manager_.CleanUpNavigation();
 | 
|  }
 | 
|  
 | 
|  bool FrameTreeNode::has_started_loading() const {
 | 
| 
 |