Home | History | Annotate | Download | only in webui
      1 // Copyright (c) 2011 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/test/ui/ui_test.h"
      6 
      7 #include "base/test/test_timeouts.h"
      8 #include "chrome/app/chrome_command_ids.h"
      9 #include "chrome/browser/prefs/pref_value_store.h"
     10 #include "chrome/browser/sync/signin_manager.h"
     11 #include "chrome/browser/ui/webui/new_tab_ui.h"
     12 #include "chrome/common/chrome_switches.h"
     13 #include "chrome/common/json_pref_store.h"
     14 #include "chrome/common/pref_names.h"
     15 #include "chrome/common/url_constants.h"
     16 #include "chrome/test/automation/browser_proxy.h"
     17 #include "chrome/test/automation/tab_proxy.h"
     18 #include "chrome/test/automation/window_proxy.h"
     19 #include "chrome/test/testing_pref_service.h"
     20 
     21 class NewTabUITest : public UITest {
     22  public:
     23   NewTabUITest() {
     24     dom_automation_enabled_ = true;
     25     // Set home page to the empty string so that we can set the home page using
     26     // preferences.
     27     set_homepage("");
     28 
     29     // Setup the DEFAULT_THEME profile (has fake history entries).
     30     set_template_user_data(UITest::ComputeTypicalUserDataSource(
     31         ProxyLauncher::DEFAULT_THEME));
     32   }
     33 };
     34 
     35 TEST_F(NewTabUITest, NTPHasThumbnails) {
     36   // Switch to the "new tab" tab, which should be any new tab after the
     37   // first (the first is about:blank).
     38   scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
     39   ASSERT_TRUE(window.get());
     40 
     41   // Bring up a new tab page.
     42   ASSERT_TRUE(window->RunCommand(IDC_NEW_TAB));
     43 
     44   scoped_refptr<TabProxy> tab = window->GetActiveTab();
     45   ASSERT_TRUE(tab.get());
     46 
     47   // TopSites should return at least 3 non-filler pages.
     48   // 8 - 3 = max 5 filler pages.
     49   ASSERT_TRUE(WaitUntilJavaScriptCondition(tab, L"",
     50       L"window.domAutomationController.send("
     51       L"document.getElementsByClassName('filler').length <= 5)",
     52       TestTimeouts::action_max_timeout_ms()));
     53 }
     54 
     55 // Sometimes hangs: http://crbug.com/70157
     56 TEST_F(NewTabUITest, DISABLED_NTPHasLoginName) {
     57   scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
     58   ASSERT_TRUE(window.get());
     59 
     60   ASSERT_TRUE(window->SetStringPreference(prefs::kGoogleServicesUsername,
     61                                           "user (at) gmail.com"));
     62   // Bring up a new tab page.
     63   ASSERT_TRUE(window->RunCommand(IDC_NEW_TAB));
     64 
     65   scoped_refptr<TabProxy> tab = window->GetActiveTab();
     66   ASSERT_TRUE(tab.get());
     67 
     68   std::wstring displayed_username;
     69   // The login span should be eventually populated and have the
     70   // correct value.
     71   ASSERT_TRUE(WaitUntilJavaScriptCondition(tab, L"",
     72       L"window.domAutomationController.send("
     73       L"document.getElementById('login-username').innerText.length > 0)",
     74       TestTimeouts::action_max_timeout_ms()));
     75 
     76   ASSERT_TRUE(tab->ExecuteAndExtractString(
     77       L"",
     78       L"window.domAutomationController.send("
     79       L"document.getElementById('login-username').innerText)",
     80       &displayed_username));
     81 
     82   EXPECT_EQ(L"user (at) gmail.com", displayed_username);
     83 }
     84 
     85 // Loads about:hang into two NTP tabs, ensuring we don't crash.
     86 // See http://crbug.com/59859.
     87 TEST_F(NewTabUITest, AboutHangInNTP) {
     88   scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
     89   ASSERT_TRUE(window.get());
     90 
     91   // Bring up a new tab page.
     92   ASSERT_TRUE(window->RunCommand(IDC_NEW_TAB));
     93   scoped_refptr<TabProxy> tab = window->GetActiveTab();
     94   ASSERT_TRUE(tab.get());
     95 
     96   // Navigate to about:hang to stall the process.
     97   ASSERT_TRUE(tab->NavigateToURLAsync(GURL(chrome::kAboutHangURL)));
     98 
     99   // Visit about:hang again in another NTP.  Don't bother waiting for the
    100   // NTP to load, because it's hung.
    101   ASSERT_TRUE(window->RunCommandAsync(IDC_NEW_TAB));
    102   scoped_refptr<TabProxy> tab2 = window->GetActiveTab();
    103   ASSERT_TRUE(tab2.get());
    104   ASSERT_TRUE(tab2->NavigateToURLAsync(GURL(chrome::kAboutHangURL)));
    105 }
    106 
    107 // Allows testing NTP in process-per-tab mode.
    108 class NewTabUIProcessPerTabTest : public NewTabUITest {
    109  public:
    110   NewTabUIProcessPerTabTest() : NewTabUITest() {}
    111 
    112  protected:
    113   virtual void SetUp() {
    114     launch_arguments_.AppendSwitch(switches::kProcessPerTab);
    115     UITest::SetUp();
    116   }
    117 };
    118 
    119 // Navigates away from NTP before it commits, in process-per-tab mode.
    120 // Ensures that we don't load the normal page in the NTP process (and thus
    121 // crash), as in http://crbug.com/69224.
    122 TEST_F(NewTabUIProcessPerTabTest, NavBeforeNTPCommits) {
    123   scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
    124   ASSERT_TRUE(window.get());
    125 
    126   // Bring up a new tab page.
    127   ASSERT_TRUE(window->RunCommand(IDC_NEW_TAB));
    128   scoped_refptr<TabProxy> tab = window->GetActiveTab();
    129   ASSERT_TRUE(tab.get());
    130 
    131   // Navigate to about:hang to stall the process.
    132   ASSERT_TRUE(tab->NavigateToURLAsync(GURL(chrome::kAboutHangURL)));
    133 
    134   // Visit a normal URL in another NTP that hasn't committed.
    135   ASSERT_TRUE(window->RunCommandAsync(IDC_NEW_TAB));
    136   scoped_refptr<TabProxy> tab2 = window->GetActiveTab();
    137   ASSERT_TRUE(tab2.get());
    138   ASSERT_TRUE(tab2->NavigateToURL(GURL("data:text/html,hello world")));
    139 }
    140 
    141 // Fails about ~5% of the time on all platforms. http://crbug.com/45001
    142 TEST_F(NewTabUITest, FLAKY_ChromeInternalLoadsNTP) {
    143   scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
    144   ASSERT_TRUE(window.get());
    145 
    146   // Go to the "new tab page" using its old url, rather than chrome://newtab.
    147   scoped_refptr<TabProxy> tab = window->GetTab(0);
    148   ASSERT_TRUE(tab.get());
    149   ASSERT_TRUE(tab->NavigateToURLAsync(GURL("chrome-internal:")));
    150   int load_time;
    151   ASSERT_TRUE(automation()->WaitForInitialNewTabUILoad(&load_time));
    152 
    153   // Ensure there are some thumbnails loaded in the page.
    154   int thumbnails_count = -1;
    155   ASSERT_TRUE(tab->ExecuteAndExtractInt(L"",
    156       L"window.domAutomationController.send("
    157       L"document.getElementsByClassName('thumbnail-container').length)",
    158       &thumbnails_count));
    159   EXPECT_GT(thumbnails_count, 0);
    160 }
    161 
    162 TEST_F(NewTabUITest, UpdateUserPrefsVersion) {
    163   // PrefService with JSON user-pref file only, no enforced or advised prefs.
    164   scoped_ptr<PrefService> prefs(new TestingPrefService);
    165 
    166   // Does the migration
    167   NewTabUI::RegisterUserPrefs(prefs.get());
    168 
    169   ASSERT_EQ(NewTabUI::current_pref_version(),
    170             prefs->GetInteger(prefs::kNTPPrefVersion));
    171 
    172   // Reset the version
    173   prefs->ClearPref(prefs::kNTPPrefVersion);
    174   ASSERT_EQ(0, prefs->GetInteger(prefs::kNTPPrefVersion));
    175 
    176   bool migrated = NewTabUI::UpdateUserPrefsVersion(prefs.get());
    177   ASSERT_TRUE(migrated);
    178   ASSERT_EQ(NewTabUI::current_pref_version(),
    179             prefs->GetInteger(prefs::kNTPPrefVersion));
    180 
    181   migrated = NewTabUI::UpdateUserPrefsVersion(prefs.get());
    182   ASSERT_FALSE(migrated);
    183 }
    184