Add |needs_reload| argument to NavigationController::CopyStateFrom().

This argument controls whether the WebContents needs to be reloaded
when activated. Not reloading the WebContents as soon as it is
activated will allow TabManager to implement more advanced reload
rules (e.g. browser window is active, tab has been active for x ms).

Note: Today, a WebContents is considered "active" if it is in a
selected tab, even if the browser window is not visible.

[email protected],[email protected],[email protected]

Bug: 731145
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_site_isolation
Change-Id: I87a16df112752b97bcc369e34a1e1f86d18d9b99
Reviewed-on: https://chromium-review.googlesource.com/531065
Commit-Queue: Francois Doray <[email protected]>
Reviewed-by: Charlie Reis <[email protected]>
Cr-Commit-Position: refs/heads/master@{#481778}
diff --git a/content/browser/frame_host/navigation_controller_android.cc b/content/browser/frame_host/navigation_controller_android.cc
index 0808ba3..9b3b1d9 100644
--- a/content/browser/frame_host/navigation_controller_android.cc
+++ b/content/browser/frame_host/navigation_controller_android.cc
@@ -397,10 +397,13 @@
 void NavigationControllerAndroid::CopyStateFrom(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
-    jlong source_navigation_controller_android) {
+    jlong source_navigation_controller_android,
+    jboolean needs_reload) {
   navigation_controller_->CopyStateFrom(
       *(reinterpret_cast<NavigationControllerAndroid*>(
-          source_navigation_controller_android)->navigation_controller_));
+            source_navigation_controller_android)
+            ->navigation_controller_),
+      needs_reload);
 }
 
 void NavigationControllerAndroid::CopyStateFromAndPrune(
diff --git a/content/browser/frame_host/navigation_controller_android.h b/content/browser/frame_host/navigation_controller_android.h
index 1969515..09c2dd1 100644
--- a/content/browser/frame_host/navigation_controller_android.h
+++ b/content/browser/frame_host/navigation_controller_android.h
@@ -127,7 +127,8 @@
       const base::android::JavaParamRef<jobject>& obj);
   void CopyStateFrom(JNIEnv* env,
                      const base::android::JavaParamRef<jobject>& obj,
-                     jlong source_native_navigation_controller_android);
+                     jlong source_native_navigation_controller_android,
+                     jboolean needs_reload);
   void CopyStateFromAndPrune(JNIEnv* env,
                              const base::android::JavaParamRef<jobject>& obj,
                              jlong source_native_navigation_controller_android,
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
index ec704d4..f15af73 100644
--- a/content/browser/frame_host/navigation_controller_impl.cc
+++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -1568,8 +1568,8 @@
   return is_same_origin && renderer_says_in_page;
 }
 
-void NavigationControllerImpl::CopyStateFrom(
-    const NavigationController& temp) {
+void NavigationControllerImpl::CopyStateFrom(const NavigationController& temp,
+                                             bool needs_reload) {
   const NavigationControllerImpl& source =
       static_cast<const NavigationControllerImpl&>(temp);
   // Verify that we look new.
@@ -1578,7 +1578,7 @@
   if (source.GetEntryCount() == 0)
     return;  // Nothing new to do.
 
-  needs_reload_ = true;
+  needs_reload_ = needs_reload;
   InsertEntriesFrom(source, source.GetEntryCount());
 
   for (SessionStorageNamespaceMap::const_iterator it =
diff --git a/content/browser/frame_host/navigation_controller_impl.h b/content/browser/frame_host/navigation_controller_impl.h
index 8682227..a86ca16 100644
--- a/content/browser/frame_host/navigation_controller_impl.h
+++ b/content/browser/frame_host/navigation_controller_impl.h
@@ -85,7 +85,8 @@
   bool IsInitialBlankNavigation() const override;
   void Reload(ReloadType reload_type, bool check_for_repost) override;
   void NotifyEntryChanged(const NavigationEntry* entry) override;
-  void CopyStateFrom(const NavigationController& source) override;
+  void CopyStateFrom(const NavigationController& source,
+                     bool needs_reload) override;
   void CopyStateFromAndPrune(NavigationController* source,
                              bool replace_entry) override;
   bool CanPruneAllButLastCommitted() override;
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc
index 5863b90..3784d24e 100644
--- a/content/browser/frame_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -4133,7 +4133,7 @@
   std::unique_ptr<TestWebContents> other_contents(
       static_cast<TestWebContents*>(CreateTestWebContents()));
   NavigationControllerImpl& other_controller = other_contents->GetController();
-  other_controller.CopyStateFrom(controller);
+  other_controller.CopyStateFrom(controller, true);
 
   // other_controller should now contain 2 urls.
   ASSERT_EQ(2, other_controller.GetEntryCount());
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 1d68687..52ddbab 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1615,7 +1615,7 @@
   create_params.initial_size = GetContainerBounds().size();
   WebContentsImpl* tc =
       CreateWithOpener(create_params, frame_tree_.root()->opener());
-  tc->GetController().CopyStateFrom(controller_);
+  tc->GetController().CopyStateFrom(controller_, true);
   for (auto& observer : observers_)
     observer.DidCloneToNewWebContents(this, tc);
   return tc;