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