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 "content/browser/web_contents/web_contents_view_aura.h" | 5 #include "content/browser/web_contents/web_contents_view_aura.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "base/test/test_timeouts.h" | 10 #include "base/test/test_timeouts.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "content/shell/browser/shell.h" | 25 #include "content/shell/browser/shell.h" |
26 #include "content/test/content_browser_test.h" | 26 #include "content/test/content_browser_test.h" |
27 #include "content/test/content_browser_test_utils.h" | 27 #include "content/test/content_browser_test_utils.h" |
28 #include "ui/aura/root_window.h" | 28 #include "ui/aura/root_window.h" |
29 #include "ui/aura/test/event_generator.h" | 29 #include "ui/aura/test/event_generator.h" |
30 #include "ui/aura/window.h" | 30 #include "ui/aura/window.h" |
31 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | 31 #include "ui/compositor/scoped_animation_duration_scale_mode.h" |
32 | 32 |
33 namespace content { | 33 namespace content { |
34 | 34 |
| 35 // Keeps track of whether a RenderProcessHost is alive or not. |
| 36 class RenderProcessHostTracker : public RenderProcessHostObserver { |
| 37 public: |
| 38 explicit RenderProcessHostTracker(RenderProcessHost* host) |
| 39 : host_(host) { |
| 40 host_->AddObserver(this); |
| 41 } |
| 42 |
| 43 virtual ~RenderProcessHostTracker() { |
| 44 if (host_) |
| 45 host_->RemoveObserver(this); |
| 46 } |
| 47 |
| 48 bool alive() const { return host_; } |
| 49 |
| 50 private: |
| 51 // RenderProcessHostObserver: |
| 52 virtual void RenderProcessHostDestroyed(RenderProcessHost* host) OVERRIDE { |
| 53 CHECK_EQ(host_, host); |
| 54 host_ = NULL; |
| 55 } |
| 56 |
| 57 RenderProcessHost* host_; |
| 58 |
| 59 DISALLOW_COPY_AND_ASSIGN(RenderProcessHostTracker); |
| 60 }; |
| 61 |
35 // This class keeps track of the RenderViewHost whose screenshot was captured. | 62 // This class keeps track of the RenderViewHost whose screenshot was captured. |
36 class ScreenshotTracker : public NavigationEntryScreenshotManager { | 63 class ScreenshotTracker : public NavigationEntryScreenshotManager { |
37 public: | 64 public: |
38 explicit ScreenshotTracker(NavigationControllerImpl* controller) | 65 explicit ScreenshotTracker(NavigationControllerImpl* controller) |
39 : NavigationEntryScreenshotManager(controller), | 66 : NavigationEntryScreenshotManager(controller), |
40 screenshot_taken_for_(NULL), | 67 screenshot_taken_for_(NULL), |
41 waiting_for_screenshots_(0) { | 68 waiting_for_screenshots_(0) { |
42 } | 69 } |
43 | 70 |
44 virtual ~ScreenshotTracker() { | 71 virtual ~ScreenshotTracker() { |
(...skipping 21 matching lines...) Expand all Loading... |
66 return screenshot_set_.count(entry) > 0; | 93 return screenshot_set_.count(entry) > 0; |
67 } | 94 } |
68 | 95 |
69 private: | 96 private: |
70 // Overridden from NavigationEntryScreenshotManager: | 97 // Overridden from NavigationEntryScreenshotManager: |
71 virtual void TakeScreenshotImpl(RenderViewHost* host, | 98 virtual void TakeScreenshotImpl(RenderViewHost* host, |
72 NavigationEntryImpl* entry) OVERRIDE { | 99 NavigationEntryImpl* entry) OVERRIDE { |
73 ++waiting_for_screenshots_; | 100 ++waiting_for_screenshots_; |
74 screenshot_taken_for_ = host; | 101 screenshot_taken_for_ = host; |
75 NavigationEntryScreenshotManager::TakeScreenshotImpl(host, entry); | 102 NavigationEntryScreenshotManager::TakeScreenshotImpl(host, entry); |
| 103 |
| 104 // The screenshot-manager should start observing the lifetime of the |
| 105 // WebContents, to make sure that it can cancel the screenshot requests if |
| 106 // the WebContents is destroyed before the screenshot-capture completes. |
| 107 EXPECT_TRUE(web_contents()); |
76 } | 108 } |
77 | 109 |
78 virtual void OnScreenshotSet(NavigationEntryImpl* entry) OVERRIDE { | 110 virtual void OnScreenshotSet(NavigationEntryImpl* entry) OVERRIDE { |
79 --waiting_for_screenshots_; | 111 --waiting_for_screenshots_; |
80 screenshot_set_[entry] = true; | 112 screenshot_set_[entry] = true; |
81 NavigationEntryScreenshotManager::OnScreenshotSet(entry); | 113 NavigationEntryScreenshotManager::OnScreenshotSet(entry); |
| 114 if (waiting_for_screenshots_ == 0) { |
| 115 // If the screenshot manager is not waiting for any pending screenshot |
| 116 // capture requests, then it shouldn't be observing the WebContents. |
| 117 EXPECT_FALSE(web_contents()); |
| 118 } |
82 if (waiting_for_screenshots_ == 0 && message_loop_runner_.get()) | 119 if (waiting_for_screenshots_ == 0 && message_loop_runner_.get()) |
83 message_loop_runner_->Quit(); | 120 message_loop_runner_->Quit(); |
84 } | 121 } |
85 | 122 |
86 RenderViewHost* screenshot_taken_for_; | 123 RenderViewHost* screenshot_taken_for_; |
87 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; | 124 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
88 int waiting_for_screenshots_; | 125 int waiting_for_screenshots_; |
89 std::map<NavigationEntryImpl*, bool> screenshot_set_; | 126 std::map<NavigationEntryImpl*, bool> screenshot_set_; |
90 | 127 |
91 DISALLOW_COPY_AND_ASSIGN(ScreenshotTracker); | 128 DISALLOW_COPY_AND_ASSIGN(ScreenshotTracker); |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 { GURL(), 0 } | 548 { GURL(), 0 } |
512 }; | 549 }; |
513 | 550 |
514 screenshot_manager()->Reset(); | 551 screenshot_manager()->Reset(); |
515 for (int i = 0; !navigations[i].url.is_empty(); ++i) { | 552 for (int i = 0; !navigations[i].url.is_empty(); ++i) { |
516 // Navigate via the user initiating a navigation from the UI. | 553 // Navigate via the user initiating a navigation from the UI. |
517 NavigationController::LoadURLParams params(navigations[i].url); | 554 NavigationController::LoadURLParams params(navigations[i].url); |
518 params.transition_type = PageTransitionFromInt(navigations[i].transition); | 555 params.transition_type = PageTransitionFromInt(navigations[i].transition); |
519 | 556 |
520 RenderViewHost* old_host = web_contents->GetRenderViewHost(); | 557 RenderViewHost* old_host = web_contents->GetRenderViewHost(); |
| 558 scoped_ptr<RenderProcessHostTracker> process_tracker( |
| 559 new RenderProcessHostTracker(old_host->GetProcess())); |
| 560 EXPECT_TRUE(process_tracker->alive()); |
| 561 |
521 web_contents->GetController().LoadURLWithParams(params); | 562 web_contents->GetController().LoadURLWithParams(params); |
522 WaitForLoadStop(web_contents); | 563 WaitForLoadStop(web_contents); |
523 screenshot_manager()->WaitUntilScreenshotIsReady(); | 564 screenshot_manager()->WaitUntilScreenshotIsReady(); |
| 565 // The RenderProcessHost should be destroyed, since this is a cross-process |
| 566 // navigation. |
| 567 EXPECT_FALSE(process_tracker->alive()); |
524 | 568 |
525 EXPECT_NE(old_host, web_contents->GetRenderViewHost()) | 569 EXPECT_NE(old_host, web_contents->GetRenderViewHost()) |
526 << navigations[i].url.spec(); | 570 << navigations[i].url.spec(); |
527 EXPECT_EQ(old_host, screenshot_manager()->screenshot_taken_for()); | 571 EXPECT_EQ(old_host, screenshot_manager()->screenshot_taken_for()); |
528 | 572 |
529 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( | 573 NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( |
530 web_contents->GetController().GetEntryAtOffset(-1)); | 574 web_contents->GetController().GetEntryAtOffset(-1)); |
531 EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry)); | 575 EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry)); |
532 | 576 |
533 entry = NavigationEntryImpl::FromNavigationEntry( | 577 entry = NavigationEntryImpl::FromNavigationEntry( |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 10); | 702 10); |
659 base::string16 actual_title = title_watcher.WaitAndGetTitle(); | 703 base::string16 actual_title = title_watcher.WaitAndGetTitle(); |
660 EXPECT_EQ(expected_title, actual_title); | 704 EXPECT_EQ(expected_title, actual_title); |
661 | 705 |
662 EXPECT_EQ(2, GetCurrentIndex()); | 706 EXPECT_EQ(2, GetCurrentIndex()); |
663 EXPECT_TRUE(controller.CanGoBack()); | 707 EXPECT_TRUE(controller.CanGoBack()); |
664 EXPECT_FALSE(controller.CanGoForward()); | 708 EXPECT_FALSE(controller.CanGoForward()); |
665 } | 709 } |
666 | 710 |
667 } // namespace content | 711 } // namespace content |
OLD | NEW |