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 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <deque> | 6 #include <deque> |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 channel_destroyed_ = true; | 319 channel_destroyed_ = true; |
320 run_loop_.Quit(); | 320 run_loop_.Quit(); |
321 } | 321 } |
322 | 322 |
323 bool channel_destroyed_; | 323 bool channel_destroyed_; |
324 base::RunLoop run_loop_; | 324 base::RunLoop run_loop_; |
325 | 325 |
326 DISALLOW_COPY_AND_ASSIGN(ChannelDestructionWatcher); | 326 DISALLOW_COPY_AND_ASSIGN(ChannelDestructionWatcher); |
327 }; | 327 }; |
328 | 328 |
| 329 // A navigation observer to wait until WebContents is destroyed. |
| 330 class WebContentsDestructionObserver : public WebContentsObserver { |
| 331 public: |
| 332 explicit WebContentsDestructionObserver(WebContents* web_contents) |
| 333 : WebContentsObserver(web_contents) {} |
| 334 |
| 335 // Waits for destruction of the observed WebContents. |
| 336 void Wait() { |
| 337 loop_.Run(); |
| 338 } |
| 339 |
| 340 // WebContentsObserver implementation: |
| 341 void WebContentsDestroyed() override { |
| 342 loop_.Quit(); |
| 343 } |
| 344 |
| 345 private: |
| 346 DISALLOW_COPY_AND_ASSIGN(WebContentsDestructionObserver); |
| 347 base::RunLoop loop_; |
| 348 }; |
| 349 |
329 // A navigation observer to wait on either a new load or a swap of a | 350 // A navigation observer to wait on either a new load or a swap of a |
330 // WebContents. On swap, if the new WebContents is still loading, wait for that | 351 // WebContents. On swap, if the new WebContents is still loading, wait for that |
331 // load to complete as well. Note that the load must begin after the observer is | 352 // load to complete as well. Note that the load must begin after the observer is |
332 // attached. | 353 // attached. |
333 class NavigationOrSwapObserver : public WebContentsObserver, | 354 class NavigationOrSwapObserver : public WebContentsObserver, |
334 public TabStripModelObserver { | 355 public TabStripModelObserver { |
335 public: | 356 public: |
336 // Waits for either a new load or a swap of |tab_strip_model|'s active | 357 // Waits for either a new load or a swap of |tab_strip_model|'s active |
337 // WebContents. | 358 // WebContents. |
338 NavigationOrSwapObserver(TabStripModel* tab_strip_model, | 359 NavigationOrSwapObserver(TabStripModel* tab_strip_model, |
(...skipping 2728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3067 favicon::ContentFaviconDriver::FromWebContents(GetActiveWebContents()); | 3088 favicon::ContentFaviconDriver::FromWebContents(GetActiveWebContents()); |
3068 if (!favicon_driver->FaviconIsValid()) { | 3089 if (!favicon_driver->FaviconIsValid()) { |
3069 // If the favicon has not been set yet, wait for it to be. | 3090 // If the favicon has not been set yet, wait for it to be. |
3070 FaviconUpdateWatcher favicon_update_watcher(GetActiveWebContents()); | 3091 FaviconUpdateWatcher favicon_update_watcher(GetActiveWebContents()); |
3071 favicon_update_watcher.Wait(); | 3092 favicon_update_watcher.Wait(); |
3072 } | 3093 } |
3073 EXPECT_TRUE(favicon_driver->FaviconIsValid()); | 3094 EXPECT_TRUE(favicon_driver->FaviconIsValid()); |
3074 } | 3095 } |
3075 | 3096 |
3076 // Checks that when a prerendered page is swapped in to a referring page, the | 3097 // Checks that when a prerendered page is swapped in to a referring page, the |
3077 // unload handlers on the referring page are executed. | 3098 // unload handlers on the referring page are executed and its WebContents is |
| 3099 // destroyed. |
| 3100 // TODO(pasko): A similar test for BeforeUnload. See http://crbug.com/600693 |
3078 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderUnload) { | 3101 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderUnload) { |
3079 // Matches URL in prerender_loader_with_unload.html. | 3102 // Matches URL in prerender_loader_with_unload.html. |
3080 const GURL unload_url("http://unload-url.test"); | 3103 const GURL unload_url("http://unload-url.test"); |
3081 base::FilePath empty_file = ui_test_utils::GetTestFilePath( | 3104 base::FilePath empty_file = ui_test_utils::GetTestFilePath( |
3082 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); | 3105 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); |
3083 RequestCounter unload_counter; | 3106 RequestCounter unload_counter; |
3084 BrowserThread::PostTask( | 3107 BrowserThread::PostTask( |
3085 BrowserThread::IO, FROM_HERE, | 3108 BrowserThread::IO, FROM_HERE, |
3086 base::Bind(&CreateCountingInterceptorOnIO, | 3109 base::Bind(&CreateCountingInterceptorOnIO, |
3087 unload_url, empty_file, unload_counter.AsWeakPtr())); | 3110 unload_url, empty_file, unload_counter.AsWeakPtr())); |
3088 | 3111 |
3089 set_loader_path("/prerender/prerender_loader_with_unload.html"); | 3112 set_loader_path("/prerender/prerender_loader_with_unload.html"); |
3090 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); | 3113 PrerenderTestURL("/prerender/prerender_page.html", FINAL_STATUS_USED, 1); |
| 3114 WebContentsDestructionObserver destruction_observer(GetActiveWebContents()); |
3091 NavigateToDestURL(); | 3115 NavigateToDestURL(); |
3092 unload_counter.WaitForCount(1); | 3116 unload_counter.WaitForCount(1); |
| 3117 destruction_observer.Wait(); |
3093 } | 3118 } |
3094 | 3119 |
3095 // Checks that a hanging unload on the referring page of a prerender swap does | 3120 // Checks that a hanging unload on the referring page of a prerender swap does |
3096 // not crash the browser on exit. | 3121 // not crash the browser on exit. |
3097 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { | 3122 IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHangingUnload) { |
3098 // Matches URL in prerender_loader_with_unload.html. | 3123 // Matches URL in prerender_loader_with_unload.html. |
3099 const GURL hang_url("http://unload-url.test"); | 3124 const GURL hang_url("http://unload-url.test"); |
3100 base::FilePath empty_file = ui_test_utils::GetTestFilePath( | 3125 base::FilePath empty_file = ui_test_utils::GetTestFilePath( |
3101 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); | 3126 base::FilePath(), base::FilePath(FILE_PATH_LITERAL("empty.html"))); |
3102 BrowserThread::PostTask( | 3127 BrowserThread::PostTask( |
(...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4061 | 4086 |
4062 NavigateToDestURL(); | 4087 NavigateToDestURL(); |
4063 EXPECT_EQ(1U, task_manager.tasks().size()); | 4088 EXPECT_EQ(1U, task_manager.tasks().size()); |
4064 } | 4089 } |
4065 | 4090 |
4066 } // namespace | 4091 } // namespace |
4067 | 4092 |
4068 #endif // defined(ENABLE_TASK_MANAGER) | 4093 #endif // defined(ENABLE_TASK_MANAGER) |
4069 | 4094 |
4070 } // namespace prerender | 4095 } // namespace prerender |
OLD | NEW |