web_contents_view_aura_browsertest.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_view_aura.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/test_timeouts.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN) 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/win/windows_version.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/navigation_controller_impl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/navigation_entry_impl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/web_contents_screenshot_manager.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_view.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h" 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/content_browser_test.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/test/content_browser_test_utils.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/test/event_generator.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class keeps track of the RenderViewHost whose screenshot was captured. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ScreenshotTracker : public WebContentsScreenshotManager { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit ScreenshotTracker(NavigationControllerImpl* controller) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : WebContentsScreenshotManager(controller), 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_taken_for_(NULL), 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waiting_for_screenshots_(0) { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ScreenshotTracker() { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* screenshot_taken_for() { return screenshot_taken_for_; } 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Reset() { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screenshot_taken_for_ = NULL; 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) screenshot_set_.clear(); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetScreenshotInterval(int interval_ms) { 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetMinScreenshotIntervalMS(interval_ms); 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WaitUntilScreenshotIsReady() { 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!waiting_for_screenshots_) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_runner_ = new content::MessageLoopRunner; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_runner_->Run(); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool ScreenshotSetForEntry(NavigationEntryImpl* entry) const { 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return screenshot_set_.count(entry) > 0; 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Overridden from WebContentsScreenshotManager: 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void TakeScreenshotImpl(RenderViewHost* host, 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationEntryImpl* entry) OVERRIDE { 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ++waiting_for_screenshots_; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) screenshot_taken_for_ = host; 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsScreenshotManager::TakeScreenshotImpl(host, entry); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnScreenshotSet(NavigationEntryImpl* entry) OVERRIDE { 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) --waiting_for_screenshots_; 80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) screenshot_set_[entry] = true; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsScreenshotManager::OnScreenshotSet(entry); 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (waiting_for_screenshots_ == 0 && message_loop_runner_.get()) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop_runner_->Quit(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* screenshot_taken_for_; 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<content::MessageLoopRunner> message_loop_runner_; 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int waiting_for_screenshots_; 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::map<NavigationEntryImpl*, bool> screenshot_set_; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScreenshotTracker); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class NavigationWatcher : public WebContentsObserver { 95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) explicit NavigationWatcher(WebContents* contents) 97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : WebContentsObserver(contents), 98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) navigated_(false), 99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) should_quit_loop_(false) { 100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual ~NavigationWatcher() {} 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void WaitUntilNavigationStarts() { 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (navigated_) 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) should_quit_loop_ = true; 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::MessageLoop::current()->Run(); 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Overridden from WebContentsObserver: 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void AboutToNavigateRenderView(RenderViewHost* host) OVERRIDE { 114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) navigated_ = true; 115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (should_quit_loop_) 116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::MessageLoop::current()->Quit(); 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool navigated_; 120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool should_quit_loop_; 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NavigationWatcher); 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContentsViewAuraTest : public ContentBrowserTest { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsViewAuraTest() 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : screenshot_manager_(NULL) { 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 131c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual void SetUp() OVERRIDE { 132c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // TODO(jbauman): Remove this. http://crbug.com/268644 133c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch UseRealGLContexts(); 134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ContentBrowserTest::SetUp(); 135c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 136c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Executes the javascript synchronously and makes sure the returned value is 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // freed properly. 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ExecuteSyncJSFunction(RenderViewHost* rvh, const std::string& jscript) { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> value = 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ExecuteScriptAndGetValue(rvh, jscript); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Starts the test server and navigates to the given url. Sets a large enough 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // size to the root window. Returns after the navigation to the url is 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // complete. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartTestWithPage(const std::string& url) { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL test_url(test_server()->GetURL(url)); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigateToURL(shell(), test_url); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* content = 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shell()->web_contents()->GetView()->GetContentNativeView(); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content->GetRootWindow()->SetHostSize(gfx::Size(800, 600)); 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsImpl* web_contents = 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationControllerImpl* controller = &web_contents->GetController(); 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager_ = new ScreenshotTracker(controller); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controller->SetScreenshotManager(screenshot_manager_); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void TestOverscrollNavigation(bool touch_handler) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartTestWithPage("files/overscroll_navigation.html")); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* web_contents = 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationController& controller = web_contents->GetController(); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost()); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsViewAura* view_aura = static_cast<WebContentsViewAura*>( 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetView()); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_aura->SetupOverlayWindowForTesting(); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(controller.CanGoBack()); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(controller.CanGoForward()); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index = -1; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> value = 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::ExecuteScriptAndGetValue(view_host, "get_current()"); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(value->GetAsInteger(&index)); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, index); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (touch_handler) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "install_touch_handler()"); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = content::ExecuteScriptAndGetValue(view_host, "get_current()"); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(value->GetAsInteger(&index)); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, index); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(controller.CanGoBack()); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(controller.CanGoForward()); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* content = web_contents->GetView()->GetContentNativeView(); 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds = content->GetBoundsInRootWindow(); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(content->GetRootWindow(), content); 197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const int kScrollDurationMs = 20; 198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const int kScrollSteps = 10; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do a swipe-right now. That should navigate backwards. 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 expected_title = ASCIIToUTF16("Title: #1"); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence( 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.x() + 2, bounds.y() + 10), 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.right() - 10, bounds.y() + 10), 207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kScrollDurationMs), 208d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) kScrollSteps); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 actual_title = title_watcher.WaitAndGetTitle(); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_title, actual_title); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = content::ExecuteScriptAndGetValue(view_host, "get_current()"); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(value->GetAsInteger(&index)); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, index); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(controller.CanGoBack()); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(controller.CanGoForward()); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do a fling-right now. That should navigate backwards. 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 expected_title = ASCIIToUTF16("Title:"); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence( 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.x() + 2, bounds.y() + 10), 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.right() - 10, bounds.y() + 10), 225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kScrollDurationMs), 226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) kScrollSteps); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 actual_title = title_watcher.WaitAndGetTitle(); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_title, actual_title); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = content::ExecuteScriptAndGetValue(view_host, "get_current()"); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(value->GetAsInteger(&index)); 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, index); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(controller.CanGoBack()); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(controller.CanGoForward()); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do a swipe-left now. That should navigate forward. 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 expected_title = ASCIIToUTF16("Title: #1"); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence( 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.right() - 10, bounds.y() + 10), 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.x() + 2, bounds.y() + 10), 243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kScrollDurationMs), 244d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) kScrollSteps); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 actual_title = title_watcher.WaitAndGetTitle(); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_title, actual_title); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = content::ExecuteScriptAndGetValue(view_host, "get_current()"); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(value->GetAsInteger(&index)); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, index); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(controller.CanGoBack()); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(controller.CanGoForward()); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int GetCurrentIndex() { 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* web_contents = 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost()); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index = -1; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> value; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value = content::ExecuteScriptAndGetValue(view_host, "get_current()"); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value->GetAsInteger(&index)) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index = -1; 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return index; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScreenshotTracker* screenshot_manager() { return screenshot_manager_; } 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void set_min_screenshot_interval(int interval_ms) { 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager_->SetScreenshotInterval(interval_ms); 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScreenshotTracker* screenshot_manager_; 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebContentsViewAuraTest); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollNavigation) { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOverscrollNavigation(false); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollNavigationWithTouchHandler) { 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOverscrollNavigation(true); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Disabled because the test always fails the first time it runs on the Win Aura 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// bots, and usually but not always passes second-try (See crbug.com/179532). 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_QuickOverscrollDirectionChange \ 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_QuickOverscrollDirectionChange 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_QuickOverscrollDirectionChange QuickOverscrollDirectionChange 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MAYBE_QuickOverscrollDirectionChange) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartTestWithPage("files/overscroll_navigation.html")); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* web_contents = 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost()); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This test triggers a large number of animations. Speed them up to ensure 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the test completes within its time limit. 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedAnimationDurationScaleMode fast_duration_mode( 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedAnimationDurationScaleMode::FAST_DURATION); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the page has both back/forward history. 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, GetCurrentIndex()); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GoBack(); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* content = web_contents->GetView()->GetContentNativeView(); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* root_window = content->GetRootWindow(); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds = content->GetBoundsInRootWindow(); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta timestamp; 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TouchEvent press(ui::ET_TOUCH_PRESSED, 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.x() + bounds.width() / 2, bounds.y() + 5), 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, timestamp); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_window->AsRootWindowHostDelegate()->OnHostTouchEvent(&press); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timestamp += base::TimeDelta::FromMilliseconds(10); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TouchEvent move1(ui::ET_TOUCH_MOVED, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.right() - 10, bounds.y() + 5), 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, timestamp); 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_window->AsRootWindowHostDelegate()->OnHostTouchEvent(&move1); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Swipe back from the right edge, back to the left edge, back to the right 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // edge. 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int x = bounds.right() - 10; x >= bounds.x() + 10; x-= 10) { 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timestamp += base::TimeDelta::FromMilliseconds(10); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TouchEvent inc(ui::ET_TOUCH_MOVED, 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(x, bounds.y() + 5), 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, timestamp); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_window->AsRootWindowHostDelegate()->OnHostTouchEvent(&inc); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int x = bounds.x() + 10; x <= bounds.width() - 10; x+= 10) { 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timestamp += base::TimeDelta::FromMilliseconds(10); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TouchEvent inc(ui::ET_TOUCH_MOVED, 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(x, bounds.y() + 5), 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, timestamp); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_window->AsRootWindowHostDelegate()->OnHostTouchEvent(&inc); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int x = bounds.width() - 10; x >= bounds.x() + 10; x-= 10) { 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timestamp += base::TimeDelta::FromMilliseconds(10); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::TouchEvent inc(ui::ET_TOUCH_MOVED, 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(x, bounds.y() + 5), 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, timestamp); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_window->AsRootWindowHostDelegate()->OnHostTouchEvent(&inc); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do not end the overscroll sequence. 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the page has has a screenshot when navigation happens: 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - from within the page (from a JS function) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - interactively, when user does an overscroll gesture 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// - interactively, when user navigates in history without the overscroll 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// gesture. 376d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, OverscrollScreenshot) { 377d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Disable the test for WinXP. See http://crbug/294116. 378d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_WIN) 379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (base::win::GetVersion() < base::win::VERSION_VISTA) { 380d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LOG(WARNING) << "Test disabled due to unknown bug on WinXP."; 381d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return; 382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 383d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 384d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartTestWithPage("files/overscroll_navigation.html")); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* web_contents = 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetRenderViewHost()); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_min_screenshot_interval(0); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Do a few navigations initiated by the page. 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, GetCurrentIndex()); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager()->WaitUntilScreenshotIsReady(); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The current entry won't have any screenshots. But the entries in the 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // history should now have screenshots. 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetEntryAtIndex(2)); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(entry->screenshot().get()); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetEntryAtIndex(1)); 409d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry)); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetEntryAtIndex(0)); 413d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry)); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigate again. Index 2 should now have a screenshot. 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, GetCurrentIndex()); 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager()->WaitUntilScreenshotIsReady(); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetEntryAtIndex(2)); 422d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry)); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetEntryAtIndex(3)); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(entry->screenshot().get()); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Now, swipe right to navigate backwards. This should navigate away from 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // index 3 to index 2, and index 3 should have a screenshot. 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 expected_title = ASCIIToUTF16("Title: #2"); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* content = web_contents->GetView()->GetContentNativeView(); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds = content->GetBoundsInRootWindow(); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::test::EventGenerator generator(content->GetRootWindow(), content); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) generator.GestureScrollSequence( 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.x() + 2, bounds.y() + 10), 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(bounds.right() - 10, bounds.y() + 10), 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(20), 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 actual_title = title_watcher.WaitAndGetTitle(); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_title, actual_title); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, GetCurrentIndex()); 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager()->WaitUntilScreenshotIsReady(); 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetEntryAtIndex(3)); 447d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry)); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigate a couple more times. 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, GetCurrentIndex()); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4, GetCurrentIndex()); 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager()->WaitUntilScreenshotIsReady(); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetEntryAtIndex(4)); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(entry->screenshot().get()); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigate back in history. 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 expected_title = ASCIIToUTF16("Title: #3"); 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GoBack(); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 actual_title = title_watcher.WaitAndGetTitle(); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_title, actual_title); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, GetCurrentIndex()); 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager()->WaitUntilScreenshotIsReady(); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetEntryAtIndex(4)); 471d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry)); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that screenshot is taken correctly when navigation causes a 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RenderViewHost to be swapped out. 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScreenshotForSwappedOutRenderViews) { 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StartTestWithPage("files/overscroll_navigation.html")); 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a new server with a different site. 482c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer https_server( 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) net::SpawnedTestServer::kLocalhost, 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("content/test/data"))); 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(https_server.Start()); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsImpl* web_contents = 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_min_screenshot_interval(0); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL url; 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int transition; 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } navigations[] = { 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { https_server.GetURL("files/title1.html"), 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PAGE_TRANSITION_TYPED | PAGE_TRANSITION_FROM_ADDRESS_BAR }, 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { test_server()->GetURL("files/title2.html"), 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PAGE_TRANSITION_AUTO_BOOKMARK }, 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { https_server.GetURL("files/title3.html"), 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PAGE_TRANSITION_TYPED | PAGE_TRANSITION_FROM_ADDRESS_BAR }, 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { GURL(), 0 } 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager()->Reset(); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; !navigations[i].url.is_empty(); ++i) { 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigate via the user initiating a navigation from the UI. 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationController::LoadURLParams params(navigations[i].url); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transition_type = PageTransitionFromInt(navigations[i].transition); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHost* old_host = web_contents->GetRenderViewHost(); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().LoadURLWithParams(params); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WaitForLoadStop(web_contents); 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager()->WaitUntilScreenshotIsReady(); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(old_host, web_contents->GetRenderViewHost()) 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << navigations[i].url.spec(); 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(old_host, screenshot_manager()->screenshot_taken_for()); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetEntryAtOffset(-1)); 522d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(screenshot_manager()->ScreenshotSetForEntry(entry)); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 525d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) web_contents->GetController().GetLastCommittedEntry()); 526d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_FALSE(screenshot_manager()->ScreenshotSetForEntry(entry)); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(entry->screenshot().get()); 528d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) screenshot_manager()->Reset(); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Increase the minimum interval between taking screenshots. 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) set_min_screenshot_interval(60000); 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Navigate again. This should not take any screenshot because of the 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // increased screenshot interval. 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NavigationController::LoadURLParams params(navigations[0].url); 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) params.transition_type = PageTransitionFromInt(navigations[0].transition); 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents->GetController().LoadURLWithParams(params); 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WaitForLoadStop(web_contents); 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screenshot_manager()->WaitUntilScreenshotIsReady(); 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(NULL, screenshot_manager()->screenshot_taken_for()); 543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Failing on win7_aura trybot (see crbug.com/260983). 5467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define MAYBE_ContentWindowReparent \ 5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISABLED_ContentWindowReparent 5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else 5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define MAYBE_ContentWindowReparent ContentWindowReparent 5517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, 5537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MAYBE_ContentWindowReparent) { 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartTestWithPage("files/overscroll_navigation.html")); 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<aura::Window> window(new aura::Window(NULL)); 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window->Init(ui::LAYER_NOT_DRAWN); 559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsImpl* web_contents = 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExecuteSyncJSFunction(web_contents->GetRenderViewHost(), "navigate_next()"); 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* content = web_contents->GetView()->GetContentNativeView(); 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect bounds = content->GetBoundsInRootWindow(); 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::EventGenerator generator(content->GetRootWindow(), content); 568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.GestureScrollSequence( 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Point(bounds.x() + 2, bounds.y() + 10), 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Point(bounds.right() - 10, bounds.y() + 10), 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromMilliseconds(20), 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1); 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window->AddChild(shell()->web_contents()->GetView()->GetContentNativeView()); 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, 578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentWindowClose) { 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StartTestWithPage("files/overscroll_navigation.html")); 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContentsImpl* web_contents = 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExecuteSyncJSFunction(web_contents->GetRenderViewHost(), "navigate_next()"); 585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* content = web_contents->GetView()->GetContentNativeView(); 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect bounds = content->GetBoundsInRootWindow(); 589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::test::EventGenerator generator(content->GetRootWindow(), content); 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) generator.GestureScrollSequence( 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Point(bounds.x() + 2, bounds.y() + 10), 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Point(bounds.right() - 10, bounds.y() + 10), 593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta::FromMilliseconds(20), 594c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1); 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete web_contents->GetView()->GetContentNativeView(); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 599b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(WebContentsViewAuraTest, 600b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RepeatedQuickOverscrollGestures) { 601b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE( 602b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) StartTestWithPage("files/overscroll_navigation.html")); 603b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 604b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) WebContentsImpl* web_contents = 605b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) static_cast<WebContentsImpl*>(shell()->web_contents()); 606b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) NavigationController& controller = web_contents->GetController(); 607b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>( 608b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) web_contents->GetRenderViewHost()); 609b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) WebContentsViewAura* view_aura = static_cast<WebContentsViewAura*>( 610b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) web_contents->GetView()); 611b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view_aura->SetupOverlayWindowForTesting(); 612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "install_touch_handler()"); 613b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 614b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Navigate twice, then navigate back in history once. 615b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 616b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ExecuteSyncJSFunction(view_host, "navigate_next()"); 617b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, GetCurrentIndex()); 618b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(controller.CanGoBack()); 619b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(controller.CanGoForward()); 620b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 621b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) web_contents->GetController().GoBack(); 622b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) WaitForLoadStop(web_contents); 623b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, GetCurrentIndex()); 624d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(base::ASCIIToUTF16("Title: #1"), web_contents->GetTitle()); 625b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(controller.CanGoBack()); 626b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(controller.CanGoForward()); 627b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 628b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) aura::Window* content = web_contents->GetView()->GetContentNativeView(); 629b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gfx::Rect bounds = content->GetBoundsInRootWindow(); 630b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) aura::test::EventGenerator generator(content->GetRootWindow(), content); 631b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 632b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Do a swipe left to start a forward navigation. Then quickly do a swipe 633b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // right. 634b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) string16 expected_title = ASCIIToUTF16("Title: #2"); 635b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) content::TitleWatcher title_watcher(web_contents, expected_title); 636d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) NavigationWatcher nav_watcher(web_contents); 637b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 638b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) generator.GestureScrollSequence( 639b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gfx::Point(bounds.right() - 10, bounds.y() + 10), 640b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gfx::Point(bounds.x() + 2, bounds.y() + 10), 641b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::TimeDelta::FromMilliseconds(2000), 642b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 10); 643d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) nav_watcher.WaitUntilNavigationStarts(); 644d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 645b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) generator.GestureScrollSequence( 646b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gfx::Point(bounds.x() + 2, bounds.y() + 10), 647b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gfx::Point(bounds.right() - 10, bounds.y() + 10), 648b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::TimeDelta::FromMilliseconds(2000), 649b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 10); 650b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) string16 actual_title = title_watcher.WaitAndGetTitle(); 651b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(expected_title, actual_title); 652b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 653b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(2, GetCurrentIndex()); 654b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(controller.CanGoBack()); 655b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_FALSE(controller.CanGoForward()); 656b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 657b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 659