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