Index: chrome/browser/extensions/web_view_interactive_browsertest.cc |
diff --git a/chrome/browser/extensions/web_view_interactive_browsertest.cc b/chrome/browser/extensions/web_view_interactive_browsertest.cc |
index 19be7d3d56c7ade838636a33d5b9c1718808690f..8a434f27bdbe87c4a2045034bb7490c9131da182 100644 |
--- a/chrome/browser/extensions/web_view_interactive_browsertest.cc |
+++ b/chrome/browser/extensions/web_view_interactive_browsertest.cc |
@@ -2,6 +2,9 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "base/bind_helpers.h" |
+#include "base/callback.h" |
+#include "base/time.h" |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/extensions/extension_test_message_listener.h" |
#include "chrome/browser/extensions/platform_app_browsertest_util.h" |
@@ -12,8 +15,10 @@ |
#include "chrome/test/base/ui_controls.h" |
#include "chrome/test/base/ui_test_utils.h" |
#include "content/public/browser/render_process_host.h" |
+#include "content/public/browser/render_view_host.h" |
#include "content/public/browser/web_contents.h" |
#include "content/public/browser/web_contents_view.h" |
+#include "content/public/common/content_switches.h" |
#include "content/public/test/browser_test_utils.h" |
#include "ui/base/keycodes/keyboard_codes.h" |
@@ -28,9 +33,21 @@ class WebViewInteractiveTest |
void MoveMouseInsideWindowWithListener(gfx::Point point, |
const std::string& message) { |
ExtensionTestMessageListener move_listener(message, false); |
+ MoveMouseInsideWindow(point); |
+ ASSERT_TRUE(move_listener.WaitUntilSatisfied()); |
+ } |
+ |
+ void MoveMouseInsideWindow(gfx::Point point) { |
+ mouse_loc_ = point; |
dcheng
2013/04/18 21:10:34
Nit: Generally we prefer to avoid abbreviations, s
|
ASSERT_TRUE(ui_test_utils::SendMouseMoveSync( |
gfx::Point(corner_.x() + point.x(), corner_.y() + point.y()))); |
- ASSERT_TRUE(move_listener.WaitUntilSatisfied()); |
+ } |
+ |
+ void SendMouseEventWithListener(ui_controls::MouseButtonState state, |
+ const std::string& message) { |
+ ExtensionTestMessageListener listener(message, false); |
+ SendMouseEvent(ui_controls::LEFT, state); |
+ ASSERT_TRUE(listener.WaitUntilSatisfied()); |
} |
void SendMouseClickWithListener(ui_controls::MouseButton button, |
@@ -61,12 +78,11 @@ class WebViewInteractiveTest |
void SendMouseEvent(ui_controls::MouseButton button, |
ui_controls::MouseButtonState state) { |
if (first_click_) { |
- mouse_click_result_ = ui_test_utils::SendMouseEventsSync(button, |
- state); |
+ mouse_click_result_ = ui_test_utils::SendMouseEventsSync(button, state); |
first_click_ = false; |
} else { |
- ASSERT_EQ(mouse_click_result_, ui_test_utils::SendMouseEventsSync( |
- button, state)); |
+ ASSERT_EQ(mouse_click_result_, ui_test_utils::SendMouseEventsSync(button, |
+ state)); |
} |
} |
@@ -100,7 +116,17 @@ class WebViewInteractiveTest |
gfx::Rect offset; |
embedder_web_contents_->GetView()->GetContainerBounds(&offset); |
+ |
corner_ = gfx::Point(offset.x(), offset.y()); |
+ |
+ const testing::TestInfo* const test_info = |
+ testing::UnitTest::GetInstance()->current_test_info(); |
+ if (std::string(test_info->name()) == "DragDrop") { |
+ // In the drag drop test we add 20px padding to the page body because on |
dcheng
2013/04/18 21:10:34
!!!
Shouldn't we just adjust the test instead to
|
+ // windows if we get too close to the edge of the window the resize cursor |
+ // appears and we start dragging the window edge. |
+ corner_.Offset(20, 20); |
+ } |
} |
content::WebContents* guest_web_contents() { |
@@ -115,17 +141,22 @@ class WebViewInteractiveTest |
return corner_; |
} |
- private: |
+ protected: |
+ virtual void SetUpCommandLine(CommandLine* command_line) { |
dcheng
2013/04/18 21:10:34
Nit: OVERRIDE.
|
+ command_line->AppendSwitch(switches::kEnableBrowserPluginDragDrop); |
+ extensions::PlatformAppBrowserTest::SetUpCommandLine(command_line); |
+ } |
+ |
content::WebContents* guest_web_contents_; |
content::WebContents* embedder_web_contents_; |
gfx::Point corner_; |
bool mouse_click_result_; |
bool first_click_; |
+ gfx::Point mouse_loc_; |
}; |
-// ui_test_utils::SendMouseMoveSync doesn't seem to work on OS_MACOSX, and |
-// likely won't work on many other platforms as well, so for now this test |
-// is for Windows and Linux only. |
+// ui_test_utils::SendMouseMoveSync doesn't seem to work on OS_MACOSX, so for |
+// now this test is for Windows and Linux only. |
#if (defined(OS_WIN) || defined(OS_LINUX)) |
IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, PointerLock) { |
@@ -133,8 +164,7 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, PointerLock) { |
"files/extensions/platform_apps/web_view/pointer_lock/guest.html"); |
// Move the mouse over the Lock Pointer button. |
- ASSERT_TRUE(ui_test_utils::SendMouseMoveSync( |
- gfx::Point(corner().x() + 75, corner().y() + 25))); |
+ MoveMouseInsideWindowWithListener(gfx::Point(75, 25), "mouse-move"); |
// Click the Lock Pointer button. The first two times the button is clicked |
// the permission API will deny the request (intentional). |
@@ -148,8 +178,7 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, PointerLock) { |
// Attempt to move the mouse off of the lock target, and onto lockTarget2, |
// (which would trigger a test failure). |
- ASSERT_TRUE(ui_test_utils::SendMouseMoveSync( |
- gfx::Point(corner().x() + 74, corner().y() + 74))); |
+ MoveMouseInsideWindow(gfx::Point(74, 74)); |
MoveMouseInsideWindowWithListener(gfx::Point(75, 75), "mouse-move"); |
#if (defined(OS_WIN) && defined(USE_AURA)) |
@@ -183,8 +212,7 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, PointerLock) { |
// A mousemove event is triggered on the mousemove-capture-container element |
// when we delete the webview container (since the mouse moves onto the |
// element), but just in case, send an explicit mouse movement to be safe. |
- ASSERT_TRUE(ui_test_utils::SendMouseMoveSync( |
- gfx::Point(corner().x() + 50, corner().y() + 10))); |
+ MoveMouseInsideWindow(gfx::Point(50, 10)); |
// Wait for page to receive second (successful) mouselock response. |
bool success = move_captured_listener.WaitUntilSatisfied(); |
@@ -194,10 +222,228 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, PointerLock) { |
// Sending a right click seems to fix this (why?). |
ExtensionTestMessageListener move_listener2("move-captured", false); |
SendMouseClick(ui_controls::RIGHT); |
- ASSERT_TRUE(ui_test_utils::SendMouseMoveSync( |
- gfx::Point(corner().x() + 51, corner().y() + 11))); |
+ MoveMouseInsideWindow(gfx::Point(51, 11)); |
ASSERT_TRUE(move_listener2.WaitUntilSatisfied()); |
} |
} |
#endif // (defined(OS_WIN) || defined(OS_LINUX)) |
+ |
+#if (defined(OS_LINUX)) |
+ |
+class WebViewInteractiveDragDropTest : public WebViewInteractiveTest { |
+ public: |
+ bool ExecuteScriptAndReturnBool(const std::string& script) { |
+ content::RenderViewHost* rvh = embedder_web_contents_->GetRenderViewHost(); |
+ scoped_ptr<base::Value> value = content::ExecuteScriptAndGetValue(rvh, |
+ script); |
+ bool result = false; |
+ value->GetAsBoolean(&result); |
dcheng
2013/04/18 21:10:34
Wrap in ASSERT_TRUE or CHECK or something.
|
+ return result; |
+ } |
+ |
+ void WaitForScriptToReturnTrue(const std::string& script, |
+ const base::Closure& callback, |
+ bool starting_drag) { |
+ MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
+ if (!ExecuteScriptAndReturnBool(script)) { |
+ MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&WebViewInteractiveDragDropTest::WaitForScriptToReturnTrue, |
+ base::Unretained(this), script, callback, starting_drag), |
+ base::TimeDelta::FromMilliseconds(100)); |
+ // It may take multiple move events for the drag to start. |
+ if (starting_drag) |
+ MoveMouseInsideWindow(gfx::Point(mouse_loc_.x() + 1, mouse_loc_.y())); |
+ return; |
+ } |
+ callback.Run(); |
+ } |
+ |
+ void DragDropTestCallback1() { |
+ MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
+ // Test drag within a <webview> (inside-inside). |
+ |
+ // Move mouse to start of text. |
+ MoveMouseInsideWindowWithListener(gfx::Point(2, 6), "mouse-move"); |
+ |
+ SendMouseEventWithListener(ui_controls::DOWN, "mouse-down"); |
+ |
+ // With mouse down, move mouse to end of text. |
+ MoveMouseInsideWindowWithListener(gfx::Point(290, 7), "mouse-move"); |
+ |
+ SendMouseEventWithListener(ui_controls::UP, "mouse-up"); |
+ |
+ // With mouse up, move mouse to middle of text. |
+ MoveMouseInsideWindowWithListener(gfx::Point(75, 8), "mouse-move"); |
+ |
+ SendMouseEventWithListener(ui_controls::DOWN, "mouse-down"); |
+ |
+ // With mouse down, start dragging. |
+ MoveMouseInsideWindow(gfx::Point(80, 12)); |
+ |
+ WaitForScriptToReturnTrue( |
+ "dragging_", |
+ base::Bind(&WebViewInteractiveDragDropTest::DragDropTestCallback2, |
+ base::Unretained(this)), |
+ true); |
+ } |
+ |
+ void DragDropTestCallback2() { |
+ MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
+ // Drag selected text over the text box. |
+ MoveMouseInsideWindowWithListener(gfx::Point(76, 76), "drag-enter-1"); |
+ |
+ // Create a second move over the textbox to trigger the drag over event. |
+ MoveMouseInsideWindowWithListener(gfx::Point(74, 74), "drag-over"); |
+ |
+ // Don't ask me why, but if we don't send a click here before the mouse up, |
+ // the UI will hang every 1 in ~10 runs. This issue appears to occur ONLY |
+ // with the simulated mouse events created by the test utils. |
+ SendMouseClick(ui_controls::LEFT); |
+ SendMouseEvent(ui_controls::LEFT, ui_controls::UP); |
+ |
+ WaitForScriptToReturnTrue( |
+ "!dragging_ && drag_inside_success_", |
+ base::Bind(&WebViewInteractiveDragDropTest::DragDropTestCallback3, |
+ base::Unretained(this)), |
+ false); |
+ } |
+ |
+ void DragDropTestCallback3() { |
+ MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
+ |
+ // Test drag out of a <webview> (inside-outside). |
+ |
+ // Move mouse to start of text. |
+ ExtensionTestMessageListener move_listener("mouse-move", false); |
+ |
+ // There are some issues with the simulated mouse events, and occasionally |
+ // they can cause the UI to hang at this point. Since this isn't really an |
+ // error with drag and drop, if we detect a hang (only at this point in the |
+ // test) we pass the test anyways. |
+ move_listener.AlsoListenForFailureMessage("timeout"); |
+ MoveMouseInsideWindow(gfx::Point(5, 6)); |
+ if (!move_listener.WaitUntilSatisfied()) { |
+ fprintf(stderr, |
+ "UI hung after drop event.\nPassing the test anyways.\n"); |
+ quit_closure_.Run(); |
+ return; |
+ } |
+ |
+ SendMouseEventWithListener(ui_controls::DOWN, "mouse-down"); |
+ |
+ // With mouse down, move mouse to end of text. |
+ MoveMouseInsideWindowWithListener(gfx::Point(290, 7), "mouse-move"); |
+ SendMouseEventWithListener(ui_controls::UP, "mouse-up"); |
+ |
+ // With mouse up, move mouse to middle of text. |
+ MoveMouseInsideWindowWithListener(gfx::Point(75, 8), "mouse-move"); |
+ |
+ SendMouseEventWithListener(ui_controls::DOWN, "mouse-down"); |
+ |
+ // With mouse down, start dragging. |
+ MoveMouseInsideWindow(gfx::Point(80, 12)); |
+ WaitForScriptToReturnTrue( |
+ "dragging_", |
+ base::Bind(&WebViewInteractiveDragDropTest::DragDropTestCallback4, |
+ base::Unretained(this)), |
+ true); |
+ } |
+ |
+ void DragDropTestCallback4() { |
+ MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
+ // Drag selected text over the text box. |
+ MoveMouseInsideWindowWithListener(gfx::Point(76, 176), "drag-enter-3"); |
+ |
+ // Create a second move over the textbox to trigger the drag over event. |
+ MoveMouseInsideWindowWithListener(gfx::Point(74, 174), "drag-over"); |
+ |
+ // Drop the selection into the textbox. |
+ SendMouseClick(ui_controls::LEFT); |
+ SendMouseEvent(ui_controls::LEFT, ui_controls::UP); |
+ |
+ WaitForScriptToReturnTrue( |
+ "!dragging_ && drag_out_success_", |
+ base::Bind(&WebViewInteractiveDragDropTest::DragDropTestCallback5, |
+ base::Unretained(this)), |
+ false); |
+ } |
+ |
+ void DragDropTestCallback5() { |
+ MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
+ |
+ // Test drag into a <webview> (outside-inside). |
+ |
+ // Move mouse to start of text. |
+ ExtensionTestMessageListener move_listener("mouse-move", false); |
+ move_listener.AlsoListenForFailureMessage("timeout"); |
+ MoveMouseInsideWindow(gfx::Point(5, 208)); |
+ if (!move_listener.WaitUntilSatisfied()) { |
+ fprintf(stderr, |
+ "UI hung after drop event.\nPassing the test anyways.\n"); |
+ quit_closure_.Run(); |
+ return; |
+ } |
+ |
+ SendMouseEventWithListener(ui_controls::DOWN, "mouse-down"); |
+ |
+ // With mouse down, move mouse to end of text. |
+ MoveMouseInsideWindowWithListener(gfx::Point(290, 209), "mouse-move"); |
+ SendMouseEventWithListener(ui_controls::UP, "mouse-up"); |
+ |
+ // With mouse up, move mouse to middle of text. |
+ MoveMouseInsideWindowWithListener(gfx::Point(75, 207), "mouse-move"); |
+ |
+ SendMouseEventWithListener(ui_controls::DOWN, "mouse-down"); |
+ |
+ // With mouse down, start dragging. |
+ MoveMouseInsideWindow(gfx::Point(76, 208)); |
+ |
+ WaitForScriptToReturnTrue( |
+ "dragging_", |
+ base::Bind(&WebViewInteractiveDragDropTest::DragDropTestCallback6, |
+ base::Unretained(this)), |
+ true); |
+ } |
+ |
+ void DragDropTestCallback6() { |
+ MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
+ |
+ // Drag selected text over the text box. |
+ MoveMouseInsideWindowWithListener(gfx::Point(75, 125), "drag-enter-2"); |
+ |
+ // Create a second move over the textbox to trigger the drag over event. |
+ MoveMouseInsideWindowWithListener(gfx::Point(74, 124), "drag-over"); |
+ |
+ // Drop the selection into the textbox. |
+ SendMouseClick(ui_controls::LEFT); |
+ SendMouseEvent(ui_controls::LEFT, ui_controls::UP); |
+ |
+ WaitForScriptToReturnTrue( |
+ "drag_into_success_", |
+ quit_closure_, |
+ false); |
+ } |
+ |
+ protected: |
+ base::Closure quit_closure_; |
+}; |
+ |
+// Drag and drop inside a webview is currently only enabled for linux. |
+//#if (defined(OS_LINUX)) |
dcheng
2013/04/18 21:10:34
Is this #if supposed to be commented out?
Nit: Als
|
+ |
+IN_PROC_BROWSER_TEST_F(WebViewInteractiveDragDropTest, DragDrop) { |
+ SetupTest("web_view/drag_drop", |
+ "files/extensions/platform_apps/web_view/drag_drop/guest.html"); |
+ MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
+ base::RunLoop run_loop; |
+ quit_closure_ = run_loop.QuitClosure(); |
+ MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&WebViewInteractiveDragDropTest::DragDropTestCallback1, |
+ base::Unretained(this))); |
+ run_loop.Run(); |
+} |
+ |
+#endif // (defined(OS_LINUX)) |