OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if defined(OS_POSIX) | 5 #if defined(OS_POSIX) |
6 #include <signal.h> | 6 #include <signal.h> |
7 #endif | 7 #endif |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 | 106 |
107 const std::string CLOSE_TAB_WHEN_OTHER_TAB_HAS_LISTENER = | 107 const std::string CLOSE_TAB_WHEN_OTHER_TAB_HAS_LISTENER = |
108 "<html><head><title>only_one_unload</title></head>" | 108 "<html><head><title>only_one_unload</title></head>" |
109 "<body onclick=\"window.open('data:text/html," | 109 "<body onclick=\"window.open('data:text/html," |
110 "<html><head><title>popup</title></head></body>')\" " | 110 "<html><head><title>popup</title></head></body>')\" " |
111 "onbeforeunload='return;'>" | 111 "onbeforeunload='return;'>" |
112 "</body></html>"; | 112 "</body></html>"; |
113 | 113 |
114 class UnloadTest : public InProcessBrowserTest { | 114 class UnloadTest : public InProcessBrowserTest { |
115 public: | 115 public: |
116 void SetUpCommandLine(CommandLine* command_line) override { | 116 void SetUpCommandLine(base::CommandLine* command_line) override { |
117 const testing::TestInfo* const test_info = | 117 const testing::TestInfo* const test_info = |
118 testing::UnitTest::GetInstance()->current_test_info(); | 118 testing::UnitTest::GetInstance()->current_test_info(); |
119 if (strcmp(test_info->name(), | 119 if (strcmp(test_info->name(), |
120 "BrowserCloseTabWhenOtherTabHasListener") == 0) { | 120 "BrowserCloseTabWhenOtherTabHasListener") == 0) { |
121 command_line->AppendSwitch(switches::kDisablePopupBlocking); | 121 command_line->AppendSwitch(switches::kDisablePopupBlocking); |
122 } else if (strcmp(test_info->name(), "BrowserTerminateBeforeUnload") == 0) { | 122 } else if (strcmp(test_info->name(), "BrowserTerminateBeforeUnload") == 0) { |
123 #if defined(OS_POSIX) | 123 #if defined(OS_POSIX) |
124 DisableSIGTERMHandling(); | 124 DisableSIGTERMHandling(); |
125 #endif | 125 #endif |
126 } | 126 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 } | 189 } |
190 }; | 190 }; |
191 | 191 |
192 // Navigate to a page with an infinite unload handler. | 192 // Navigate to a page with an infinite unload handler. |
193 // Then two async crosssite requests to ensure | 193 // Then two async crosssite requests to ensure |
194 // we don't get confused and think we're closing the tab. | 194 // we don't get confused and think we're closing the tab. |
195 // | 195 // |
196 // This test is flaky on the valgrind UI bots. http://crbug.com/39057 | 196 // This test is flaky on the valgrind UI bots. http://crbug.com/39057 |
197 IN_PROC_BROWSER_TEST_F(UnloadTest, CrossSiteInfiniteUnloadAsync) { | 197 IN_PROC_BROWSER_TEST_F(UnloadTest, CrossSiteInfiniteUnloadAsync) { |
198 // Tests makes no sense in single-process mode since the renderer is hung. | 198 // Tests makes no sense in single-process mode since the renderer is hung. |
199 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 199 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 200 switches::kSingleProcess)) |
200 return; | 201 return; |
201 | 202 |
202 NavigateToDataURL(INFINITE_UNLOAD_HTML, "infiniteunload"); | 203 NavigateToDataURL(INFINITE_UNLOAD_HTML, "infiniteunload"); |
203 // Must navigate to a non-data URL to trigger cross-site codepath. | 204 // Must navigate to a non-data URL to trigger cross-site codepath. |
204 NavigateToNolistenersFileTwiceAsync(); | 205 NavigateToNolistenersFileTwiceAsync(); |
205 } | 206 } |
206 | 207 |
207 // Navigate to a page with an infinite unload handler. | 208 // Navigate to a page with an infinite unload handler. |
208 // Then two sync crosssite requests to ensure | 209 // Then two sync crosssite requests to ensure |
209 // we correctly nav to each one. | 210 // we correctly nav to each one. |
210 IN_PROC_BROWSER_TEST_F(UnloadTest, CrossSiteInfiniteUnloadSync) { | 211 IN_PROC_BROWSER_TEST_F(UnloadTest, CrossSiteInfiniteUnloadSync) { |
211 // Tests makes no sense in single-process mode since the renderer is hung. | 212 // Tests makes no sense in single-process mode since the renderer is hung. |
212 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 213 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 214 switches::kSingleProcess)) |
213 return; | 215 return; |
214 | 216 |
215 NavigateToDataURL(INFINITE_UNLOAD_HTML, "infiniteunload"); | 217 NavigateToDataURL(INFINITE_UNLOAD_HTML, "infiniteunload"); |
216 // Must navigate to a non-data URL to trigger cross-site codepath. | 218 // Must navigate to a non-data URL to trigger cross-site codepath. |
217 NavigateToNolistenersFileTwice(); | 219 NavigateToNolistenersFileTwice(); |
218 } | 220 } |
219 | 221 |
220 // Navigate to a page with an infinite beforeunload handler. | 222 // Navigate to a page with an infinite beforeunload handler. |
221 // Then two two async crosssite requests to ensure | 223 // Then two two async crosssite requests to ensure |
222 // we don't get confused and think we're closing the tab. | 224 // we don't get confused and think we're closing the tab. |
223 // This test is flaky on the valgrind UI bots. http://crbug.com/39057 and | 225 // This test is flaky on the valgrind UI bots. http://crbug.com/39057 and |
224 // http://crbug.com/86469 | 226 // http://crbug.com/86469 |
225 IN_PROC_BROWSER_TEST_F(UnloadTest, CrossSiteInfiniteBeforeUnloadAsync) { | 227 IN_PROC_BROWSER_TEST_F(UnloadTest, CrossSiteInfiniteBeforeUnloadAsync) { |
226 // Tests makes no sense in single-process mode since the renderer is hung. | 228 // Tests makes no sense in single-process mode since the renderer is hung. |
227 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 229 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 230 switches::kSingleProcess)) |
228 return; | 231 return; |
229 | 232 |
230 NavigateToDataURL(INFINITE_BEFORE_UNLOAD_HTML, "infinitebeforeunload"); | 233 NavigateToDataURL(INFINITE_BEFORE_UNLOAD_HTML, "infinitebeforeunload"); |
231 // Must navigate to a non-data URL to trigger cross-site codepath. | 234 // Must navigate to a non-data URL to trigger cross-site codepath. |
232 NavigateToNolistenersFileTwiceAsync(); | 235 NavigateToNolistenersFileTwiceAsync(); |
233 } | 236 } |
234 | 237 |
235 // Navigate to a page with an infinite beforeunload handler. | 238 // Navigate to a page with an infinite beforeunload handler. |
236 // Then two two sync crosssite requests to ensure | 239 // Then two two sync crosssite requests to ensure |
237 // we correctly nav to each one. | 240 // we correctly nav to each one. |
238 // If this flakes, see bug http://crbug.com/86469. | 241 // If this flakes, see bug http://crbug.com/86469. |
239 IN_PROC_BROWSER_TEST_F(UnloadTest, CrossSiteInfiniteBeforeUnloadSync) { | 242 IN_PROC_BROWSER_TEST_F(UnloadTest, CrossSiteInfiniteBeforeUnloadSync) { |
240 // Tests makes no sense in single-process mode since the renderer is hung. | 243 // Tests makes no sense in single-process mode since the renderer is hung. |
241 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 244 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 245 switches::kSingleProcess)) |
242 return; | 246 return; |
243 | 247 |
244 NavigateToDataURL(INFINITE_BEFORE_UNLOAD_HTML, "infinitebeforeunload"); | 248 NavigateToDataURL(INFINITE_BEFORE_UNLOAD_HTML, "infinitebeforeunload"); |
245 // Must navigate to a non-data URL to trigger cross-site codepath. | 249 // Must navigate to a non-data URL to trigger cross-site codepath. |
246 NavigateToNolistenersFileTwice(); | 250 NavigateToNolistenersFileTwice(); |
247 } | 251 } |
248 | 252 |
249 // Tests closing the browser on a page with no unload listeners registered. | 253 // Tests closing the browser on a page with no unload listeners registered. |
250 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseNoUnloadListeners) { | 254 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseNoUnloadListeners) { |
251 LoadUrlAndQuitBrowser(NOLISTENERS_HTML, "nolisteners"); | 255 LoadUrlAndQuitBrowser(NOLISTENERS_HTML, "nolisteners"); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 // two seconds to run. | 326 // two seconds to run. |
323 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseTwoSecondBeforeUnload) { | 327 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseTwoSecondBeforeUnload) { |
324 LoadUrlAndQuitBrowser(TWO_SECOND_BEFORE_UNLOAD_HTML, | 328 LoadUrlAndQuitBrowser(TWO_SECOND_BEFORE_UNLOAD_HTML, |
325 "twosecondbeforeunload"); | 329 "twosecondbeforeunload"); |
326 } | 330 } |
327 | 331 |
328 // Tests closing the browser on a page with an unload listener registered where | 332 // Tests closing the browser on a page with an unload listener registered where |
329 // the unload handler has an infinite loop. | 333 // the unload handler has an infinite loop. |
330 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseInfiniteUnload) { | 334 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseInfiniteUnload) { |
331 // Tests makes no sense in single-process mode since the renderer is hung. | 335 // Tests makes no sense in single-process mode since the renderer is hung. |
332 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 336 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 337 switches::kSingleProcess)) |
333 return; | 338 return; |
334 | 339 |
335 LoadUrlAndQuitBrowser(INFINITE_UNLOAD_HTML, "infiniteunload"); | 340 LoadUrlAndQuitBrowser(INFINITE_UNLOAD_HTML, "infiniteunload"); |
336 } | 341 } |
337 | 342 |
338 // Tests closing the browser with a beforeunload handler that hangs. | 343 // Tests closing the browser with a beforeunload handler that hangs. |
339 // If this flakes, use http://crbug.com/78803 and http://crbug.com/86469 | 344 // If this flakes, use http://crbug.com/78803 and http://crbug.com/86469 |
340 IN_PROC_BROWSER_TEST_F(UnloadTest, DISABLED_BrowserCloseInfiniteBeforeUnload) { | 345 IN_PROC_BROWSER_TEST_F(UnloadTest, DISABLED_BrowserCloseInfiniteBeforeUnload) { |
341 // Tests makes no sense in single-process mode since the renderer is hung. | 346 // Tests makes no sense in single-process mode since the renderer is hung. |
342 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 347 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 348 switches::kSingleProcess)) |
343 return; | 349 return; |
344 | 350 |
345 LoadUrlAndQuitBrowser(INFINITE_BEFORE_UNLOAD_HTML, "infinitebeforeunload"); | 351 LoadUrlAndQuitBrowser(INFINITE_BEFORE_UNLOAD_HTML, "infinitebeforeunload"); |
346 } | 352 } |
347 | 353 |
348 // Tests closing the browser on a page with an unload listener registered where | 354 // Tests closing the browser on a page with an unload listener registered where |
349 // the unload handler has an infinite loop followed by an alert. | 355 // the unload handler has an infinite loop followed by an alert. |
350 // If this flakes, use http://crbug.com/86469 | 356 // If this flakes, use http://crbug.com/86469 |
351 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseInfiniteUnloadAlert) { | 357 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseInfiniteUnloadAlert) { |
352 // Tests makes no sense in single-process mode since the renderer is hung. | 358 // Tests makes no sense in single-process mode since the renderer is hung. |
353 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 359 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 360 switches::kSingleProcess)) |
354 return; | 361 return; |
355 | 362 |
356 LoadUrlAndQuitBrowser(INFINITE_UNLOAD_ALERT_HTML, "infiniteunloadalert"); | 363 LoadUrlAndQuitBrowser(INFINITE_UNLOAD_ALERT_HTML, "infiniteunloadalert"); |
357 } | 364 } |
358 | 365 |
359 // Tests closing the browser with a beforeunload handler that hangs then | 366 // Tests closing the browser with a beforeunload handler that hangs then |
360 // pops up an alert. | 367 // pops up an alert. |
361 // If this flakes, use http://crbug.com/78803 and http://crbug.com/86469. | 368 // If this flakes, use http://crbug.com/78803 and http://crbug.com/86469. |
362 IN_PROC_BROWSER_TEST_F(UnloadTest, | 369 IN_PROC_BROWSER_TEST_F(UnloadTest, |
363 DISABLED_BrowserCloseInfiniteBeforeUnloadAlert) { | 370 DISABLED_BrowserCloseInfiniteBeforeUnloadAlert) { |
364 // Tests makes no sense in single-process mode since the renderer is hung. | 371 // Tests makes no sense in single-process mode since the renderer is hung. |
365 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 372 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 373 switches::kSingleProcess)) |
366 return; | 374 return; |
367 | 375 |
368 LoadUrlAndQuitBrowser(INFINITE_BEFORE_UNLOAD_ALERT_HTML, | 376 LoadUrlAndQuitBrowser(INFINITE_BEFORE_UNLOAD_ALERT_HTML, |
369 "infinitebeforeunloadalert"); | 377 "infinitebeforeunloadalert"); |
370 } | 378 } |
371 | 379 |
372 // Tests closing the browser on a page with an unload listener registered where | 380 // Tests closing the browser on a page with an unload listener registered where |
373 // the unload handler has an 2 second long loop followed by an alert. | 381 // the unload handler has an 2 second long loop followed by an alert. |
374 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseTwoSecondUnloadAlert) { | 382 IN_PROC_BROWSER_TEST_F(UnloadTest, BrowserCloseTwoSecondUnloadAlert) { |
375 LoadUrlAndQuitBrowser(TWO_SECOND_UNLOAD_ALERT_HTML, "twosecondunloadalert"); | 383 LoadUrlAndQuitBrowser(TWO_SECOND_UNLOAD_ALERT_HTML, "twosecondunloadalert"); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 content::WebContentsDestroyedWatcher destroyed_watcher( | 417 content::WebContentsDestroyedWatcher destroyed_watcher( |
410 browser()->tab_strip_model()->GetActiveWebContents()); | 418 browser()->tab_strip_model()->GetActiveWebContents()); |
411 chrome::CloseTab(browser()); | 419 chrome::CloseTab(browser()); |
412 destroyed_watcher.Wait(); | 420 destroyed_watcher.Wait(); |
413 | 421 |
414 CheckTitle("only_one_unload"); | 422 CheckTitle("only_one_unload"); |
415 } | 423 } |
416 | 424 |
417 class FastUnloadTest : public UnloadTest { | 425 class FastUnloadTest : public UnloadTest { |
418 public: | 426 public: |
419 void SetUpCommandLine(CommandLine* command_line) override { | 427 void SetUpCommandLine(base::CommandLine* command_line) override { |
420 UnloadTest::SetUpCommandLine(command_line); | 428 UnloadTest::SetUpCommandLine(command_line); |
421 command_line->AppendSwitch(switches::kEnableFastUnload); | 429 command_line->AppendSwitch(switches::kEnableFastUnload); |
422 } | 430 } |
423 | 431 |
424 void SetUpInProcessBrowserTestFixture() override { | 432 void SetUpInProcessBrowserTestFixture() override { |
425 ASSERT_TRUE(test_server()->Start()); | 433 ASSERT_TRUE(test_server()->Start()); |
426 } | 434 } |
427 | 435 |
428 void TearDownInProcessBrowserTestFixture() override { test_server()->Stop(); } | 436 void TearDownInProcessBrowserTestFixture() override { test_server()->Stop(); } |
429 | 437 |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 #if defined(OS_WIN) || defined(OS_LINUX) | 621 #if defined(OS_WIN) || defined(OS_LINUX) |
614 #define MAYBE_WindowCloseAfterBeforeUnloadCrash \ | 622 #define MAYBE_WindowCloseAfterBeforeUnloadCrash \ |
615 DISABLED_WindowCloseAfterBeforeUnloadCrash | 623 DISABLED_WindowCloseAfterBeforeUnloadCrash |
616 #else | 624 #else |
617 #define MAYBE_WindowCloseAfterBeforeUnloadCrash \ | 625 #define MAYBE_WindowCloseAfterBeforeUnloadCrash \ |
618 WindowCloseAfterBeforeUnloadCrash | 626 WindowCloseAfterBeforeUnloadCrash |
619 #endif | 627 #endif |
620 IN_PROC_BROWSER_TEST_F(FastUnloadTest, | 628 IN_PROC_BROWSER_TEST_F(FastUnloadTest, |
621 MAYBE_WindowCloseAfterBeforeUnloadCrash) { | 629 MAYBE_WindowCloseAfterBeforeUnloadCrash) { |
622 // Tests makes no sense in single-process mode since the renderer is hung. | 630 // Tests makes no sense in single-process mode since the renderer is hung. |
623 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess)) | 631 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 632 switches::kSingleProcess)) |
624 return; | 633 return; |
625 | 634 |
626 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); | 635 NavigateToDataURL(BEFORE_UNLOAD_HTML, "beforeunload"); |
627 content::WebContents* beforeunload_contents = | 636 content::WebContents* beforeunload_contents = |
628 browser()->tab_strip_model()->GetActiveWebContents(); | 637 browser()->tab_strip_model()->GetActiveWebContents(); |
629 | 638 |
630 content::WindowedNotificationObserver window_observer( | 639 content::WindowedNotificationObserver window_observer( |
631 chrome::NOTIFICATION_BROWSER_CLOSED, | 640 chrome::NOTIFICATION_BROWSER_CLOSED, |
632 content::NotificationService::AllSources()); | 641 content::NotificationService::AllSources()); |
633 chrome::CloseWindow(browser()); | 642 chrome::CloseWindow(browser()); |
634 CrashTab(beforeunload_contents); | 643 CrashTab(beforeunload_contents); |
635 window_observer.Wait(); | 644 window_observer.Wait(); |
636 } | 645 } |
637 | 646 |
638 // TODO(ojan): Add tests for unload/beforeunload that have multiple tabs | 647 // TODO(ojan): Add tests for unload/beforeunload that have multiple tabs |
639 // and multiple windows. | 648 // and multiple windows. |
OLD | NEW |