| Index: chrome/browser/memory/tab_manager_browsertest.cc
|
| diff --git a/chrome/browser/memory/tab_manager_browsertest.cc b/chrome/browser/memory/tab_manager_browsertest.cc
|
| deleted file mode 100644
|
| index cfe3b3323e03245f5c8cdf54e97a60689cc62a7c..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/memory/tab_manager_browsertest.cc
|
| +++ /dev/null
|
| @@ -1,587 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "base/base_switches.h"
|
| -#include "base/command_line.h"
|
| -#include "base/memory/memory_pressure_listener.h"
|
| -#include "base/test/simple_test_tick_clock.h"
|
| -#include "build/build_config.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
|
| -#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
|
| -#include "chrome/browser/memory/tab_manager.h"
|
| -#include "chrome/browser/memory/tab_manager_web_contents_data.h"
|
| -#include "chrome/browser/ui/browser.h"
|
| -#include "chrome/browser/ui/browser_commands.h"
|
| -#include "chrome/browser/ui/find_bar/find_bar_controller.h"
|
| -#include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| -#include "chrome/common/chrome_features.h"
|
| -#include "chrome/common/url_constants.h"
|
| -#include "chrome/test/base/in_process_browser_test.h"
|
| -#include "chrome/test/base/interactive_test_utils.h"
|
| -#include "content/public/browser/navigation_details.h"
|
| -#include "content/public/browser/navigation_entry.h"
|
| -#include "content/public/browser/notification_service.h"
|
| -#include "content/public/browser/notification_types.h"
|
| -#include "content/public/browser/render_process_host.h"
|
| -#include "content/public/common/content_switches.h"
|
| -#include "content/public/test/test_utils.h"
|
| -#include "url/gurl.h"
|
| -
|
| -using content::OpenURLParams;
|
| -
|
| -#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
|
| -
|
| -namespace memory {
|
| -
|
| -class TabManagerTest : public InProcessBrowserTest {
|
| -};
|
| -
|
| -bool ObserveNavEntryCommitted(const GURL& expected_url,
|
| - const content::NotificationSource& source,
|
| - const content::NotificationDetails& details) {
|
| - return content::Details<content::LoadCommittedDetails>(details)
|
| - ->entry->GetURL() == expected_url;
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(TabManagerTest, TabManagerBasics) {
|
| - using content::WindowedNotificationObserver;
|
| - TabManager* tab_manager = g_browser_process->GetTabManager();
|
| - EXPECT_FALSE(tab_manager->recent_tab_discard());
|
| -
|
| - // Disable the protection of recent tabs.
|
| - tab_manager->set_minimum_protection_time_for_tests(
|
| - base::TimeDelta::FromMinutes(0));
|
| -
|
| - // Get three tabs open.
|
| - WindowedNotificationObserver load1(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
|
| - WindowOpenDisposition::CURRENT_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open1);
|
| - load1.Wait();
|
| -
|
| - WindowedNotificationObserver load2(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
|
| - WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open2);
|
| - load2.Wait();
|
| -
|
| - WindowedNotificationObserver load3(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open3(GURL(chrome::kChromeUITermsURL), content::Referrer(),
|
| - WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open3);
|
| - load3.Wait();
|
| -
|
| - auto* tsm = browser()->tab_strip_model();
|
| - EXPECT_EQ(3, tsm->count());
|
| -
|
| - // Navigate the current (third) tab to a different URL, so we can test
|
| - // back/forward later.
|
| - WindowedNotificationObserver load4(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open4(GURL(chrome::kChromeUIVersionURL), content::Referrer(),
|
| - WindowOpenDisposition::CURRENT_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open4);
|
| - load4.Wait();
|
| -
|
| - // Navigate the third tab again, such that we have three navigation entries.
|
| - WindowedNotificationObserver load5(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open5(GURL("chrome://dns"), content::Referrer(),
|
| - WindowOpenDisposition::CURRENT_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open5);
|
| - load5.Wait();
|
| -
|
| - EXPECT_EQ(3, tsm->count());
|
| -
|
| - // Discard a tab. It should kill the first tab, since it was the oldest
|
| - // and was not selected.
|
| - EXPECT_TRUE(tab_manager->DiscardTabImpl());
|
| - EXPECT_EQ(3, tsm->count());
|
| - EXPECT_TRUE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(0)));
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(1)));
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(2)));
|
| - EXPECT_TRUE(tab_manager->recent_tab_discard());
|
| -
|
| - // Run discard again, make sure it kills the second tab.
|
| - EXPECT_TRUE(tab_manager->DiscardTabImpl());
|
| - EXPECT_EQ(3, tsm->count());
|
| - EXPECT_TRUE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(0)));
|
| - EXPECT_TRUE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(1)));
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(2)));
|
| -
|
| - // Kill the third tab. It should not kill the last tab, since it is active
|
| - // tab.
|
| - EXPECT_FALSE(tab_manager->DiscardTabImpl());
|
| - EXPECT_TRUE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(0)));
|
| - EXPECT_TRUE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(1)));
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(2)));
|
| -
|
| - // Kill the third tab after making second tab active.
|
| - tsm->ActivateTabAt(1, true);
|
| - EXPECT_EQ(1, tsm->active_index());
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(1)));
|
| - tab_manager->DiscardWebContentsAt(2, tsm);
|
| - EXPECT_TRUE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(2)));
|
| -
|
| - // Force creation of the FindBarController.
|
| - browser()->GetFindBarController();
|
| -
|
| - // Select the first tab. It should reload.
|
| - WindowedNotificationObserver reload1(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - base::Bind(&ObserveNavEntryCommitted,
|
| - GURL(chrome::kChromeUIChromeURLsURL)));
|
| - chrome::SelectNumberedTab(browser(), 0);
|
| - reload1.Wait();
|
| - // Make sure the FindBarController gets the right WebContents.
|
| - EXPECT_EQ(browser()->GetFindBarController()->web_contents(),
|
| - tsm->GetActiveWebContents());
|
| - EXPECT_EQ(0, tsm->active_index());
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(0)));
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(1)));
|
| - EXPECT_TRUE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(2)));
|
| -
|
| - // Select the third tab. It should reload.
|
| - WindowedNotificationObserver reload2(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - base::Bind(&ObserveNavEntryCommitted, GURL("chrome://dns")));
|
| - chrome::SelectNumberedTab(browser(), 2);
|
| - reload2.Wait();
|
| - EXPECT_EQ(2, tsm->active_index());
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(0)));
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(1)));
|
| - EXPECT_FALSE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(2)));
|
| -
|
| - // Navigate the third tab back twice. We used to crash here due to
|
| - // crbug.com/121373.
|
| - EXPECT_TRUE(chrome::CanGoBack(browser()));
|
| - EXPECT_FALSE(chrome::CanGoForward(browser()));
|
| - WindowedNotificationObserver back1(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - base::Bind(&ObserveNavEntryCommitted, GURL(chrome::kChromeUIVersionURL)));
|
| - chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
|
| - back1.Wait();
|
| - EXPECT_TRUE(chrome::CanGoBack(browser()));
|
| - EXPECT_TRUE(chrome::CanGoForward(browser()));
|
| - WindowedNotificationObserver back2(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - base::Bind(&ObserveNavEntryCommitted, GURL(chrome::kChromeUITermsURL)));
|
| - chrome::GoBack(browser(), WindowOpenDisposition::CURRENT_TAB);
|
| - back2.Wait();
|
| - EXPECT_FALSE(chrome::CanGoBack(browser()));
|
| - EXPECT_TRUE(chrome::CanGoForward(browser()));
|
| -}
|
| -
|
| -// On Linux, memory pressure listener is not implemented yet.
|
| -#if defined(OS_WIN) || defined(OS_MACOSX)
|
| -
|
| -// Test that the MemoryPressureListener event is properly triggering a tab
|
| -// discard upon |MEMORY_PRESSURE_LEVEL_CRITICAL| event.
|
| -IN_PROC_BROWSER_TEST_F(TabManagerTest, OomPressureListener) {
|
| - TabManager* tab_manager = g_browser_process->GetTabManager();
|
| -
|
| - // Disable the protection of recent tabs.
|
| - tab_manager->set_minimum_protection_time_for_tests(
|
| - base::TimeDelta::FromMinutes(0));
|
| -
|
| - // Get three tabs open.
|
| - content::WindowedNotificationObserver load1(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
|
| - WindowOpenDisposition::CURRENT_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open1);
|
| - load1.Wait();
|
| -
|
| - content::WindowedNotificationObserver load2(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
|
| - WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open2);
|
| - load2.Wait();
|
| - EXPECT_FALSE(tab_manager->recent_tab_discard());
|
| -
|
| - // Nothing should happen with a moderate memory pressure event.
|
| - base::MemoryPressureListener::NotifyMemoryPressure(
|
| - base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
|
| - EXPECT_FALSE(tab_manager->recent_tab_discard());
|
| -
|
| - // A critical memory pressure event should discard a tab.
|
| - base::MemoryPressureListener::NotifyMemoryPressure(
|
| - base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
|
| - // Coming here, an asynchronous operation will collect system stats. Once in,
|
| - // a tab should get discarded. As such we need to give it 10s time to discard.
|
| - const int kTimeoutTimeInMS = 10000;
|
| - const int kIntervalTimeInMS = 5;
|
| - int timeout = kTimeoutTimeInMS / kIntervalTimeInMS;
|
| - while (--timeout) {
|
| - base::PlatformThread::Sleep(
|
| - base::TimeDelta::FromMilliseconds(kIntervalTimeInMS));
|
| - base::RunLoop().RunUntilIdle();
|
| - if (tab_manager->recent_tab_discard())
|
| - break;
|
| - }
|
| - EXPECT_TRUE(tab_manager->recent_tab_discard());
|
| -}
|
| -
|
| -#endif
|
| -
|
| -IN_PROC_BROWSER_TEST_F(TabManagerTest, InvalidOrEmptyURL) {
|
| - TabManager* tab_manager = g_browser_process->GetTabManager();
|
| -
|
| - // Disable the protection of recent tabs.
|
| - tab_manager->set_minimum_protection_time_for_tests(
|
| - base::TimeDelta::FromMinutes(0));
|
| -
|
| - // Open two tabs. Wait for the foreground one to load but do not wait for the
|
| - // background one.
|
| - content::WindowedNotificationObserver load1(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
|
| - WindowOpenDisposition::CURRENT_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open1);
|
| - load1.Wait();
|
| -
|
| - content::WindowedNotificationObserver load2(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
|
| - WindowOpenDisposition::NEW_BACKGROUND_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open2);
|
| -
|
| - ASSERT_EQ(2, browser()->tab_strip_model()->count());
|
| -
|
| - // This shouldn't be able to discard a tab as the background tab has not yet
|
| - // started loading (its URL is not committed).
|
| - EXPECT_FALSE(tab_manager->DiscardTabImpl());
|
| -
|
| - // Wait for the background tab to load which then allows it to be discarded.
|
| - load2.Wait();
|
| - EXPECT_TRUE(tab_manager->DiscardTabImpl());
|
| -}
|
| -
|
| -// Makes sure that PDF pages are protected.
|
| -IN_PROC_BROWSER_TEST_F(TabManagerTest, ProtectPDFPages) {
|
| - TabManager* tab_manager = g_browser_process->GetTabManager();
|
| -
|
| - // Start the embedded test server so we can get served the required PDF page.
|
| - ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
|
| - embedded_test_server()->StartAcceptingConnections();
|
| -
|
| - // Get two tabs open, the first one being a PDF page and the second one being
|
| - // the foreground tab.
|
| - GURL url1 = embedded_test_server()->GetURL("/pdf/test.pdf");
|
| - ui_test_utils::NavigateToURL(browser(), url1);
|
| -
|
| - GURL url2(chrome::kChromeUIAboutURL);
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - browser(), url2, WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
| - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| -
|
| - // No discarding should be possible as the only background tab is displaying a
|
| - // PDF page, hence protected.
|
| - EXPECT_FALSE(tab_manager->DiscardTabImpl());
|
| -}
|
| -
|
| -// Makes sure that recently opened or used tabs are protected, depending on the
|
| -// value of of |minimum_protection_time_|.
|
| -// TODO(georgesak): Move this to a unit test instead (requires change to API).
|
| -IN_PROC_BROWSER_TEST_F(TabManagerTest, ProtectRecentlyUsedTabs) {
|
| - // TODO(georgesak): Retrieve this value from tab_manager.h once it becomes a
|
| - // constant (as of now, it gets set through variations).
|
| - const int kProtectionTime = 5;
|
| - TabManager* tab_manager = g_browser_process->GetTabManager();
|
| -
|
| - base::SimpleTestTickClock test_clock_;
|
| - tab_manager->set_test_tick_clock(&test_clock_);
|
| -
|
| - auto* tsm = browser()->tab_strip_model();
|
| -
|
| - // Set the minimum time of protection.
|
| - tab_manager->set_minimum_protection_time_for_tests(
|
| - base::TimeDelta::FromMinutes(kProtectionTime));
|
| -
|
| - // Open 2 tabs, the second one being in the background.
|
| - ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL));
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - browser(), GURL(chrome::kChromeUIAboutURL),
|
| - WindowOpenDisposition::NEW_BACKGROUND_TAB,
|
| - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| - EXPECT_EQ(2, tsm->count());
|
| -
|
| - // Advance the clock for less than the protection time.
|
| - test_clock_.Advance(base::TimeDelta::FromMinutes(kProtectionTime / 2));
|
| -
|
| - // Should not be able to discard a tab.
|
| - ASSERT_FALSE(tab_manager->DiscardTabImpl());
|
| -
|
| - // Advance the clock for more than the protection time.
|
| - test_clock_.Advance(base::TimeDelta::FromMinutes(kProtectionTime / 2 + 2));
|
| -
|
| - // Should be able to discard the background tab now.
|
| - EXPECT_TRUE(tab_manager->DiscardTabImpl());
|
| -
|
| - // Activate the 2nd tab.
|
| - tsm->ActivateTabAt(1, true);
|
| - EXPECT_EQ(1, tsm->active_index());
|
| -
|
| - // Advance the clock for less than the protection time.
|
| - test_clock_.Advance(base::TimeDelta::FromMinutes(kProtectionTime / 2));
|
| -
|
| - // Should not be able to discard a tab.
|
| - ASSERT_FALSE(tab_manager->DiscardTabImpl());
|
| -
|
| - // Advance the clock for more than the protection time.
|
| - test_clock_.Advance(base::TimeDelta::FromMinutes(kProtectionTime / 2 + 2));
|
| -
|
| - // Should be able to discard the background tab now.
|
| - EXPECT_TRUE(tab_manager->DiscardTabImpl());
|
| -
|
| - // This is necessary otherwise the test crashes in
|
| - // WebContentsData::WebContentsDestroyed.
|
| - tsm->CloseAllTabs();
|
| -}
|
| -
|
| -// Makes sure that tabs using media devices are protected.
|
| -IN_PROC_BROWSER_TEST_F(TabManagerTest, ProtectVideoTabs) {
|
| - TabManager* tab_manager = g_browser_process->GetTabManager();
|
| -
|
| - // Disable the protection of recent tabs.
|
| - tab_manager->set_minimum_protection_time_for_tests(
|
| - base::TimeDelta::FromMinutes(0));
|
| -
|
| - // Open 2 tabs, the second one being in the background.
|
| - ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL));
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - browser(), GURL(chrome::kChromeUIAboutURL),
|
| - WindowOpenDisposition::NEW_BACKGROUND_TAB,
|
| - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| -
|
| - auto* tab = browser()->tab_strip_model()->GetWebContentsAt(1);
|
| -
|
| - // Simulate that a video stream is now being captured.
|
| - content::MediaStreamDevice fake_media_device(
|
| - content::MEDIA_DEVICE_VIDEO_CAPTURE, "fake_media_device",
|
| - "fake_media_device");
|
| - content::MediaStreamDevices video_devices(1, fake_media_device);
|
| - MediaCaptureDevicesDispatcher* dispatcher =
|
| - MediaCaptureDevicesDispatcher::GetInstance();
|
| - dispatcher->SetTestVideoCaptureDevices(video_devices);
|
| - std::unique_ptr<content::MediaStreamUI> video_stream_ui =
|
| - dispatcher->GetMediaStreamCaptureIndicator()->RegisterMediaStream(
|
| - tab, video_devices);
|
| - video_stream_ui->OnStarted(base::Closure());
|
| -
|
| - // Should not be able to discard a tab.
|
| - ASSERT_FALSE(tab_manager->DiscardTabImpl());
|
| -
|
| - // Remove the video stream.
|
| - video_stream_ui.reset();
|
| -
|
| - // Should be able to discard the background tab now.
|
| - EXPECT_TRUE(tab_manager->DiscardTabImpl());
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(TabManagerTest, CanSuspendBackgroundedRenderer) {
|
| - TabManager* tab_manager = g_browser_process->GetTabManager();
|
| -
|
| - // Open 2 tabs, the second one being in the background.
|
| - ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAboutURL));
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - browser(), GURL(chrome::kChromeUIAboutURL),
|
| - WindowOpenDisposition::NEW_BACKGROUND_TAB,
|
| - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| -
|
| - auto* tab = browser()->tab_strip_model()->GetWebContentsAt(1);
|
| - // Simulate that a video stream is now being captured.
|
| - content::MediaStreamDevice fake_media_device(
|
| - content::MEDIA_DEVICE_VIDEO_CAPTURE, "fake_media_device",
|
| - "fake_media_device");
|
| - content::MediaStreamDevices video_devices(1, fake_media_device);
|
| - MediaCaptureDevicesDispatcher* dispatcher =
|
| - MediaCaptureDevicesDispatcher::GetInstance();
|
| - dispatcher->SetTestVideoCaptureDevices(video_devices);
|
| - std::unique_ptr<content::MediaStreamUI> video_stream_ui =
|
| - dispatcher->GetMediaStreamCaptureIndicator()->RegisterMediaStream(
|
| - tab, video_devices);
|
| - video_stream_ui->OnStarted(base::Closure());
|
| -
|
| - // Should not be able to suspend a tab which plays a video.
|
| - int render_process_id = tab->GetRenderProcessHost()->GetID();
|
| - ASSERT_FALSE(tab_manager->CanSuspendBackgroundedRenderer(render_process_id));
|
| -
|
| - // Remove the video stream.
|
| - video_stream_ui.reset();
|
| -
|
| - // Should be able to suspend the background tab now.
|
| - EXPECT_TRUE(tab_manager->CanSuspendBackgroundedRenderer(render_process_id));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(TabManagerTest, AutoDiscardable) {
|
| - using content::WindowedNotificationObserver;
|
| - TabManager* tab_manager = g_browser_process->GetTabManager();
|
| -
|
| - // Disable the protection of recent tabs.
|
| - tab_manager->set_minimum_protection_time_for_tests(
|
| - base::TimeDelta::FromMinutes(0));
|
| -
|
| - // Get two tabs open.
|
| - WindowedNotificationObserver load1(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
|
| - WindowOpenDisposition::CURRENT_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open1);
|
| - load1.Wait();
|
| -
|
| - WindowedNotificationObserver load2(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
|
| - WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open2);
|
| - load2.Wait();
|
| -
|
| - // Set the auto-discardable state of the first tab to false.
|
| - auto* tsm = browser()->tab_strip_model();
|
| - ASSERT_EQ(2, tsm->count());
|
| - tab_manager->SetTabAutoDiscardableState(tsm->GetWebContentsAt(0), false);
|
| -
|
| - // Shouldn't discard the tab, since auto-discardable is deactivated.
|
| - EXPECT_FALSE(tab_manager->DiscardTabImpl());
|
| -
|
| - // Reset auto-discardable state to true.
|
| - tab_manager->SetTabAutoDiscardableState(tsm->GetWebContentsAt(0), true);
|
| -
|
| - // Now it should be able to discard the tab.
|
| - EXPECT_TRUE(tab_manager->DiscardTabImpl());
|
| - EXPECT_TRUE(tab_manager->IsTabDiscarded(tsm->GetWebContentsAt(0)));
|
| -}
|
| -
|
| -IN_PROC_BROWSER_TEST_F(TabManagerTest, PurgeBackgroundRenderer) {
|
| - TabManager* tab_manager = g_browser_process->GetTabManager();
|
| -
|
| - base::SimpleTestTickClock test_clock_;
|
| - tab_manager->set_test_tick_clock(&test_clock_);
|
| -
|
| - // Get three tabs open.
|
| - content::WindowedNotificationObserver load1(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
|
| - WindowOpenDisposition::CURRENT_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open1);
|
| - load1.Wait();
|
| -
|
| - content::WindowedNotificationObserver load2(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
|
| - WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open2);
|
| - load2.Wait();
|
| -
|
| - content::WindowedNotificationObserver load3(
|
| - content::NOTIFICATION_NAV_ENTRY_COMMITTED,
|
| - content::NotificationService::AllSources());
|
| - OpenURLParams open3(GURL(chrome::kChromeUITermsURL), content::Referrer(),
|
| - WindowOpenDisposition::NEW_FOREGROUND_TAB,
|
| - ui::PAGE_TRANSITION_TYPED, false);
|
| - browser()->OpenURL(open3);
|
| - load3.Wait();
|
| -
|
| - auto* tsm = browser()->tab_strip_model();
|
| - TabManager::WebContentsData* tab1_contents_data =
|
| - tab_manager->GetWebContentsData(tsm->GetWebContentsAt(0));
|
| - TabManager::WebContentsData* tab2_contents_data =
|
| - tab_manager->GetWebContentsData(tsm->GetWebContentsAt(1));
|
| - TabManager::WebContentsData* tab3_contents_data =
|
| - tab_manager->GetWebContentsData(tsm->GetWebContentsAt(2));
|
| -
|
| - // The time-to-purge initialized at ActiveTabChanged should be in the
|
| - // right default range.
|
| - EXPECT_GE(tab1_contents_data->time_to_purge(),
|
| - base::TimeDelta::FromMinutes(30));
|
| - EXPECT_LT(tab1_contents_data->time_to_purge(),
|
| - base::TimeDelta::FromMinutes(60));
|
| - EXPECT_GE(tab2_contents_data->time_to_purge(),
|
| - base::TimeDelta::FromMinutes(30));
|
| - EXPECT_LT(tab2_contents_data->time_to_purge(),
|
| - base::TimeDelta::FromMinutes(60));
|
| - EXPECT_GE(tab3_contents_data->time_to_purge(),
|
| - base::TimeDelta::FromMinutes(30));
|
| - EXPECT_LT(tab3_contents_data->time_to_purge(),
|
| - base::TimeDelta::FromMinutes(60));
|
| -
|
| - // To make it easy to test, configure time-to-purge here.
|
| - base::TimeDelta time_to_purge1 = base::TimeDelta::FromMinutes(30);
|
| - base::TimeDelta time_to_purge2 = base::TimeDelta::FromMinutes(40);
|
| - tab1_contents_data->set_time_to_purge(time_to_purge1);
|
| - tab2_contents_data->set_time_to_purge(time_to_purge2);
|
| - tab3_contents_data->set_time_to_purge(time_to_purge1);
|
| -
|
| - // No tabs are not purged yet.
|
| - ASSERT_FALSE(tab1_contents_data->is_purged());
|
| - ASSERT_FALSE(tab2_contents_data->is_purged());
|
| - ASSERT_FALSE(tab3_contents_data->is_purged());
|
| -
|
| - // Advance the clock for time_to_purge1.
|
| - test_clock_.Advance(time_to_purge1);
|
| - tab_manager->PurgeBackgroundedTabsIfNeeded();
|
| -
|
| - ASSERT_FALSE(tab1_contents_data->is_purged());
|
| - ASSERT_FALSE(tab2_contents_data->is_purged());
|
| - ASSERT_FALSE(tab3_contents_data->is_purged());
|
| -
|
| - // Advance the clock for 1 minutes.
|
| - test_clock_.Advance(base::TimeDelta::FromMinutes(1));
|
| - tab_manager->PurgeBackgroundedTabsIfNeeded();
|
| -
|
| - // Since tab1 is kept inactive and background for more than
|
| - // time_to_purge1, tab1 should be purged.
|
| - ASSERT_TRUE(tab1_contents_data->is_purged());
|
| - ASSERT_FALSE(tab2_contents_data->is_purged());
|
| - ASSERT_FALSE(tab3_contents_data->is_purged());
|
| -
|
| - // Advance the clock.
|
| - test_clock_.Advance(time_to_purge2 - time_to_purge1);
|
| - tab_manager->PurgeBackgroundedTabsIfNeeded();
|
| -
|
| - // Since tab2 is kept inactive and background for more than
|
| - // time_to_purge2, tab1 should be purged.
|
| - // Since tab3 is active, tab3 should not be purged.
|
| - ASSERT_TRUE(tab1_contents_data->is_purged());
|
| - ASSERT_TRUE(tab2_contents_data->is_purged());
|
| - ASSERT_FALSE(tab3_contents_data->is_purged());
|
| -
|
| - tsm->CloseAllTabs();
|
| -}
|
| -
|
| -} // namespace memory
|
| -
|
| -#endif // OS_WIN || OS_MAXOSX || OS_LINUX
|
|
|