| Index: content/browser/web_contents/web_contents_view_aura_browsertest.cc
|
| diff --git a/content/browser/web_contents/web_contents_view_aura_browsertest.cc b/content/browser/web_contents/web_contents_view_aura_browsertest.cc
|
| index 8079c9ce71b9127b38c76bce4a31c3d5dbf78eef..c7f8e44a7d11f149daccf05238f1c2b72e77cf0a 100644
|
| --- a/content/browser/web_contents/web_contents_view_aura_browsertest.cc
|
| +++ b/content/browser/web_contents/web_contents_view_aura_browsertest.cc
|
| @@ -32,6 +32,33 @@
|
|
|
| namespace content {
|
|
|
| +// Keeps track of whether a RenderProcessHost is alive or not.
|
| +class RenderProcessHostTracker : public RenderProcessHostObserver {
|
| + public:
|
| + explicit RenderProcessHostTracker(RenderProcessHost* host)
|
| + : host_(host) {
|
| + host_->AddObserver(this);
|
| + }
|
| +
|
| + virtual ~RenderProcessHostTracker() {
|
| + if (host_)
|
| + host_->RemoveObserver(this);
|
| + }
|
| +
|
| + bool alive() const { return host_; }
|
| +
|
| + private:
|
| + // RenderProcessHostObserver:
|
| + virtual void RenderProcessHostDestroyed(RenderProcessHost* host) OVERRIDE {
|
| + CHECK_EQ(host_, host);
|
| + host_ = NULL;
|
| + }
|
| +
|
| + RenderProcessHost* host_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(RenderProcessHostTracker);
|
| +};
|
| +
|
| // This class keeps track of the RenderViewHost whose screenshot was captured.
|
| class ScreenshotTracker : public NavigationEntryScreenshotManager {
|
| public:
|
| @@ -73,12 +100,22 @@ class ScreenshotTracker : public NavigationEntryScreenshotManager {
|
| ++waiting_for_screenshots_;
|
| screenshot_taken_for_ = host;
|
| NavigationEntryScreenshotManager::TakeScreenshotImpl(host, entry);
|
| +
|
| + // The screenshot-manager should start observing the lifetime of the
|
| + // WebContents, to make sure that it can cancel the screenshot requests if
|
| + // the WebContents is destroyed before the screenshot-capture completes.
|
| + EXPECT_TRUE(web_contents());
|
| }
|
|
|
| virtual void OnScreenshotSet(NavigationEntryImpl* entry) OVERRIDE {
|
| --waiting_for_screenshots_;
|
| screenshot_set_[entry] = true;
|
| NavigationEntryScreenshotManager::OnScreenshotSet(entry);
|
| + if (waiting_for_screenshots_ == 0) {
|
| + // If the screenshot manager is not waiting for any pending screenshot
|
| + // capture requests, then it shouldn't be observing the WebContents.
|
| + EXPECT_FALSE(web_contents());
|
| + }
|
| if (waiting_for_screenshots_ == 0 && message_loop_runner_.get())
|
| message_loop_runner_->Quit();
|
| }
|
| @@ -518,9 +555,16 @@ IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest,
|
| params.transition_type = PageTransitionFromInt(navigations[i].transition);
|
|
|
| RenderViewHost* old_host = web_contents->GetRenderViewHost();
|
| + scoped_ptr<RenderProcessHostTracker> process_tracker(
|
| + new RenderProcessHostTracker(old_host->GetProcess()));
|
| + EXPECT_TRUE(process_tracker->alive());
|
| +
|
| web_contents->GetController().LoadURLWithParams(params);
|
| WaitForLoadStop(web_contents);
|
| screenshot_manager()->WaitUntilScreenshotIsReady();
|
| + // The RenderProcessHost should be destroyed, since this is a cross-process
|
| + // navigation.
|
| + EXPECT_FALSE(process_tracker->alive());
|
|
|
| EXPECT_NE(old_host, web_contents->GetRenderViewHost())
|
| << navigations[i].url.spec();
|
|
|