Home | History | Annotate | Download | only in memory
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/browser_process.h"
      6 #include "chrome/browser/browser_process_platform_part_chromeos.h"
      7 #include "chrome/browser/chromeos/memory/oom_priority_manager.h"
      8 #include "chrome/browser/ui/browser.h"
      9 #include "chrome/browser/ui/browser_commands.h"
     10 #include "chrome/browser/ui/find_bar/find_bar_controller.h"
     11 #include "chrome/browser/ui/tabs/tab_strip_model.h"
     12 #include "chrome/common/url_constants.h"
     13 #include "chrome/test/base/in_process_browser_test.h"
     14 #include "content/public/browser/notification_service.h"
     15 #include "content/public/browser/notification_types.h"
     16 #include "content/public/test/test_utils.h"
     17 #include "url/gurl.h"
     18 
     19 using content::OpenURLParams;
     20 
     21 namespace {
     22 
     23 typedef InProcessBrowserTest OomPriorityManagerTest;
     24 
     25 IN_PROC_BROWSER_TEST_F(OomPriorityManagerTest, OomPriorityManagerBasics) {
     26   using content::WindowedNotificationObserver;
     27 
     28   chromeos::OomPriorityManager* oom_priority_manager =
     29       g_browser_process->platform_part()->oom_priority_manager();
     30   EXPECT_FALSE(oom_priority_manager->recent_tab_discard());
     31 
     32   // Get three tabs open.
     33   WindowedNotificationObserver load1(
     34       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
     35       content::NotificationService::AllSources());
     36   OpenURLParams open1(GURL(chrome::kChromeUIAboutURL), content::Referrer(),
     37                       CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false);
     38   browser()->OpenURL(open1);
     39   load1.Wait();
     40 
     41   WindowedNotificationObserver load2(
     42       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
     43       content::NotificationService::AllSources());
     44   OpenURLParams open2(GURL(chrome::kChromeUICreditsURL), content::Referrer(),
     45                       NEW_FOREGROUND_TAB, content::PAGE_TRANSITION_TYPED,
     46                       false);
     47   browser()->OpenURL(open2);
     48   load2.Wait();
     49 
     50   WindowedNotificationObserver load3(
     51       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
     52       content::NotificationService::AllSources());
     53   OpenURLParams open3(GURL(chrome::kChromeUITermsURL), content::Referrer(),
     54                       NEW_FOREGROUND_TAB, content::PAGE_TRANSITION_TYPED,
     55                       false);
     56   browser()->OpenURL(open3);
     57   load3.Wait();
     58 
     59   EXPECT_EQ(3, browser()->tab_strip_model()->count());
     60 
     61   // Navigate the current (third) tab to a different URL, so we can test
     62   // back/forward later.
     63   WindowedNotificationObserver load4(
     64       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
     65       content::NotificationService::AllSources());
     66   OpenURLParams open4(GURL(chrome::kChromeUIVersionURL), content::Referrer(),
     67                       CURRENT_TAB, content::PAGE_TRANSITION_TYPED,
     68                       false);
     69   browser()->OpenURL(open4);
     70   load4.Wait();
     71 
     72   // Navigate the third tab again, such that we have three navigation entries.
     73   WindowedNotificationObserver load5(
     74       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
     75       content::NotificationService::AllSources());
     76   OpenURLParams open5(GURL("chrome://dns"), content::Referrer(),
     77                       CURRENT_TAB, content::PAGE_TRANSITION_TYPED,
     78                       false);
     79   browser()->OpenURL(open5);
     80   load5.Wait();
     81 
     82   EXPECT_EQ(3, browser()->tab_strip_model()->count());
     83 
     84   // Discard a tab.  It should kill the first tab, since it was the oldest
     85   // and was not selected.
     86   EXPECT_TRUE(oom_priority_manager->DiscardTab());
     87   EXPECT_EQ(3, browser()->tab_strip_model()->count());
     88   EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(0));
     89   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(1));
     90   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(2));
     91   EXPECT_TRUE(oom_priority_manager->recent_tab_discard());
     92 
     93   // Run discard again, make sure it kills the second tab.
     94   EXPECT_TRUE(oom_priority_manager->DiscardTab());
     95   EXPECT_EQ(3, browser()->tab_strip_model()->count());
     96   EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(0));
     97   EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(1));
     98   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(2));
     99 
    100   // Kill the third tab. It should not kill the last tab, since it is active
    101   // tab.
    102   EXPECT_FALSE(oom_priority_manager->DiscardTab());
    103   EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(0));
    104   EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(1));
    105   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(2));
    106 
    107   // Kill the third tab after making second tab active.
    108   browser()->tab_strip_model()->ActivateTabAt(1, true);
    109   EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
    110   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(1));
    111   browser()->tab_strip_model()->DiscardWebContentsAt(2);
    112   EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(2));
    113 
    114   // Force creation of the FindBarController.
    115   browser()->GetFindBarController();
    116 
    117   // Select the first tab.  It should reload.
    118   WindowedNotificationObserver reload1(
    119       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
    120       content::NotificationService::AllSources());
    121   chrome::SelectNumberedTab(browser(), 0);
    122   reload1.Wait();
    123   // Make sure the FindBarController gets the right WebContents.
    124   EXPECT_EQ(browser()->GetFindBarController()->web_contents(),
    125             browser()->tab_strip_model()->GetActiveWebContents());
    126   EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
    127   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(0));
    128   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(1));
    129   EXPECT_TRUE(browser()->tab_strip_model()->IsTabDiscarded(2));
    130 
    131   // Select the third tab. It should reload.
    132   WindowedNotificationObserver reload2(
    133       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
    134       content::NotificationService::AllSources());
    135   chrome::SelectNumberedTab(browser(), 2);
    136   reload2.Wait();
    137   EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
    138   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(0));
    139   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(1));
    140   EXPECT_FALSE(browser()->tab_strip_model()->IsTabDiscarded(2));
    141 
    142   // Navigate the third tab back twice.  We used to crash here due to
    143   // crbug.com/121373.
    144   EXPECT_TRUE(chrome::CanGoBack(browser()));
    145   EXPECT_FALSE(chrome::CanGoForward(browser()));
    146   WindowedNotificationObserver back1(
    147       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
    148       content::NotificationService::AllSources());
    149   chrome::GoBack(browser(), CURRENT_TAB);
    150   back1.Wait();
    151   EXPECT_TRUE(chrome::CanGoBack(browser()));
    152   EXPECT_TRUE(chrome::CanGoForward(browser()));
    153   WindowedNotificationObserver back2(
    154       content::NOTIFICATION_NAV_ENTRY_COMMITTED,
    155       content::NotificationService::AllSources());
    156   chrome::GoBack(browser(), CURRENT_TAB);
    157   back2.Wait();
    158   EXPECT_FALSE(chrome::CanGoBack(browser()));
    159   EXPECT_TRUE(chrome::CanGoForward(browser()));
    160 }
    161 
    162 }  // namespace
    163