Revert of Remove the is_loading_ field from WebContentsImpl (patchset #24 id:460001 of https://codereview.chromium.org/1545973002/ )

Reason for revert:
CHECK(is_loading_) appears to fail (flakily?) on  Linux ChromiumOS Tests (1). More details in the bug.

Original issue's description:
> Remove the is_loading_ field from WebContentsImpl
>
> This CL removes the is_loading_ field from WebContents, in favor of only
> tracking the loading state through the FrameTree. Currently the loading state
> is tracked in both, leading to more complexity in the code.
>
> BUG=571887, 298193
> CQ_INCLUDE_TRYBOTS=tryserver.chromium.linux:linux_site_isolation
>
> Committed: https://crrev.com/db73eb6cf1e59e753fb53e8c744620b00606ccd5
> Cr-Commit-Position: refs/heads/master@{#374651}

[email protected],[email protected],[email protected],[email protected],[email protected]
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=571887, 298193

Review URL: https://codereview.chromium.org/1690633002

Cr-Commit-Position: refs/heads/master@{#374680}
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 20db239..d4f6bec 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -338,6 +338,7 @@
                   this,
                   this,
                   this),
+      is_loading_(false),
       is_load_to_different_document_(false),
       crashed_status_(base::TERMINATION_STATUS_STILL_RUNNING),
       crashed_error_code_(0),
@@ -346,7 +347,6 @@
       upload_size_(0),
       upload_position_(0),
       is_resume_pending_(false),
-      paused_throbber_for_interstitial_(false),
       displayed_insecure_content_(false),
       has_accessed_initial_document_(false),
       theme_color_(SK_ColorTRANSPARENT),
@@ -371,8 +371,8 @@
       force_disable_overscroll_content_(false),
       last_dialog_suppressed_(false),
       geolocation_service_context_(new GeolocationServiceContext()),
-      accessibility_mode_(BrowserAccessibilityStateImpl::GetInstance()
-                              ->accessibility_mode()),
+      accessibility_mode_(
+          BrowserAccessibilityStateImpl::GetInstance()->accessibility_mode()),
       audio_stream_monitor_(this),
       virtual_keyboard_requested_(false),
       page_scale_factor_is_one_(true),
@@ -896,7 +896,7 @@
   // Reload the page if a load is currently in progress to avoid having
   // different parts of the page loaded using different user agents.
   NavigationEntry* entry = controller_.GetVisibleEntry();
-  if (IsLoading() && entry != NULL && entry->GetIsOverridingUserAgent())
+  if (is_loading_ && entry != NULL && entry->GetIsOverridingUserAgent())
     controller_.ReloadIgnoringCache(true);
 
   FOR_EACH_OBSERVER(WebContentsObserver, observers_,
@@ -1036,11 +1036,11 @@
 }
 
 bool WebContentsImpl::IsLoading() const {
-  return frame_tree_.IsLoading() && !paused_throbber_for_interstitial_;
+  return is_loading_;
 }
 
 bool WebContentsImpl::IsLoadingToDifferentDocument() const {
-  return IsLoading() && is_load_to_different_document_;
+  return is_loading_ && is_load_to_different_document_;
 }
 
 bool WebContentsImpl::IsWaitingForResponse() const {
@@ -2309,18 +2309,6 @@
 
   FOR_EACH_OBSERVER(WebContentsObserver, observers_,
                     DidAttachInterstitialPage());
-
-  // Stop the throbber if needed while the interstitial page is shown.
-  if (IsLoading())
-    LoadingStateChanged(false, true, true, nullptr);
-}
-
-void WebContentsImpl::DidProceedOnInterstitial() {
-  // Restart the throbber now that the interstitial page is going away.
-  if (paused_throbber_for_interstitial_) {
-    if (frame_tree_.IsLoading())
-      LoadingStateChanged(true, true, false, nullptr);
-  }
 }
 
 void WebContentsImpl::DetachInterstitialPage() {
@@ -2328,11 +2316,6 @@
     GetRenderManager()->remove_interstitial_page();
   FOR_EACH_OBSERVER(WebContentsObserver, observers_,
                     DidDetachInterstitialPage());
-  // Restart the throbber now that the interstitial page is going away.
-  if (paused_throbber_for_interstitial_) {
-    if (frame_tree_.IsLoading())
-      LoadingStateChanged(true, true, false, nullptr);
-  }
 }
 
 void WebContentsImpl::SetHistoryOffsetAndLength(int history_offset,
@@ -3605,17 +3588,12 @@
 
 // Notifies the RenderWidgetHost instance about the fact that the page is
 // loading, or done loading.
-void WebContentsImpl::LoadingStateChanged(bool is_loading,
-                                          bool to_different_document,
-                                          bool pause_throbber_for_interstitial,
-                                          LoadNotificationDetails* details) {
-  // Do not send notifications about loading while the interstitial is showing.
-  if (paused_throbber_for_interstitial_ && pause_throbber_for_interstitial)
+void WebContentsImpl::SetIsLoading(bool is_loading,
+                                   bool to_different_document,
+                                   LoadNotificationDetails* details) {
+  if (is_loading == is_loading_)
     return;
 
-  // Update whether the interstitial state.
-  paused_throbber_for_interstitial_ = pause_throbber_for_interstitial;
-
   if (!is_loading) {
     load_state_ = net::LoadStateWithParam(net::LOAD_STATE_IDLE,
                                           base::string16());
@@ -3626,6 +3604,7 @@
 
   GetRenderManager()->SetIsLoading(is_loading);
 
+  is_loading_ = is_loading;
   waiting_for_response_ = is_loading;
   is_load_to_different_document_ = to_different_document;
 
@@ -3978,13 +3957,15 @@
   if (delegate_)
     delegate_->HideValidationMessage(this);
 
+  SetIsLoading(false, true, nullptr);
+  NotifyDisconnected();
+  SetIsCrashed(status, error_code);
+
   // Reset the loading progress. TODO(avi): What does it mean to have a
   // "renderer crash" when there is more than one renderer process serving a
   // webpage? Once this function is called at a more granular frame level, we
   // probably will need to more granularly reset the state here.
   ResetLoadProgressState();
-  NotifyDisconnected();
-  SetIsCrashed(status, error_code);
 
   FOR_EACH_OBSERVER(WebContentsObserver,
                     observers_,
@@ -4078,8 +4059,7 @@
 
 void WebContentsImpl::DidStartLoading(FrameTreeNode* frame_tree_node,
                                       bool to_different_document) {
-  LoadingStateChanged(true, to_different_document,
-                      paused_throbber_for_interstitial_, nullptr);
+  SetIsLoading(true, to_different_document, nullptr);
 
   // Notify accessibility that the user is navigating away from the
   // current document.
@@ -4113,8 +4093,7 @@
         controller_.GetCurrentEntryIndex()));
   }
 
-  LoadingStateChanged(false, true, paused_throbber_for_interstitial_,
-                      details.get());
+  SetIsLoading(false, true, details.get());
 }
 
 void WebContentsImpl::DidChangeLoadProgress() {
@@ -4651,8 +4630,10 @@
   last_dialog_suppressed_ = dialog_was_suppressed;
 
   if (is_showing_before_unload_dialog_ && !success) {
+    // If a beforeunload dialog is canceled, we need to stop the throbber from
+    // spinning, since we forced it to start spinning in Navigate.
     if (rfh)
-      rfh->frame_tree_node()->BeforeUnloadCanceled();
+      DidStopLoading();
     controller_.DiscardNonCommittedEntries();
 
     FOR_EACH_OBSERVER(WebContentsObserver, observers_,