| Index: chrome/browser/mouseleave_browsertest.cc
|
| diff --git a/chrome/browser/mouseleave_browsertest.cc b/chrome/browser/mouseleave_browsertest.cc
|
| index 416b081f112b51b7f0acaec195cefb78fef5393a..c4bcbcf450b7adfa431e017cdcb9f1256c18e822 100644
|
| --- a/chrome/browser/mouseleave_browsertest.cc
|
| +++ b/chrome/browser/mouseleave_browsertest.cc
|
| @@ -4,11 +4,17 @@
|
|
|
| #include "base/files/file_path.h"
|
| #include "base/strings/utf_string_conversions.h"
|
| +#include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
|
| +#include "chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h"
|
| #include "chrome/browser/ui/browser.h"
|
| +#include "chrome/browser/ui/browser_commands.h"
|
| +#include "chrome/browser/ui/browser_finder.h"
|
| #include "chrome/browser/ui/browser_window.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 "components/app_modal/app_modal_dialog.h"
|
| +#include "content/public/browser/render_frame_host.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/test/browser_test_utils.h"
|
| #include "ui/base/test/ui_controls.h"
|
| @@ -19,24 +25,19 @@ class MouseLeaveTest : public InProcessBrowserTest {
|
| public:
|
| MouseLeaveTest() {}
|
|
|
| - void MouseLeaveTestCommon() {
|
| + void LoadTestPageAndWaitForMouseOver(content::WebContents* tab) {
|
| + gfx::Rect tab_view_bounds = tab->GetContainerBounds();
|
| GURL test_url = ui_test_utils::GetTestUrl(
|
| base::FilePath(), base::FilePath(FILE_PATH_LITERAL("mouseleave.html")));
|
|
|
| - content::WebContents* tab =
|
| - browser()->tab_strip_model()->GetActiveWebContents();
|
| - gfx::Rect tab_view_bounds = tab->GetContainerBounds();
|
| -
|
| - gfx::Point in_content_point(
|
| - tab_view_bounds.x() + tab_view_bounds.width() / 2,
|
| - tab_view_bounds.y() + 10);
|
| - gfx::Point above_content_point(
|
| - tab_view_bounds.x() + tab_view_bounds.width() / 2,
|
| - tab_view_bounds.y() - 2);
|
| + gfx::Point in_content(tab_view_bounds.x() + tab_view_bounds.width() / 2,
|
| + tab_view_bounds.y() + 10);
|
| + out_of_content_ =
|
| + gfx::Point(tab_view_bounds.x() + tab_view_bounds.width() / 2,
|
| + tab_view_bounds.y() - 2);
|
|
|
| // Start by moving the point just above the content.
|
| - ui_controls::SendMouseMove(above_content_point.x(),
|
| - above_content_point.y());
|
| + ui_controls::SendMouseMove(out_of_content_.x(), out_of_content_.y());
|
|
|
| // Navigate to the test html page.
|
| base::string16 load_expected_title(base::ASCIIToUTF16("onload"));
|
| @@ -46,19 +47,25 @@ class MouseLeaveTest : public InProcessBrowserTest {
|
| // next part of the test.
|
| EXPECT_EQ(load_expected_title, load_title_watcher.WaitAndGetTitle());
|
|
|
| - // Move the cursor to the top-center of the content, which will trigger
|
| + // Move the cursor to the top-center of the content which will trigger
|
| // a javascript onMouseOver event.
|
| - ui_controls::SendMouseMove(in_content_point.x(), in_content_point.y());
|
| + ui_controls::SendMouseMove(in_content.x(), in_content.y());
|
|
|
| // Wait on the correct intermediate title.
|
| base::string16 entered_expected_title(base::ASCIIToUTF16("entered"));
|
| content::TitleWatcher entered_title_watcher(tab, entered_expected_title);
|
| EXPECT_EQ(entered_expected_title, entered_title_watcher.WaitAndGetTitle());
|
| + }
|
| +
|
| + void MouseLeaveTestCommon() {
|
| + content::WebContents* tab =
|
| + browser()->tab_strip_model()->GetActiveWebContents();
|
| +
|
| + EXPECT_NO_FATAL_FAILURE(LoadTestPageAndWaitForMouseOver(tab));
|
|
|
| // Move the cursor above the content again, which should trigger
|
| // a javascript onMouseOut event.
|
| - ui_controls::SendMouseMove(above_content_point.x(),
|
| - above_content_point.y());
|
| + ui_controls::SendMouseMove(out_of_content_.x(), out_of_content_.y());
|
|
|
| // Wait on the correct final value of the cookie.
|
| base::string16 left_expected_title(base::ASCIIToUTF16("left"));
|
| @@ -66,6 +73,9 @@ class MouseLeaveTest : public InProcessBrowserTest {
|
| EXPECT_EQ(left_expected_title, left_title_watcher.WaitAndGetTitle());
|
| }
|
|
|
| + // The coordinates out of the content to move the mouse point
|
| + gfx::Point out_of_content_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(MouseLeaveTest);
|
| };
|
|
|
| @@ -95,4 +105,68 @@ IN_PROC_BROWSER_TEST_F(MouseLeaveTest, MouseDownOnBrowserCaption) {
|
| }
|
| #endif
|
|
|
| +#if defined(OS_WIN) || defined(OS_MACOSX)
|
| +// Test that a mouseleave is not triggered when showing the context menu.
|
| +// If the test is failed, it means that Blink gets the mouseleave event
|
| +// when showing the context menu and it could make the unexpecting
|
| +// content behavior such as clearing the hover status.
|
| +// Please refer to the below issue for understanding what happens .
|
| +// TODO: Make test pass on OS_WIN and OS_MACOSX
|
| +// OS_WIN: http://crbug.com/450138
|
| +// OS_MACOSX: Missing automation provider support: http://crbug.com/45892.
|
| +#define MAYBE_ContextMenu DISABLED_ContextMenu
|
| +#else
|
| +#define MAYBE_ContextMenu ContextMenu
|
| +#endif
|
| +
|
| +IN_PROC_BROWSER_TEST_F(MouseLeaveTest, MAYBE_ContextMenu) {
|
| + content::WebContents* tab =
|
| + browser()->tab_strip_model()->GetActiveWebContents();
|
| +
|
| + EXPECT_NO_FATAL_FAILURE(LoadTestPageAndWaitForMouseOver(tab));
|
| +
|
| + ContextMenuWaiter menu_observer(content::NotificationService::AllSources());
|
| + ui_controls::SendMouseClick(ui_controls::RIGHT);
|
| + // Wait until the context menu is opened and closed.
|
| + menu_observer.WaitForMenuOpenAndClose();
|
| +
|
| + tab->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16("done()"));
|
| + const base::string16 success_title = base::ASCIIToUTF16("without mouseleave");
|
| + const base::string16 failure_title = base::ASCIIToUTF16("with mouseleave");
|
| + content::TitleWatcher done_title_watcher(tab, success_title);
|
| + done_title_watcher.AlsoWaitForTitle(failure_title);
|
| +
|
| + EXPECT_EQ(success_title, done_title_watcher.WaitAndGetTitle());
|
| +}
|
| +
|
| +#if defined(OS_WIN) || defined(OS_MACOSX)
|
| +// Test that a mouseleave is not triggered when showing a modal dialog.
|
| +// Sample regression: crbug.com/394672
|
| +// TODO: Make test pass on OS_WIN and OS_MACOSX
|
| +// OS_WIN: http://crbug.com/450138
|
| +// OS_MACOSX: Missing automation provider support: http://crbug.com/45892.
|
| +#define MAYBE_ModalDialog DISABLED_ModalDialog
|
| +#else
|
| +#define MAYBE_ModalDialog ModalDialog
|
| +#endif
|
| +
|
| +IN_PROC_BROWSER_TEST_F(MouseLeaveTest, MAYBE_ModalDialog) {
|
| + content::WebContents* tab =
|
| + browser()->tab_strip_model()->GetActiveWebContents();
|
| +
|
| + EXPECT_NO_FATAL_FAILURE(LoadTestPageAndWaitForMouseOver(tab));
|
| +
|
| + tab->GetMainFrame()->ExecuteJavaScript(base::UTF8ToUTF16("alert()"));
|
| + app_modal::AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
|
| + // Cancel the dialog.
|
| + alert->CloseModalDialog();
|
| +
|
| + tab->GetMainFrame()->ExecuteJavaScript(base::ASCIIToUTF16("done()"));
|
| + const base::string16 success_title = base::ASCIIToUTF16("without mouseleave");
|
| + const base::string16 failure_title = base::ASCIIToUTF16("with mouseleave");
|
| + content::TitleWatcher done_title_watcher(tab, success_title);
|
| + done_title_watcher.AlsoWaitForTitle(failure_title);
|
| + EXPECT_EQ(success_title, done_title_watcher.WaitAndGetTitle());
|
| +}
|
| +
|
| } // namespace
|
|
|