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
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/base_paths.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/path_service.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/sys_info.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/test/test_file_util.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/test/test_timeouts.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/platform_util.h"
164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_constants.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/browser_proxy.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/tab_proxy.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/automation/window_proxy.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui/ui_test.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_util.h"
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h"
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/native_widget_types.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserTest : public UITest {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass VisibleBrowserTest : public UITest {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  VisibleBrowserTest() : UITest() {
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    show_window_ = true;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The browser should quit quickly if it receives a WM_ENDSESSION message.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(BrowserTest, WindowsSessionEnd) {
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_POSIX)
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The browser should quit gracefully and quickly if it receives a SIGTERM.
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(BrowserTest, PosixSessionEnd) {
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file(test_data_directory_);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_file = test_file.AppendASCII("title1.html");
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(net::FilePathToFileURL(test_file));
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TerminateBrowser();
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(IsBrowserRunning());
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure the UMA metrics say we didn't crash.
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<DictionaryValue> local_prefs(GetLocalState());
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool exited_cleanly;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(local_prefs.get());
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(local_prefs->GetBoolean(prefs::kStabilityExitedCleanly,
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      &exited_cleanly));
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(exited_cleanly);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // And that session end was successful.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool session_end_completed;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(local_prefs->GetBoolean(prefs::kStabilitySessionEndCompleted,
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      &session_end_completed));
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(session_end_completed);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure session restore says we didn't crash.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<DictionaryValue> profile_prefs(GetDefaultProfilePreferences());
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(profile_prefs.get());
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(profile_prefs->GetBoolean(prefs::kSessionExitedCleanly,
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        &exited_cleanly));
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(exited_cleanly);
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test that scripts can fork a new renderer process for a tab in a particular
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// case (which matches following a link in Gmail).  The script must open a new
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// tab, set its window.opener to null, and redirect it to a cross-site URL.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (Bug 1115708)
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This test can only run if V8 is in use, and not KJS, because KJS will not
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// set window.opener to null properly.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef CHROME_V8
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(BrowserTest, NullOpenerRedirectForksProcess) {
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This test only works in multi-process mode
873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (ProxyLauncher::in_process_renderer())
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP,
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              FilePath(FILE_PATH_LITERAL("chrome/test/data")));
923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file(test_data_directory_);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window.get());
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab(window->GetActiveTab());
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Start with a file:// url
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_file = test_file.AppendASCII("title2.html");
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  tab->NavigateToURL(net::FilePathToFileURL(test_file));
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int orig_tab_count = -1;
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetTabCount(&orig_tab_count));
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int orig_process_count = 0;
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(GetBrowserProcessCount(&orig_process_count));
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_GE(orig_process_count, 1);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Use JavaScript URL to "fork" a new tab, just like Gmail.  (Open tab to a
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // blank page, set its opener to null, and redirect it cross-site.)
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring url_prefix(L"javascript:(function(){w=window.open();");
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL fork_url(url_prefix +
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"w.opener=null;w.document.location=\"http://localhost:1337\";})()");
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure that a new tab has been created and that we have a new renderer
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // process for it.
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->NavigateToURLAsync(fork_url));
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PlatformThread::Sleep(TestTimeouts::action_timeout_ms());
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int process_count = 0;
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(GetBrowserProcessCount(&process_count));
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(orig_process_count + 1, process_count);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int new_tab_count = -1;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetTabCount(&new_tab_count));
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(orig_tab_count + 1, new_tab_count);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_V8
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This test fails on ChromeOS (it has never been known to work on it).
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Currently flaky on Windows - it has crashed a couple of times.
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://crbug.com/32799
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_CHROMEOS)
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_OtherRedirectsDontForkProcess DISABLED_OtherRedirectsDontForkProcess
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_OtherRedirectsDontForkProcess FLAKY_OtherRedirectsDontForkProcess
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that non-Gmail-like script redirects (i.e., non-null window.opener) or
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// a same-page-redirect) will not fork a new process.
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(BrowserTest, MAYBE_OtherRedirectsDontForkProcess) {
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This test only works in multi-process mode
1413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (ProxyLauncher::in_process_renderer())
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTP,
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                              FilePath(FILE_PATH_LITERAL("chrome/test/data")));
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file(test_data_directory_);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window.get());
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab(window->GetActiveTab());
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Start with a file:// url
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_file = test_file.AppendASCII("title2.html");
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS,
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            tab->NavigateToURL(net::FilePathToFileURL(test_file)));
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int orig_tab_count = -1;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetTabCount(&orig_tab_count));
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int orig_process_count = 0;
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(GetBrowserProcessCount(&orig_process_count));
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_GE(orig_process_count, 1);
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Use JavaScript URL to almost fork a new tab, but not quite.  (Leave the
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // opener non-null.)  Should not fork a process.
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string url_str = "javascript:(function(){w=window.open(); ";
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url_str += "w.document.location=\"";
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url_str += test_server.GetURL("").spec();
169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url_str += "\";})()";
170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL dont_fork_url(url_str);
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure that a new tab but not new process has been created.
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->NavigateToURLAsync(dont_fork_url));
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::PlatformThread::Sleep(TestTimeouts::action_timeout_ms());
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int process_count = 0;
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(GetBrowserProcessCount(&process_count));
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(orig_process_count, process_count);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int new_tab_count = -1;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(window->GetTabCount(&new_tab_count));
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(orig_tab_count + 1, new_tab_count);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Same thing if the current tab tries to redirect itself.
183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url_str = "javascript:(function(){w=window.open(); ";
184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url_str += "document.location=\"";
185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url_str += test_server.GetURL("").spec();
186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  url_str += "\";})()";
187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL dont_fork_url2(url_str);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure that no new process has been created.
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->NavigateToURLAsync(dont_fork_url2));
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::PlatformThread::Sleep(TestTimeouts::action_timeout_ms());
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(GetBrowserProcessCount(&process_count));
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(orig_process_count, process_count);
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(VisibleBrowserTest, WindowOpenClose) {
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file(test_data_directory_);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_file = test_file.AppendASCII("window.close.html");
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURLBlockUntilNavigationsComplete(
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      net::FilePathToFileURL(test_file), 2);
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(L"Title Of Awesomeness", GetActiveTabTitle());
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ShowModalDialogTest : public UITest {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShowModalDialogTest() {
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    launch_arguments_.AppendSwitch(switches::kDisablePopupBlocking);
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Flakiness returned. Re-opened crbug.com/17806
213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// TODO(estade): remove flaky label if prospective fix works.
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(ShowModalDialogTest, FLAKY_BasicTest) {
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file(test_data_directory_);
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_file = test_file.AppendASCII("showmodaldialog.html");
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This navigation should show a modal dialog that will be immediately
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // closed, but the fact that it was shown should be recorded.
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigateToURL(net::FilePathToFileURL(test_file));
221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_TRUE(automation()->WaitForWindowCountToBecome(1));
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify that we set a mark on successful dialog show.
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser = automation()->GetBrowserWindow(0);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab = browser->GetActiveTab();
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring title;
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->GetTabTitle(&title));
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(L"SUCCESS", title);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SecurityTest : public UITest {
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(SecurityTest, DisallowFileUrlUniversalAccessTest) {
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<TabProxy> tab(GetActiveTab());
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab.get());
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file(test_data_directory_);
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_file = test_file.AppendASCII("fileurl_universalaccess.html");
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url = net::FilePathToFileURL(test_file);
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(tab->NavigateToURL(url));
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string value = WaitUntilCookieNonEmpty(tab.get(), url,
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        "status", TestTimeouts::action_max_timeout_ms());
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_STREQ("Disallowed", value.c_str());
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OS_MACOSX)
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass KioskModeTest : public UITest {
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  KioskModeTest() {
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    launch_arguments_.AppendSwitch(switches::kKioskMode);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(KioskModeTest, EnableKioskModeTest) {
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Load a local file.
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_file(test_data_directory_);
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  test_file = test_file.AppendASCII("title1.html");
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify that the window is present.
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check if browser is in fullscreen mode.
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool is_visible;
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->IsFullscreen(&is_visible));
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(is_visible);
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->IsFullscreenBubbleVisible(&is_visible));
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(is_visible);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !defined(OS_MACOSX)
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This test verifies that Chrome can be launched with a user-data-dir path
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// which contains non ASCII characters.
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass LaunchBrowserWithNonAsciiUserDatadir : public UITest {
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetUp() {
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    FilePath tmp_profile = temp_dir_.path().AppendASCII("tmp_profile");
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    tmp_profile = tmp_profile.Append(L"Test Chrome G�raldine");
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_TRUE(file_util::CreateDirectory(tmp_profile));
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    launch_arguments_.AppendSwitchPath(switches::kUserDataDir, tmp_profile);
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool LaunchAppWithProfile() {
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UITest::SetUp();
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpublic:
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ScopedTempDir temp_dir_;
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(LaunchBrowserWithNonAsciiUserDatadir, TestNonAsciiUserDataDir) {
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LaunchAppWithProfile());
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify that the window is present.
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // defined(OS_WIN)
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AppModeTest : public UITest {
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModeTest() {
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Load a local file.
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FilePath test_file(test_data_directory_);
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    test_file = test_file.AppendASCII("title1.html");
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL test_file_url(net::FilePathToFileURL(test_file));
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    launch_arguments_.AppendSwitchASCII(switches::kApp, test_file_url.spec());
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(AppModeTest, EnableAppModeTest) {
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test that an application browser window loads correctly.
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify that the window is present.
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify the browser is an application.
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser::Type type;
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->GetType(&type));
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(Browser::TYPE_APP, type);
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests to ensure that the browser continues running in the background after
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the last window closes.
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RunInBackgroundTest : public UITest {
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RunInBackgroundTest() {
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    launch_arguments_.AppendSwitch(switches::kKeepAliveForTest);
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(RunInBackgroundTest, RunInBackgroundBasicTest) {
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the browser window, then open a new one - the browser should keep
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // running.
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser.get());
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int window_count;
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, window_count);
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(browser->RunCommand(IDC_CLOSE_WINDOW));
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, window_count);
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(IsBrowserRunning());
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, true));
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, window_count);
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Tests to ensure that the browser continues running in the background after
3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// the last window closes.
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass NoStartupWindowTest : public UITest {
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NoStartupWindowTest() {
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    launch_arguments_.AppendSwitch(switches::kNoStartupWindow);
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    launch_arguments_.AppendSwitch(switches::kKeepAliveForTest);
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(NoStartupWindowTest, NoStartupWindowBasicTest) {
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // No browser window should be started by default.
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int window_count;
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(0, window_count);
3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Starting a browser window should work just fine.
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(IsBrowserRunning());
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, true));
3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
3803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(1, window_count);
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
384