blob: 9553c4e4d9b4e65234b5657a50126f0af7d019f3 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/basictypes.h"
#include "base/files/file_path.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#include "net/base/net_util.h"
#include "url/gurl.h"
class ChromeRenderWidgetHostViewMacDelegateTest : public InProcessBrowserTest {
public:
ChromeRenderWidgetHostViewMacDelegateTest() {
const base::FilePath base_path(FILE_PATH_LITERAL("scroll"));
url1_ = ui_test_utils::GetTestUrl(
base_path, base::FilePath(FILE_PATH_LITERAL("text.html")));
url2_ = ui_test_utils::GetTestUrl(
base_path, base::FilePath(FILE_PATH_LITERAL("blank.html")));
}
protected:
// Navigates back.
void GoBack() {
content::WindowedNotificationObserver observer(
content::NOTIFICATION_LOAD_STOP,
content::NotificationService::AllSources());
chrome::GoBack(browser(), CURRENT_TAB);
observer.Wait();
}
// Returns the active web contents.
content::WebContents* GetWebContents() {
return browser()->tab_strip_model()->GetActiveWebContents();
}
// Returns the value of |query| from Javascript as an int.
int GetScriptIntValue(const std::string& query) {
int value = 0;
EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
GetWebContents(),
"domAutomationController.send(" + query + ")",
&value));
return value;
}
// Returns the vertical scroll offset of the current page.
int GetScrollTop() {
return GetScriptIntValue("document.body.scrollTop");
}
// Returns the horizontal scroll offset of the current page.
int GetScrollLeft() {
return GetScriptIntValue("document.body.scrollLeft");
}
// Simulates a mouse wheel event, forwarding it to the renderer.
void SendWheelEvent(int dx, int dy, blink::WebMouseWheelEvent::Phase phase) {
blink::WebMouseWheelEvent event;
event.type = blink::WebInputEvent::MouseWheel;
event.phase = phase;
event.deltaX = dx;
event.deltaY = dy;
event.wheelTicksY = -2;
event.hasPreciseScrollingDeltas = 1;
GetWebContents()->GetRenderViewHost()->ForwardWheelEvent(event);
}
GURL url1_;
GURL url2_;
private:
DISALLOW_COPY_AND_ASSIGN(ChromeRenderWidgetHostViewMacDelegateTest);
};
IN_PROC_BROWSER_TEST_F(ChromeRenderWidgetHostViewMacDelegateTest,
GoBackScrollOffset) {
ui_test_utils::NavigateToURL(browser(), url1_);
ASSERT_EQ(url1_, GetWebContents()->GetURL());
SendWheelEvent(0, -200, blink::WebMouseWheelEvent::PhaseNone);
const int scroll_offset = GetScrollTop();
ASSERT_NE(0, scroll_offset);
ui_test_utils::NavigateToURL(browser(), url2_);
ASSERT_EQ(url2_, GetWebContents()->GetURL());
ASSERT_EQ(0, GetScrollTop());
GoBack();
ASSERT_EQ(url1_, GetWebContents()->GetURL());
ASSERT_EQ(scroll_offset, GetScrollTop());
}
IN_PROC_BROWSER_TEST_F(ChromeRenderWidgetHostViewMacDelegateTest,
GoBackUsingGestureScrollOffset) {
ui_test_utils::NavigateToURL(browser(), url1_);
ASSERT_EQ(url1_, GetWebContents()->GetURL());
SendWheelEvent(0, -200, blink::WebMouseWheelEvent::PhaseNone);
const int scroll_offset = GetScrollTop();
ASSERT_NE(0, scroll_offset);
ui_test_utils::NavigateToURL(browser(), url2_);
ASSERT_EQ(url2_, GetWebContents()->GetURL());
ASSERT_EQ(0, GetScrollTop());
// Send wheel events that shouldn't be handled by the web content since it's
// not scrollable in the horizontal direction.
SendWheelEvent(500, 0, blink::WebMouseWheelEvent::PhaseBegan);
SendWheelEvent(500, 0, blink::WebMouseWheelEvent::PhaseEnded);
ASSERT_EQ(0, GetScrollLeft());
// Simulate a back being triggered as a result of the unhandled wheel events.
// This doesn't invoke the code in ChromeRenderWidgetHostViewMacDelegate
// because that expects NSEvents which are much harder to fake.
GoBack();
ASSERT_EQ(url1_, GetWebContents()->GetURL());
ASSERT_EQ(scroll_offset, GetScrollTop());
}