Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2957)

Unified Diff: chrome/browser/resource_coordinator/tab_manager_unittest.cc

Issue 2931023002: [TooManyTabs] Add TabNavigationThrottle (Closed)
Patch Set: add comments Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resource_coordinator/tab_manager_unittest.cc
diff --git a/chrome/browser/resource_coordinator/tab_manager_unittest.cc b/chrome/browser/resource_coordinator/tab_manager_unittest.cc
index 63a8ed332c75b50f1025a5366a951546d1c164fc..49537e12a9980bfcbe57a30b3fa891dd5c086fc1 100644
--- a/chrome/browser/resource_coordinator/tab_manager_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_manager_unittest.cc
@@ -39,12 +39,16 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
+using content::NavigationHandle;
+using content::NavigationThrottle;
using content::WebContents;
using content::WebContentsTester;
namespace resource_coordinator {
namespace {
+const char kTestUrl[] = "http://www.example.com";
+
class TabStripDummyDelegate : public TestTabStripModelDelegate {
public:
TabStripDummyDelegate() {}
@@ -114,6 +118,45 @@ class TabManagerTest : public ChromeRenderViewHostTestHarness {
web_contents->NavigateAndCommit(GURL("https://www.example.com"));
return web_contents;
}
+
+ std::unique_ptr<NavigationHandle> CreateTabAndNavigation() {
+ content::TestWebContents* web_contents =
+ content::TestWebContents::Create(profile(), nullptr);
+ return content::NavigationHandle::CreateNavigationHandleForTesting(
+ GURL(kTestUrl), web_contents->GetMainFrame());
+ }
+
+ // Simulate creating 3 tabs and their navigations.
+ void MaybeThrottleNavigations(TabManager* tab_manager) {
+ nav_handle1_ = CreateTabAndNavigation();
+ nav_handle2_ = CreateTabAndNavigation();
+ nav_handle3_ = CreateTabAndNavigation();
+ contents1_ = nav_handle1_->GetWebContents();
+ contents2_ = nav_handle2_->GetWebContents();
+ contents3_ = nav_handle3_->GetWebContents();
+
+ NavigationThrottle::ThrottleCheckResult result1 =
+ tab_manager->MaybeThrottleNavigation(nav_handle1_.get());
+ NavigationThrottle::ThrottleCheckResult result2 =
+ tab_manager->MaybeThrottleNavigation(nav_handle2_.get());
+ NavigationThrottle::ThrottleCheckResult result3 =
+ tab_manager->MaybeThrottleNavigation(nav_handle3_.get());
+
+ // First tab starts navigation right away because there is no tab loading.
+ EXPECT_EQ(content::NavigationThrottle::PROCEED, result1);
+
+ // The other 2 tabs's navigations are delayed.
+ EXPECT_EQ(content::NavigationThrottle::DEFER, result2);
+ EXPECT_EQ(content::NavigationThrottle::DEFER, result3);
+ }
+
+ protected:
+ std::unique_ptr<NavigationHandle> nav_handle1_;
+ std::unique_ptr<NavigationHandle> nav_handle2_;
+ std::unique_ptr<NavigationHandle> nav_handle3_;
+ WebContents* contents1_;
+ WebContents* contents2_;
+ WebContents* contents3_;
};
// TODO(georgesak): Add tests for protection to tabs with form input and
@@ -692,4 +735,112 @@ TEST_F(TabManagerTest, HistogramsSessionRestoreSwitchToTab) {
tab_strip.CloseAllTabs();
}
+TEST_F(TabManagerTest, MaybeThrottleNavigation) {
+ TabManager* tab_manager = g_browser_process->GetTabManager();
+ MaybeThrottleNavigations(tab_manager);
+ tab_manager->GetWebContentsData(contents1_)
+ ->DidStartNavigation(nav_handle1_.get());
+
+ // Tab 1 is loading. The other 2 tabs's navigations are delayed.
+ EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents1_));
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_));
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents3_));
+
+ EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle1_.get()));
+ EXPECT_TRUE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+ EXPECT_TRUE(tab_manager->IsNavigationDelayedForTest(nav_handle3_.get()));
+}
+
+TEST_F(TabManagerTest, OnDidFinishNavigation) {
+ TabManager* tab_manager = g_browser_process->GetTabManager();
+ MaybeThrottleNavigations(tab_manager);
+ tab_manager->GetWebContentsData(contents1_)
+ ->DidStartNavigation(nav_handle1_.get());
+
+ EXPECT_TRUE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+ tab_manager->GetWebContentsData(contents2_)
+ ->DidFinishNavigation(nav_handle2_.get());
+ EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+}
+
+TEST_F(TabManagerTest, OnDidStopLoading) {
+ TabManager* tab_manager = g_browser_process->GetTabManager();
+ MaybeThrottleNavigations(tab_manager);
+ tab_manager->GetWebContentsData(contents1_)
+ ->DidStartNavigation(nav_handle1_.get());
+
+ EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents1_));
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_));
+ EXPECT_TRUE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+
+ // Simulate tab 1 has finished loading.
+ tab_manager->GetWebContentsData(contents1_)->DidStopLoading();
+
+ // After tab 1 has finished loading, TabManager starts loading the next tab.
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents1_));
+ EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents2_));
+ EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+}
+
+TEST_F(TabManagerTest, OnWebContentsDestroyed) {
+ TabManager* tab_manager = g_browser_process->GetTabManager();
+ MaybeThrottleNavigations(tab_manager);
+ tab_manager->GetWebContentsData(contents1_)
+ ->DidStartNavigation(nav_handle1_.get());
+
+ // Tab 2 is destroyed when its navigation is still delayed. Its states are
+ // cleaned up.
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_));
+ EXPECT_TRUE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+ tab_manager->OnWebContentsDestroyed(contents2_);
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_));
+ EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+
+ // Tab 1 is destroyed when it is still loading. Its states are cleaned up and
+ // Tabmanager starts to load the next tab (tab 3).
+ EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents1_));
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents3_));
+ EXPECT_TRUE(tab_manager->IsNavigationDelayedForTest(nav_handle3_.get()));
+ tab_manager->GetWebContentsData(contents1_)->WebContentsDestroyed();
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents1_));
+ EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents3_));
+ EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle3_.get()));
+}
+
+TEST_F(TabManagerTest, OnDelayedTabSelected) {
+ TabManager* tab_manager = g_browser_process->GetTabManager();
+ MaybeThrottleNavigations(tab_manager);
+ tab_manager->GetWebContentsData(contents1_)
+ ->DidStartNavigation(nav_handle1_.get());
+
+ EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents1_));
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents3_));
+ EXPECT_TRUE(tab_manager->IsNavigationDelayedForTest(nav_handle3_.get()));
+
+ // Simulate selecting tab 3, which should start loading immediately.
+ tab_manager->ActiveTabChanged(
+ contents1_, contents3_, 2,
+ TabStripModelObserver::CHANGE_REASON_USER_GESTURE);
+
+ EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents1_));
+ EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents3_));
+ EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle3_.get()));
+
+ // Simulate tab 1 has finished loading. TabManager will NOT load the next tab
+ // (tab 2) because tab 3 is still loading.
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_));
+ EXPECT_TRUE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+ tab_manager->GetWebContentsData(contents1_)->DidStopLoading();
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents1_));
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents2_));
+ EXPECT_TRUE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+
+ // Simulate tab 3 has finished loading. TabManager starts loading the next tab
+ // (tab 2).
+ tab_manager->GetWebContentsData(contents3_)->DidStopLoading();
+ EXPECT_FALSE(tab_manager->IsTabLoadingForTest(contents3_));
+ EXPECT_TRUE(tab_manager->IsTabLoadingForTest(contents2_));
+ EXPECT_FALSE(tab_manager->IsNavigationDelayedForTest(nav_handle2_.get()));
+}
+
} // namespace resource_coordinator

Powered by Google App Engine
This is Rietveld 408576698