Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(671)

Side by Side Diff: chrome/browser/browser_uitest.cc

Issue 5582002: Move:... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2006-2008 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 "base/base_paths.h"
6 #include "base/file_path.h"
7 #include "base/file_util.h"
8 #include "base/path_service.h"
9 #include "base/string_util.h"
10 #include "base/sys_info.h"
11 #include "base/test/test_file_util.h"
12 #include "base/values.h"
13 #include "chrome/app/chrome_command_ids.h"
14 #include "chrome/browser/platform_util.h"
15 #include "chrome/browser/ui/browser.h"
16 #include "chrome/common/chrome_switches.h"
17 #include "chrome/common/chrome_constants.h"
18 #include "chrome/common/pref_names.h"
19 #include "chrome/test/automation/browser_proxy.h"
20 #include "chrome/test/automation/tab_proxy.h"
21 #include "chrome/test/automation/window_proxy.h"
22 #include "chrome/test/ui/ui_test.h"
23 #include "gfx/native_widget_types.h"
24 #include "grit/chromium_strings.h"
25 #include "grit/generated_resources.h"
26 #include "net/base/net_util.h"
27 #include "net/test/test_server.h"
28
29 namespace {
30
31 class BrowserTest : public UITest {
32 };
33
34 class VisibleBrowserTest : public UITest {
35 protected:
36 VisibleBrowserTest() : UITest() {
37 show_window_ = true;
38 }
39 };
40
41 #if defined(OS_WIN)
42 // The browser should quit quickly if it receives a WM_ENDSESSION message.
43 TEST_F(BrowserTest, WindowsSessionEnd) {
44 #elif defined(OS_POSIX)
45 // The browser should quit gracefully and quickly if it receives a SIGTERM.
46 TEST_F(BrowserTest, PosixSessionEnd) {
47 #endif
48 FilePath test_file(test_data_directory_);
49 test_file = test_file.AppendASCII("title1.html");
50
51 NavigateToURL(net::FilePathToFileURL(test_file));
52 TerminateBrowser();
53 ASSERT_FALSE(IsBrowserRunning());
54
55 // Make sure the UMA metrics say we didn't crash.
56 scoped_ptr<DictionaryValue> local_prefs(GetLocalState());
57 bool exited_cleanly;
58 ASSERT_TRUE(local_prefs.get());
59 ASSERT_TRUE(local_prefs->GetBoolean(prefs::kStabilityExitedCleanly,
60 &exited_cleanly));
61 ASSERT_TRUE(exited_cleanly);
62
63 // And that session end was successful.
64 bool session_end_completed;
65 ASSERT_TRUE(local_prefs->GetBoolean(prefs::kStabilitySessionEndCompleted,
66 &session_end_completed));
67 ASSERT_TRUE(session_end_completed);
68
69 // Make sure session restore says we didn't crash.
70 scoped_ptr<DictionaryValue> profile_prefs(GetDefaultProfilePreferences());
71 ASSERT_TRUE(profile_prefs.get());
72 ASSERT_TRUE(profile_prefs->GetBoolean(prefs::kSessionExitedCleanly,
73 &exited_cleanly));
74 ASSERT_TRUE(exited_cleanly);
75 }
76
77 // Test that scripts can fork a new renderer process for a tab in a particular
78 // case (which matches following a link in Gmail). The script must open a new
79 // tab, set its window.opener to null, and redirect it to a cross-site URL.
80 // (Bug 1115708)
81 // This test can only run if V8 is in use, and not KJS, because KJS will not
82 // set window.opener to null properly.
83 #ifdef CHROME_V8
84 TEST_F(BrowserTest, NullOpenerRedirectForksProcess) {
85 // This test only works in multi-process mode
86 if (in_process_renderer())
87 return;
88
89 net::TestServer test_server(net::TestServer::TYPE_HTTP,
90 FilePath(FILE_PATH_LITERAL("chrome/test/data")));
91 ASSERT_TRUE(test_server.Start());
92
93 FilePath test_file(test_data_directory_);
94 scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
95 ASSERT_TRUE(window.get());
96 scoped_refptr<TabProxy> tab(window->GetActiveTab());
97 ASSERT_TRUE(tab.get());
98
99 // Start with a file:// url
100 test_file = test_file.AppendASCII("title2.html");
101 tab->NavigateToURL(net::FilePathToFileURL(test_file));
102 int orig_tab_count = -1;
103 ASSERT_TRUE(window->GetTabCount(&orig_tab_count));
104 int orig_process_count = GetBrowserProcessCount();
105 ASSERT_GE(orig_process_count, 1);
106
107 // Use JavaScript URL to "fork" a new tab, just like Gmail. (Open tab to a
108 // blank page, set its opener to null, and redirect it cross-site.)
109 std::wstring url_prefix(L"javascript:(function(){w=window.open();");
110 GURL fork_url(url_prefix +
111 L"w.opener=null;w.document.location=\"http://localhost:1337\";})()");
112
113 // Make sure that a new tab has been created and that we have a new renderer
114 // process for it.
115 ASSERT_TRUE(tab->NavigateToURLAsync(fork_url));
116 PlatformThread::Sleep(sleep_timeout_ms());
117 ASSERT_EQ(orig_process_count + 1, GetBrowserProcessCount());
118 int new_tab_count = -1;
119 ASSERT_TRUE(window->GetTabCount(&new_tab_count));
120 ASSERT_EQ(orig_tab_count + 1, new_tab_count);
121 }
122 #endif // CHROME_V8
123
124 // This test fails on ChromeOS (it has never been known to work on it).
125 // Currently flaky on Windows - it has crashed a couple of times.
126 // http://crbug.com/32799
127 #if defined(OS_CHROMEOS)
128 #define MAYBE_OtherRedirectsDontForkProcess DISABLED_OtherRedirectsDontForkProce ss
129 #else
130 #define MAYBE_OtherRedirectsDontForkProcess FLAKY_OtherRedirectsDontForkProcess
131 #endif
132
133 // Tests that non-Gmail-like script redirects (i.e., non-null window.opener) or
134 // a same-page-redirect) will not fork a new process.
135 TEST_F(BrowserTest, MAYBE_OtherRedirectsDontForkProcess) {
136 // This test only works in multi-process mode
137 if (in_process_renderer())
138 return;
139
140 net::TestServer test_server(net::TestServer::TYPE_HTTP,
141 FilePath(FILE_PATH_LITERAL("chrome/test/data")));
142 ASSERT_TRUE(test_server.Start());
143
144 FilePath test_file(test_data_directory_);
145 scoped_refptr<BrowserProxy> window(automation()->GetBrowserWindow(0));
146 ASSERT_TRUE(window.get());
147 scoped_refptr<TabProxy> tab(window->GetActiveTab());
148 ASSERT_TRUE(tab.get());
149
150 // Start with a file:// url
151 test_file = test_file.AppendASCII("title2.html");
152 ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS,
153 tab->NavigateToURL(net::FilePathToFileURL(test_file)));
154 int orig_tab_count = -1;
155 ASSERT_TRUE(window->GetTabCount(&orig_tab_count));
156 int orig_process_count = GetBrowserProcessCount();
157 ASSERT_GE(orig_process_count, 1);
158
159 // Use JavaScript URL to almost fork a new tab, but not quite. (Leave the
160 // opener non-null.) Should not fork a process.
161 std::string url_str = "javascript:(function(){w=window.open(); ";
162 url_str += "w.document.location=\"";
163 url_str += test_server.GetURL("").spec();
164 url_str += "\";})()";
165 GURL dont_fork_url(url_str);
166
167 // Make sure that a new tab but not new process has been created.
168 ASSERT_TRUE(tab->NavigateToURLAsync(dont_fork_url));
169 PlatformThread::Sleep(sleep_timeout_ms());
170 ASSERT_EQ(orig_process_count, GetBrowserProcessCount());
171 int new_tab_count = -1;
172 ASSERT_TRUE(window->GetTabCount(&new_tab_count));
173 ASSERT_EQ(orig_tab_count + 1, new_tab_count);
174
175 // Same thing if the current tab tries to redirect itself.
176 url_str = "javascript:(function(){w=window.open(); ";
177 url_str += "document.location=\"";
178 url_str += test_server.GetURL("").spec();
179 url_str += "\";})()";
180 GURL dont_fork_url2(url_str);
181
182 // Make sure that no new process has been created.
183 ASSERT_TRUE(tab->NavigateToURLAsync(dont_fork_url2));
184 PlatformThread::Sleep(sleep_timeout_ms());
185 ASSERT_EQ(orig_process_count, GetBrowserProcessCount());
186 }
187
188 TEST_F(VisibleBrowserTest, WindowOpenClose) {
189 FilePath test_file(test_data_directory_);
190 test_file = test_file.AppendASCII("window.close.html");
191
192 NavigateToURLBlockUntilNavigationsComplete(
193 net::FilePathToFileURL(test_file), 2);
194 EXPECT_EQ(L"Title Of Awesomeness", GetActiveTabTitle());
195 }
196
197 class ShowModalDialogTest : public UITest {
198 public:
199 ShowModalDialogTest() {
200 launch_arguments_.AppendSwitch(switches::kDisablePopupBlocking);
201 }
202 };
203
204 // Flakiness returned. Re-opened crbug.com/17806
205 TEST_F(ShowModalDialogTest, FLAKY_BasicTest) {
206 FilePath test_file(test_data_directory_);
207 test_file = test_file.AppendASCII("showmodaldialog.html");
208
209 // This navigation should show a modal dialog that will be immediately
210 // closed, but the fact that it was shown should be recorded.
211 NavigateToURL(net::FilePathToFileURL(test_file));
212
213 // At this point the modal dialog should not be showing.
214 int window_count = 0;
215 EXPECT_TRUE(automation()->GetBrowserWindowCount(&window_count));
216 EXPECT_EQ(1, window_count);
217
218 // Verify that we set a mark on successful dialog show.
219 scoped_refptr<BrowserProxy> browser = automation()->GetBrowserWindow(0);
220 ASSERT_TRUE(browser.get());
221 scoped_refptr<TabProxy> tab = browser->GetActiveTab();
222 ASSERT_TRUE(tab.get());
223 std::wstring title;
224 ASSERT_TRUE(tab->GetTabTitle(&title));
225 ASSERT_EQ(L"SUCCESS", title);
226 }
227
228 class SecurityTest : public UITest {
229 };
230
231 TEST_F(SecurityTest, DisallowFileUrlUniversalAccessTest) {
232 scoped_refptr<TabProxy> tab(GetActiveTab());
233 ASSERT_TRUE(tab.get());
234
235 FilePath test_file(test_data_directory_);
236 test_file = test_file.AppendASCII("fileurl_universalaccess.html");
237
238 GURL url = net::FilePathToFileURL(test_file);
239 ASSERT_TRUE(tab->NavigateToURL(url));
240
241 std::string value = WaitUntilCookieNonEmpty(tab.get(), url,
242 "status", action_max_timeout_ms());
243 ASSERT_STREQ("Disallowed", value.c_str());
244 }
245
246 #if !defined(OS_MACOSX)
247 class KioskModeTest : public UITest {
248 public:
249 KioskModeTest() {
250 launch_arguments_.AppendSwitch(switches::kKioskMode);
251 }
252 };
253
254 TEST_F(KioskModeTest, EnableKioskModeTest) {
255 // Load a local file.
256 FilePath test_file(test_data_directory_);
257 test_file = test_file.AppendASCII("title1.html");
258
259 // Verify that the window is present.
260 scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
261 ASSERT_TRUE(browser.get());
262
263 // Check if browser is in fullscreen mode.
264 bool is_visible;
265 ASSERT_TRUE(browser->IsFullscreen(&is_visible));
266 EXPECT_TRUE(is_visible);
267 ASSERT_TRUE(browser->IsFullscreenBubbleVisible(&is_visible));
268 EXPECT_FALSE(is_visible);
269 }
270 #endif // !defined(OS_MACOSX)
271
272 #if defined(OS_WIN)
273 // This test verifies that Chrome can be launched with a user-data-dir path
274 // which contains non ASCII characters.
275 class LaunchBrowserWithNonAsciiUserDatadir : public UITest {
276 public:
277 void SetUp() {
278 PathService::Get(base::DIR_TEMP, &tmp_profile_);
279 tmp_profile_ = tmp_profile_.AppendASCII("tmp_profile");
280 tmp_profile_ = tmp_profile_.Append(L"Test Chrome G�raldine");
281
282 // Create a fresh, empty copy of this directory.
283 file_util::Delete(tmp_profile_, true);
284 file_util::CreateDirectory(tmp_profile_);
285
286 launch_arguments_.AppendSwitchPath(switches::kUserDataDir, tmp_profile_);
287 }
288
289 bool LaunchAppWithProfile() {
290 UITest::SetUp();
291 return true;
292 }
293
294 void TearDown() {
295 UITest::TearDown();
296 EXPECT_TRUE(file_util::DieFileDie(tmp_profile_, true));
297 }
298
299 public:
300 FilePath tmp_profile_;
301 };
302
303 TEST_F(LaunchBrowserWithNonAsciiUserDatadir, TestNonAsciiUserDataDir) {
304 ASSERT_TRUE(LaunchAppWithProfile());
305 // Verify that the window is present.
306 scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
307 ASSERT_TRUE(browser.get());
308 }
309 #endif // defined(OS_WIN)
310
311 class AppModeTest : public UITest {
312 public:
313 AppModeTest() {
314 // Load a local file.
315 FilePath test_file(test_data_directory_);
316 test_file = test_file.AppendASCII("title1.html");
317 GURL test_file_url(net::FilePathToFileURL(test_file));
318
319 launch_arguments_.AppendSwitchASCII(switches::kApp, test_file_url.spec());
320 }
321 };
322
323 TEST_F(AppModeTest, EnableAppModeTest) {
324 // Test that an application browser window loads correctly.
325
326 // Verify that the window is present.
327 scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
328 ASSERT_TRUE(browser.get());
329
330 // Verify the browser is an application.
331 Browser::Type type;
332 ASSERT_TRUE(browser->GetType(&type));
333 EXPECT_EQ(Browser::TYPE_APP, type);
334 }
335
336 // Tests to ensure that the browser continues running in the background after
337 // the last window closes.
338 class RunInBackgroundTest : public UITest {
339 public:
340 RunInBackgroundTest() {
341 launch_arguments_.AppendSwitch(switches::kKeepAliveForTest);
342 }
343 };
344
345 TEST_F(RunInBackgroundTest, RunInBackgroundBasicTest) {
346 // Close the browser window, then open a new one - the browser should keep
347 // running.
348 scoped_refptr<BrowserProxy> browser(automation()->GetBrowserWindow(0));
349 ASSERT_TRUE(browser.get());
350 int window_count;
351 ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
352 EXPECT_EQ(1, window_count);
353 ASSERT_TRUE(browser->RunCommand(IDC_CLOSE_WINDOW));
354 ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
355 EXPECT_EQ(0, window_count);
356 ASSERT_TRUE(IsBrowserRunning());
357 ASSERT_TRUE(automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, true));
358 ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
359 EXPECT_EQ(1, window_count);
360 }
361
362 // Tests to ensure that the browser continues running in the background after
363 // the last window closes.
364 class NoStartupWindowTest : public UITest {
365 public:
366 NoStartupWindowTest() {
367 launch_arguments_.AppendSwitch(switches::kNoStartupWindow);
368 launch_arguments_.AppendSwitch(switches::kKeepAliveForTest);
369 }
370 };
371
372 TEST_F(NoStartupWindowTest, NoStartupWindowBasicTest) {
373 // No browser window should be started by default.
374 int window_count;
375 ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
376 EXPECT_EQ(0, window_count);
377
378 // Starting a browser window should work just fine.
379 ASSERT_TRUE(IsBrowserRunning());
380 ASSERT_TRUE(automation()->OpenNewBrowserWindow(Browser::TYPE_NORMAL, true));
381 ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
382 EXPECT_EQ(1, window_count);
383 }
384
385 } // namespace
OLDNEW
« no previous file with comments | « chrome/browser/browser_focus_uitest.cc ('k') | chrome/browser/chromeos/metrics_cros_settings_provider.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698