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 7d73c888a099b2e003a8a6edad85bef665a0243e..212b967d022684c46b60c0f303f0b900464b10ba 100644 |
--- a/content/browser/web_contents/web_contents_view_aura_browsertest.cc |
+++ b/content/browser/web_contents/web_contents_view_aura_browsertest.cc |
@@ -25,6 +25,43 @@ |
namespace content { |
+// A dummy callback to reset the screenshot-taker callback. |
+void DummyCallback(RenderViewHost* host) { |
+} |
+ |
+// This class keeps track of the RenderViewHost whose screenshot was captured. |
+class ScreenshotTracker { |
+ public: |
+ explicit ScreenshotTracker(NavigationControllerImpl* controller) |
+ : screenshot_taken_for_(NULL), |
+ controller_(controller) { |
+ controller_->SetTakeScreenshotCallbackForTest( |
+ base::Bind(&ScreenshotTracker::TakeScreenshotCallback, |
+ base::Unretained(this))); |
+ } |
+ |
+ virtual ~ScreenshotTracker() { |
+ controller_->SetTakeScreenshotCallbackForTest( |
+ base::Bind(&DummyCallback)); |
+ } |
+ |
+ RenderViewHost* screenshot_taken_for() { return screenshot_taken_for_; } |
+ |
+ void Reset() { |
+ screenshot_taken_for_ = NULL; |
+ } |
+ |
+ private: |
+ void TakeScreenshotCallback(RenderViewHost* host) { |
+ screenshot_taken_for_ = host; |
+ } |
+ |
+ RenderViewHost* screenshot_taken_for_; |
+ NavigationControllerImpl* controller_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScreenshotTracker); |
+}; |
+ |
class WebContentsViewAuraTest : public ContentBrowserTest { |
public: |
WebContentsViewAuraTest() {} |
@@ -363,4 +400,58 @@ IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, |
} |
} |
+// Tests that screenshot is taken correctly when navigation causes a |
+// RenderViewHost to be swapped out. |
+IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, |
+ ScreenshotForSwappedOutRenderViews) { |
+ ASSERT_NO_FATAL_FAILURE( |
+ StartTestWithPage("files/overscroll_navigation.html")); |
+ // Create a new server with a different site. |
+ net::TestServer https_server( |
+ net::TestServer::TYPE_HTTPS, |
+ net::TestServer::kLocalhost, |
+ FilePath(FILE_PATH_LITERAL("content/test/data"))); |
+ ASSERT_TRUE(https_server.Start()); |
+ |
+ WebContentsImpl* web_contents = |
+ static_cast<WebContentsImpl*>(shell()->web_contents()); |
+ |
+ struct { |
+ GURL url; |
+ int transition; |
+ } navigations[] = { |
+ { https_server.GetURL("files/title1.html"), |
+ PAGE_TRANSITION_TYPED | PAGE_TRANSITION_FROM_ADDRESS_BAR }, |
+ { test_server()->GetURL("files/title2.html"), |
+ PAGE_TRANSITION_AUTO_BOOKMARK }, |
+ { https_server.GetURL("files/title3.html"), |
+ PAGE_TRANSITION_TYPED | PAGE_TRANSITION_FROM_ADDRESS_BAR }, |
+ { GURL(), 0 } |
+ }; |
+ |
+ ScreenshotTracker tracker(&web_contents->GetController()); |
+ for (int i = 0; !navigations[i].url.is_empty(); ++i) { |
+ // Navigate via the user initiating a navigation from the UI. |
+ NavigationController::LoadURLParams params(navigations[i].url); |
+ params.transition_type = PageTransitionFromInt(navigations[i].transition); |
+ |
+ RenderViewHost* old_host = web_contents->GetRenderViewHost(); |
+ web_contents->GetController().LoadURLWithParams(params); |
+ WaitForLoadStop(web_contents); |
+ |
+ EXPECT_NE(old_host, web_contents->GetRenderViewHost()) |
+ << navigations[i].url.spec(); |
+ EXPECT_EQ(old_host, tracker.screenshot_taken_for()); |
+ tracker.Reset(); |
+ |
+ NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( |
+ web_contents->GetController().GetEntryAtOffset(-1)); |
+ EXPECT_TRUE(entry->screenshot().get()); |
+ |
+ entry = NavigationEntryImpl::FromNavigationEntry( |
+ web_contents->GetController().GetActiveEntry()); |
+ EXPECT_FALSE(entry->screenshot().get()); |
+ } |
+} |
+ |
} // namespace content |