15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/browser_process_platform_part_chromeos.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/memory/oom_priority_manager.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar_controller.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef InProcessBrowserTest OomPriorityManagerTest;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(OomPriorityManagerTest, OomPriorityManagerBasics) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using content::WindowedNotificationObserver;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chromeos::OomPriorityManager* oom_priority_manager =
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      g_browser_process->platform_part()->oom_priority_manager();
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(oom_priority_manager->recent_tab_discard());
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get three tabs open.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver load1(
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(open1);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load1.Wait();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver load2(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      false);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(open2);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load2.Wait();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver load3(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLParams open3(GURL(chrome::kChromeUITermsURL), content::Referrer(),
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_TYPED,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      false);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(open3);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load3.Wait();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate the current (third) tab to a different URL, so we can test
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // back/forward later.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver load4(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLParams open4(GURL(chrome::kChromeUIVersionURL), content::Referrer(),
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      false);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(open4);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load4.Wait();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate the third tab again, such that we have three navigation entries.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver load5(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OpenURLParams open5(GURL("chrome://dns"), content::Referrer(),
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      CURRENT_TAB, ui::PAGE_TRANSITION_TYPED,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      false);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(open5);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  load5.Wait();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Discard a tab.  It should kill the first tab, since it was the oldest
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and was not selected.
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(oom_priority_manager->DiscardTab());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(0));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(1));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(2));
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(oom_priority_manager->recent_tab_discard());
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run discard again, make sure it kills the second tab.
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(oom_priority_manager->DiscardTab());
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(0));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(1));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(2));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kill the third tab. It should not kill the last tab, since it is active
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tab.
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(oom_priority_manager->DiscardTab());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(0));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(1));
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(2));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kill the third tab after making second tab active.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->tab_strip_model()->ActivateTabAt(1, true);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(1));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->DiscardWebContentsAt(2);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(2));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force creation of the FindBarController.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->GetFindBarController();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Select the first tab.  It should reload.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver reload1(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SelectNumberedTab(browser(), 0);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reload1.Wait();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the FindBarController gets the right WebContents.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser()->GetFindBarController()->web_contents(),
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents());
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(0));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(1));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(2));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Select the third tab. It should reload.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver reload2(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::SelectNumberedTab(browser(), 2);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  reload2.Wait();
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(0));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(1));
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(2));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate the third tab back twice.  We used to crash here due to
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crbug.com/121373.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome::CanGoBack(browser()));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanGoForward(browser()));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver back1(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoBack(browser(), CURRENT_TAB);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  back1.Wait();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome::CanGoBack(browser()));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome::CanGoForward(browser()));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver back2(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoBack(browser(), CURRENT_TAB);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  back2.Wait();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(chrome::CanGoBack(browser()));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(chrome::CanGoForward(browser()));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
163