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