172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui/ui_test.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/test/test_timeouts.h" 8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_value_store.h" 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/sync/signin_manager.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/new_tab_ui.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/chrome_switches.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/json_pref_store.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/url_constants.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/browser_proxy.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/tab_proxy.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/window_proxy.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_pref_service.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NewTabUITest : public UITest { 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewTabUITest() { 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch dom_automation_enabled_ = true; 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set home page to the empty string so that we can set the home page using 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // preferences. 273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen set_homepage(""); 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Setup the DEFAULT_THEME profile (has fake history entries). 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_template_user_data(UITest::ComputeTypicalUserDataSource( 313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen ProxyLauncher::DEFAULT_THEME)); 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(NewTabUITest, NTPHasThumbnails) { 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Switch to the "new tab" tab, which should be any new tab after the 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // first (the first is about:blank). 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0)); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(window.get()); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Bring up a new tab page. 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(window->RunCommand(IDC_NEW_TAB)); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<TabProxy> tab = window->GetActiveTab(); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(tab.get()); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // TopSites should return at least 3 non-filler pages. 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // 8 - 3 = max 5 filler pages. 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(WaitUntilJavaScriptCondition(tab, L"", 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch L"window.domAutomationController.send(" 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick L"document.getElementsByClassName('filler').length <= 5)", 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TestTimeouts::action_max_timeout_ms())); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Sometimes hangs: http://crbug.com/70157 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(NewTabUITest, DISABLED_NTPHasLoginName) { 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0)); 58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(window.get()); 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(window->SetStringPreference(prefs::kGoogleServicesUsername, 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick "user@gmail.com")); 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Bring up a new tab page. 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(window->RunCommand(IDC_NEW_TAB)); 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<TabProxy> tab = window->GetActiveTab(); 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(tab.get()); 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::wstring displayed_username; 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The login span should be eventually populated and have the 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // correct value. 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(WaitUntilJavaScriptCondition(tab, L"", 72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"window.domAutomationController.send(" 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"document.getElementById('login-username').innerText.length > 0)", 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen TestTimeouts::action_max_timeout_ms())); 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(tab->ExecuteAndExtractString( 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"", 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"window.domAutomationController.send(" 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"document.getElementById('login-username').innerText)", 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &displayed_username)); 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(L"user@gmail.com", displayed_username); 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Loads about:hang into two NTP tabs, ensuring we don't crash. 864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// See http://crbug.com/59859. 874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST_F(NewTabUITest, AboutHangInNTP) { 884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0)); 894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_TRUE(window.get()); 904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Bring up a new tab page. 924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_TRUE(window->RunCommand(IDC_NEW_TAB)); 934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<TabProxy> tab = window->GetActiveTab(); 944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_TRUE(tab.get()); 954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Navigate to about:hang to stall the process. 974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_TRUE(tab->NavigateToURLAsync(GURL(chrome::kAboutHangURL))); 984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Visit about:hang again in another NTP. Don't bother waiting for the 1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // NTP to load, because it's hung. 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(window->RunCommandAsync(IDC_NEW_TAB)); 1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_refptr<TabProxy> tab2 = window->GetActiveTab(); 1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_TRUE(tab2.get()); 1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ASSERT_TRUE(tab2->NavigateToURLAsync(GURL(chrome::kAboutHangURL))); 1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Allows testing NTP in process-per-tab mode. 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass NewTabUIProcessPerTabTest : public NewTabUITest { 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public: 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NewTabUIProcessPerTabTest() : NewTabUITest() {} 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected: 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual void SetUp() { 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen launch_arguments_.AppendSwitch(switches::kProcessPerTab); 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UITest::SetUp(); 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}; 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Navigates away from NTP before it commits, in process-per-tab mode. 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Ensures that we don't load the normal page in the NTP process (and thus 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// crash), as in http://crbug.com/69224. 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(NewTabUIProcessPerTabTest, NavBeforeNTPCommits) { 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0)); 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(window.get()); 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Bring up a new tab page. 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(window->RunCommand(IDC_NEW_TAB)); 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<TabProxy> tab = window->GetActiveTab(); 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(tab.get()); 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Navigate to about:hang to stall the process. 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(tab->NavigateToURLAsync(GURL(chrome::kAboutHangURL))); 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Visit a normal URL in another NTP that hasn't committed. 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(window->RunCommandAsync(IDC_NEW_TAB)); 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen scoped_refptr<TabProxy> tab2 = window->GetActiveTab(); 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(tab2.get()); 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(tab2->NavigateToURL(GURL("data:text/html,hello world"))); 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Fails about ~5% of the time on all platforms. http://crbug.com/45001 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(NewTabUITest, FLAKY_ChromeInternalLoadsNTP) { 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0)); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(window.get()); 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Go to the "new tab page" using its old url, rather than chrome://newtab. 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<TabProxy> tab = window->GetTab(0); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(tab.get()); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(tab->NavigateToURLAsync(GURL("chrome-internal:"))); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int load_time; 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(automation()->WaitForInitialNewTabUILoad(&load_time)); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ensure there are some thumbnails loaded in the page. 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int thumbnails_count = -1; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(tab->ExecuteAndExtractInt(L"", 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch L"window.domAutomationController.send(" 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch L"document.getElementsByClassName('thumbnail-container').length)", 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &thumbnails_count)); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_GT(thumbnails_count, 0); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(NewTabUITest, UpdateUserPrefsVersion) { 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // PrefService with JSON user-pref file only, no enforced or advised prefs. 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<PrefService> prefs(new TestingPrefService); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Does the migration 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewTabUI::RegisterUserPrefs(prefs.get()); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(NewTabUI::current_pref_version(), 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs->GetInteger(prefs::kNTPPrefVersion)); 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Reset the version 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs->ClearPref(prefs::kNTPPrefVersion); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, prefs->GetInteger(prefs::kNTPPrefVersion)); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool migrated = NewTabUI::UpdateUserPrefsVersion(prefs.get()); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(migrated); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(NewTabUI::current_pref_version(), 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs->GetInteger(prefs::kNTPPrefVersion)); 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch migrated = NewTabUI::UpdateUserPrefsVersion(prefs.get()); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_FALSE(migrated); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 184