chrome_render_widget_host_view_mac_delegate_browsertest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
12cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// Copyright 2013 The Chromium Authors. All rights reserved.
22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// Use of this source code is governed by a BSD-style license that can be
32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// found in the LICENSE file.
42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/basictypes.h"
62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/files/file_path.h"
72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/ui/browser.h"
82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/ui/browser_commands.h"
92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/ui/browser_tabstrip.h"
102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/ui/tabs/tab_strip_model.h"
112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/common/chrome_notification_types.h"
122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/test/base/in_process_browser_test.h"
132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/test/base/ui_test_utils.h"
142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/public/browser/notification_service.h"
15e7785040107266d01ebdcc066365f70b7ace371fDouglas Gregor#include "content/public/browser/notification_source.h"
163251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor#include "content/public/browser/render_view_host.h"
172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/public/browser/web_contents.h"
182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/public/test/browser_test_utils.h"
192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "net/base/net_util.h"
200b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor#include "url/gurl.h"
212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
227c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattnerclass ChromeRenderWidgetHostViewMacDelegateTest : public InProcessBrowserTest {
237c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner public:
2483d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff  ChromeRenderWidgetHostViewMacDelegateTest() {
2514f79002e58556798e86168c63e48d533287eda5Douglas Gregor    const base::FilePath base_path(FILE_PATH_LITERAL("scroll"));
263251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor    url1_ = ui_test_utils::GetTestUrl(
2714f79002e58556798e86168c63e48d533287eda5Douglas Gregor        base_path, base::FilePath(FILE_PATH_LITERAL("text.html")));
28bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor    url2_ = ui_test_utils::GetTestUrl(
292bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor        base_path, base::FilePath(FILE_PATH_LITERAL("blank.html")));
3017fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor  }
3117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor protected:
332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // Navigates back.
3414f79002e58556798e86168c63e48d533287eda5Douglas Gregor  void GoBack() {
353c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner    content::WindowedNotificationObserver observer(
362cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        content::NOTIFICATION_LOAD_STOP,
372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        content::NotificationService::AllSources());
382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    chrome::GoBack(browser(), CURRENT_TAB);
392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    observer.Wait();
402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
4112b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner
422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // Returns the active web contents.
432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  content::WebContents* GetWebContents() {
442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    return browser()->tab_strip_model()->GetActiveWebContents();
452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // Returns the value of |query| from Javascript as an int.
482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  int GetScriptIntValue(const std::string& query) {
492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    int value = 0;
502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        GetWebContents(),
524fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor        "domAutomationController.send(" + query + ")",
532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        &value));
542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    return value;
552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // Returns the vertical scroll offset of the current page.
582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  int GetScrollTop() {
592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    return GetScriptIntValue("document.body.scrollTop");
602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // Returns the horizontal scroll offset of the current page.
632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  int GetScrollLeft() {
642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    return GetScriptIntValue("document.body.scrollLeft");
652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // Simulates a mouse wheel event, forwarding it to the renderer.
682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  void SendWheelEvent(int dx, int dy, WebKit::WebMouseWheelEvent::Phase phase) {
692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    WebKit::WebMouseWheelEvent event;
702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    event.type = WebKit::WebInputEvent::MouseWheel;
712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    event.phase = phase;
722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    event.deltaX = dx;
732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    event.deltaY = dy;
742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    event.wheelTicksY = -2;
752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    event.hasPreciseScrollingDeltas = 1;
762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    GetWebContents()->GetRenderViewHost()->ForwardWheelEvent(event);
772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  GURL url1_;
802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  GURL url2_;
812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor private:
832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  DISALLOW_COPY_AND_ASSIGN(ChromeRenderWidgetHostViewMacDelegateTest);
842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor};
852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorIN_PROC_BROWSER_TEST_F(ChromeRenderWidgetHostViewMacDelegateTest,
872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                       GoBackScrollOffset) {
882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ui_test_utils::NavigateToURL(browser(), url1_);
892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(url1_, GetWebContents()->GetURL());
902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  SendWheelEvent(0, -200, WebKit::WebMouseWheelEvent::PhaseNone);
922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  const int scroll_offset = GetScrollTop();
932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_NE(0, scroll_offset);
942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ui_test_utils::NavigateToURL(browser(), url2_);
962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(url2_, GetWebContents()->GetURL());
972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(0, GetScrollTop());
982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  GoBack();
1002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(url1_, GetWebContents()->GetURL());
1012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(scroll_offset, GetScrollTop());
1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorIN_PROC_BROWSER_TEST_F(ChromeRenderWidgetHostViewMacDelegateTest,
1052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                       GoBackUsingGestureScrollOffset) {
1062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ui_test_utils::NavigateToURL(browser(), url1_);
1072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(url1_, GetWebContents()->GetURL());
1082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  SendWheelEvent(0, -200, WebKit::WebMouseWheelEvent::PhaseNone);
1102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  const int scroll_offset = GetScrollTop();
1112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_NE(0, scroll_offset);
1122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ui_test_utils::NavigateToURL(browser(), url2_);
1142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(url2_, GetWebContents()->GetURL());
1152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(0, GetScrollTop());
1162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // Send wheel events that shouldn't be handled by the web content since it's
1182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // not scrollable in the horizontal direction.
1192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  SendWheelEvent(500, 0, WebKit::WebMouseWheelEvent::PhaseBegan);
1202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  SendWheelEvent(500, 0, WebKit::WebMouseWheelEvent::PhaseEnded);
1212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(0, GetScrollLeft());
1222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // Simulate a back being triggered as a result of the unhandled wheel events.
1242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // This doesn't invoke the code in ChromeRenderWidgetHostViewMacDelegate
1252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  // because that expects NSEvents which are much harder to fake.
1262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  GoBack();
1272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(url1_, GetWebContents()->GetURL());
1282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  ASSERT_EQ(scroll_offset, GetScrollTop());
1292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor