Index: content/browser/browser_plugin/browser_plugin_host_browsertest.cc |
diff --git a/content/browser/browser_plugin/browser_plugin_host_browsertest.cc b/content/browser/browser_plugin/browser_plugin_host_browsertest.cc |
index 4f19031bd257bc3f4d7913ec9b181737d401f87d..907a7c88a9596a4242c51569d7e086152488a01e 100644 |
--- a/content/browser/browser_plugin/browser_plugin_host_browsertest.cc |
+++ b/content/browser/browser_plugin/browser_plugin_host_browsertest.cc |
@@ -17,6 +17,7 @@ |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/notification_types.h" |
#include "content/public/browser/render_view_host_observer.h" |
+#include "content/public/browser/render_widget_host_view.h" |
#include "content/public/common/content_switches.h" |
#include "content/public/test/browser_test_utils.h" |
#include "content/public/test/test_utils.h" |
@@ -35,9 +36,9 @@ using content::BrowserPluginHostFactory; |
namespace { |
-const char* kHTMLForGuest = |
+const char kHTMLForGuest[] = |
"data:text/html,<html><body>hello world</body></html>"; |
-const char* kHTMLForGuestInfiniteLoop = |
+const char kHTMLForGuestInfiniteLoop[] = |
"data:text/html,<html><head><script type=\"text/javascript\">" |
"function StartInfiniteLoop() {" |
" setTimeout(function () {while (true) {} }, 0);" |
@@ -56,11 +57,22 @@ const char kHTMLForGuestTouchHandler[] = |
" handler);" |
"}" |
"</script></html>"; |
-const char* kHTMLForGuestWithTitle = |
+const char kHTMLForGuestWithTitle[] = |
"data:text/html," |
"<html><head><title>%s</title></head>" |
"<body>hello world</body>" |
"</html>"; |
+const char kHTMLForGuestAcceptDrag[] = |
+ "data:text/html,<html><body>" |
+ "<script>" |
+ "function dropped() {" |
+ " document.title = \"DROPPED\";" |
+ "}" |
+ "</script>" |
+ "<textarea id=\"text\" style=\"width:100%; height: 100%\"" |
+ " ondrop=\"dropped();\">" |
+ "</textarea>" |
+ "</body></html>"; |
std::string GetHTMLForGuestWithTitle(const std::string& title) { |
return StringPrintf(kHTMLForGuestWithTitle, title.c_str()); |
@@ -233,6 +245,13 @@ class BrowserPluginHostTest : public ContentBrowserTest { |
false); // command. |
} |
+ // Executes the javascript synchronously and makes sure the returned value is |
+ // freed properly. |
+ void ExecuteSyncJSFunction(RenderViewHost* rvh, const string16& jscript) { |
+ scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue( |
+ string16(), jscript)); |
+ } |
+ |
// This helper method does the following: |
// 1. Start the test server and navigate the shell to |embedder_url|. |
// 2. Execute custom pre-navigation |embedder_code| if provided. |
@@ -254,18 +273,16 @@ class BrowserPluginHostTest : public ContentBrowserTest { |
// Allow the test to do some operations on the embedder before we perform |
// the first navigation of the guest. |
- if (!embedder_code.empty()) { |
- rvh->ExecuteJavascriptAndGetValue(string16(), |
- ASCIIToUTF16(embedder_code)); |
- } |
+ if (!embedder_code.empty()) |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16(embedder_code)); |
if (!is_guest_data_url) { |
test_url = test_server()->GetURL(guest_url); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
- StringPrintf("SetSrc('%s');", test_url.spec().c_str()))); |
+ ExecuteSyncJSFunction(rvh, |
+ ASCIIToUTF16(StringPrintf("SetSrc('%s');", test_url.spec().c_str()))); |
} else { |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
- StringPrintf("SetSrc('%s');", guest_url.c_str()))); |
+ ExecuteSyncJSFunction(rvh, |
+ ASCIIToUTF16(StringPrintf("SetSrc('%s');", guest_url.c_str()))); |
} |
// Wait to make sure embedder is created/attached to WebContents. |
@@ -310,12 +327,11 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, MAYBE_NavigateGuest) { |
// Override the hang timeout for guest to be very small. |
content::BrowserPluginGuest::set_factory_for_testing( |
TestShortHangTimeoutGuestFactory::GetInstance()); |
- const char* kEmbedderURL = "files/browser_plugin_embedder_crash.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder_crash.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuestInfiniteLoop, true, ""); |
- test_guest()->web_contents()-> |
- GetRenderViewHost()->ExecuteJavascriptAndGetValue( |
- string16(), ASCIIToUTF16("StartInfiniteLoop();")); |
+ ExecuteSyncJSFunction(test_guest()->web_contents()->GetRenderViewHost(), |
+ ASCIIToUTF16("StartInfiniteLoop();")); |
// Send a mouse event to the guest. |
SimulateMouseClick(test_embedder()->web_contents()); |
@@ -334,7 +350,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, NavigateAfterResize) { |
const gfx::Size nxt_size = gfx::Size(100, 200); |
const std::string embedder_code = |
StringPrintf("SetSize(%d, %d);", nxt_size.width(), nxt_size.height()); |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, embedder_code); |
// Wait for the guest to receive a damage buffer of size 100x200. |
@@ -343,7 +359,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, NavigateAfterResize) { |
} |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AdvanceFocus) { |
- const char* kEmbedderURL = "files/browser_plugin_focus.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_focus.html"; |
const char* kGuestURL = "files/browser_plugin_focus_child.html"; |
StartBrowserPluginTest(kEmbedderURL, kGuestURL, false, ""); |
@@ -374,7 +390,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderChangedAfterSwap) { |
ASSERT_TRUE(https_server.Start()); |
// 1. Load an embedder page with one guest in it. |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); |
// 2. Navigate to a URL in https, so we trigger a RenderViewHost swap. |
@@ -400,7 +416,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderChangedAfterSwap) { |
// therefore the embedder created on first page navigation stays the same in |
// web_contents. |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderSameAfterNav) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); |
WebContentsImpl* embedder_web_contents = test_embedder()->web_contents(); |
@@ -425,13 +441,13 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderSameAfterNav) { |
// This test verifies that hiding the embedder also hides the guest. |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, BrowserPluginVisibilityChanged) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); |
// Hide the Browser Plugin. |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
test_embedder()->web_contents()->GetRenderViewHost()); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16( |
"document.getElementById('plugin').style.visibility = 'hidden'")); |
// Make sure that the guest is hidden. |
@@ -439,7 +455,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, BrowserPluginVisibilityChanged) { |
} |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderVisibilityChanged) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); |
// Hide the embedder. |
@@ -451,14 +467,14 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderVisibilityChanged) { |
// This test verifies that calling the reload method reloads the guest. |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadGuest) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); |
test_guest()->ResetUpdateRectCount(); |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
test_embedder()->web_contents()->GetRenderViewHost()); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16( |
"document.getElementById('plugin').reload()")); |
test_guest()->WaitForReload(); |
} |
@@ -466,12 +482,12 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadGuest) { |
// This test verifies that calling the stop method forwards the stop request |
// to the guest's WebContents. |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, StopGuest) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
test_embedder()->web_contents()->GetRenderViewHost()); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16( |
"document.getElementById('plugin').stop()")); |
test_guest()->WaitForStop(); |
} |
@@ -479,7 +495,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, StopGuest) { |
// Verifies that installing/uninstalling touch-event handlers in the guest |
// plugin correctly updates the touch-event handling state in the embedder. |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AcceptTouchEvents) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuestTouchHandler, true, ""); |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
@@ -491,24 +507,22 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AcceptTouchEvents) { |
// start listening for touch events too. |
RenderViewHostMessageObserver observer(rvh, |
ViewHostMsg_HasTouchEventHandlers::ID); |
- test_guest()->web_contents()-> |
- GetRenderViewHost()->ExecuteJavascriptAndGetValue( |
- string16(), ASCIIToUTF16("InstallTouchHandler();")); |
+ ExecuteSyncJSFunction(test_guest()->web_contents()->GetRenderViewHost(), |
+ ASCIIToUTF16("InstallTouchHandler();")); |
observer.WaitUntilMessageReceived(); |
EXPECT_TRUE(rvh->has_touch_handler()); |
// Uninstalling the touch-handler in guest should cause the embedder to stop |
// listening for touch events. |
observer.ResetState(); |
- test_guest()->web_contents()-> |
- GetRenderViewHost()->ExecuteJavascriptAndGetValue( |
- string16(), ASCIIToUTF16("UninstallTouchHandler();")); |
+ ExecuteSyncJSFunction(test_guest()->web_contents()->GetRenderViewHost(), |
+ ASCIIToUTF16("UninstallTouchHandler();")); |
observer.WaitUntilMessageReceived(); |
EXPECT_FALSE(rvh->has_touch_handler()); |
} |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, Renavigate) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest( |
kEmbedderURL, GetHTMLForGuestWithTitle("P1"), true, ""); |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
@@ -520,8 +534,8 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, Renavigate) { |
content::TitleWatcher title_watcher(test_guest()->web_contents(), |
expected_title); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
- StringPrintf("SetSrc('%s');", GetHTMLForGuestWithTitle("P2").c_str()))); |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16(StringPrintf("SetSrc('%s');", |
+ GetHTMLForGuestWithTitle("P2").c_str()))); |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
EXPECT_EQ(expected_title, actual_title); |
@@ -533,8 +547,8 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, Renavigate) { |
content::TitleWatcher title_watcher(test_guest()->web_contents(), |
expected_title); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
- StringPrintf("SetSrc('%s');", GetHTMLForGuestWithTitle("P3").c_str()))); |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16(StringPrintf("SetSrc('%s');", |
+ GetHTMLForGuestWithTitle("P3").c_str()))); |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
EXPECT_EQ(expected_title, actual_title); |
@@ -546,20 +560,18 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, Renavigate) { |
content::TitleWatcher title_watcher(test_guest()->web_contents(), |
expected_title); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16("Back();")); |
- |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16("Back();")); |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
EXPECT_EQ(expected_title, actual_title); |
- base::Value* value = |
- rvh->ExecuteJavascriptAndGetValue(string16(), |
- ASCIIToUTF16("CanGoBack()")); |
+ scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(string16(), |
+ ASCIIToUTF16("CanGoBack()"))); |
bool result = false; |
ASSERT_TRUE(value->GetAsBoolean(&result)); |
EXPECT_TRUE(result); |
- value = rvh->ExecuteJavascriptAndGetValue(string16(), |
- ASCIIToUTF16("CanGoForward()")); |
+ value.reset(rvh->ExecuteJavascriptAndGetValue(string16(), |
+ ASCIIToUTF16("CanGoForward()"))); |
result = false; |
ASSERT_TRUE(value->GetAsBoolean(&result)); |
EXPECT_TRUE(result); |
@@ -571,14 +583,12 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, Renavigate) { |
content::TitleWatcher title_watcher(test_guest()->web_contents(), |
expected_title); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16("Forward();")); |
- |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16("Forward();")); |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
EXPECT_EQ(expected_title, actual_title); |
- base::Value* value = |
- rvh->ExecuteJavascriptAndGetValue(string16(), |
- ASCIIToUTF16("CanGoForward()")); |
+ scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(string16(), |
+ ASCIIToUTF16("CanGoForward()"))); |
bool result = true; |
ASSERT_TRUE(value->GetAsBoolean(&result)); |
EXPECT_FALSE(result); |
@@ -590,14 +600,12 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, Renavigate) { |
content::TitleWatcher title_watcher(test_guest()->web_contents(), |
expected_title); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16("Go(-2);")); |
- |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16("Go(-2);")); |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
EXPECT_EQ(expected_title, actual_title); |
- base::Value* value = |
- rvh->ExecuteJavascriptAndGetValue(string16(), |
- ASCIIToUTF16("CanGoBack()")); |
+ scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(string16(), |
+ ASCIIToUTF16("CanGoBack()"))); |
bool result = true; |
ASSERT_TRUE(value->GetAsBoolean(&result)); |
EXPECT_FALSE(result); |
@@ -607,7 +615,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, Renavigate) { |
// This tests verifies that reloading the embedder does not crash the browser |
// and that the guest is reset. |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadEmbedder) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
test_embedder()->web_contents()->GetRenderViewHost()); |
@@ -620,8 +628,8 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadEmbedder) { |
content::TitleWatcher title_watcher(test_embedder()->web_contents(), |
expected_title); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
- StringPrintf("SetTitle('%s');", "modified"))); |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16(StringPrintf("SetTitle('%s');", |
+ "modified"))); |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
EXPECT_EQ(expected_title, actual_title); |
@@ -638,9 +646,8 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadEmbedder) { |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
EXPECT_EQ(expected_title, actual_title); |
- test_embedder()->web_contents()->GetRenderViewHost()-> |
- ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
- StringPrintf("SetSrc('%s');", kHTMLForGuest))); |
+ ExecuteSyncJSFunction(test_embedder()->web_contents()->GetRenderViewHost(), |
+ ASCIIToUTF16(StringPrintf("SetSrc('%s');", kHTMLForGuest))); |
const BrowserPluginEmbedder::ContainerInstanceMap& instance_map = |
test_embedder()->guest_web_contents_for_testing(); |
@@ -656,12 +663,12 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadEmbedder) { |
} |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, TerminateGuest) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
test_embedder()->web_contents()->GetRenderViewHost()); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16( |
"document.getElementById('plugin').terminate()")); |
// Expect the guest to crash. |
@@ -669,7 +676,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, TerminateGuest) { |
} |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadStart) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, "about:blank", true, ""); |
const string16 expected_title = ASCIIToUTF16(kHTMLForGuest); |
@@ -678,7 +685,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadStart) { |
// Renavigate the guest to |kHTMLForGuest|. |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
test_embedder()->web_contents()->GetRenderViewHost()); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16( |
StringPrintf("SetSrc('%s');", kHTMLForGuest))); |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
@@ -686,7 +693,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadStart) { |
} |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadAbort) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, "about:blank", true, ""); |
const string16 expected_title = ASCIIToUTF16("ERR_EMPTY_RESPONSE"); |
@@ -697,7 +704,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadAbort) { |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
test_embedder()->web_contents()->GetRenderViewHost()); |
GURL test_url = test_server()->GetURL("close-socket"); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16( |
StringPrintf("SetSrc('%s');", test_url.spec().c_str()))); |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
@@ -705,7 +712,7 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadAbort) { |
} |
IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadRedirect) { |
- const char* kEmbedderURL = "files/browser_plugin_embedder.html"; |
+ const char kEmbedderURL[] = "files/browser_plugin_embedder.html"; |
StartBrowserPluginTest(kEmbedderURL, "about:blank", true, ""); |
const string16 expected_title = ASCIIToUTF16("redirected"); |
@@ -717,23 +724,70 @@ IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadRedirect) { |
"server-redirect?files/title1.html")); |
RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
test_embedder()->web_contents()->GetRenderViewHost()); |
- rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( |
+ ExecuteSyncJSFunction(rvh, ASCIIToUTF16( |
StringPrintf("SetSrc('%s');", redirect_url.spec().c_str()))); |
string16 actual_title = title_watcher.WaitAndGetTitle(); |
EXPECT_EQ(expected_title, actual_title); |
// Verify that we heard a loadRedirect during the navigation. |
- base::Value* v = rvh->ExecuteJavascriptAndGetValue( |
- string16(), ASCIIToUTF16("redirectOldUrl")); |
+ scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue( |
+ string16(), ASCIIToUTF16("redirectOldUrl"))); |
std::string result; |
- EXPECT_TRUE(v->GetAsString(&result)); |
+ EXPECT_TRUE(value->GetAsString(&result)); |
EXPECT_EQ(redirect_url.spec().c_str(), result); |
- v = rvh->ExecuteJavascriptAndGetValue( |
- string16(), ASCIIToUTF16("redirectNewUrl")); |
- EXPECT_TRUE(v->GetAsString(&result)); |
+ value.reset(rvh->ExecuteJavascriptAndGetValue( |
+ string16(), ASCIIToUTF16("redirectNewUrl"))); |
+ EXPECT_TRUE(value->GetAsString(&result)); |
EXPECT_EQ(test_server()->GetURL("files/title1.html").spec().c_str(), result); |
} |
+// Tests that a drag-n-drop over the browser plugin in the embedder happens |
+// correctly. |
+IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AcceptDragEvents) { |
+ const char kEmbedderURL[] = "files/browser_plugin_dragging.html"; |
+ StartBrowserPluginTest(kEmbedderURL, kHTMLForGuestAcceptDrag, true, ""); |
+ |
+ RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( |
+ test_embedder()->web_contents()->GetRenderViewHost()); |
+ |
+ // Get a location in the embedder outside of the plugin. |
+ base::ListValue *start, *end; |
+ scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(string16(), |
+ ASCIIToUTF16("dragLocation()"))); |
+ ASSERT_TRUE(value->GetAsList(&start) && start->GetSize() == 2); |
+ double start_x, start_y; |
+ ASSERT_TRUE(start->GetDouble(0, &start_x) && start->GetDouble(1, &start_y)); |
+ |
+ // Get a location in the embedder that falls inside the plugin. |
+ value.reset(rvh->ExecuteJavascriptAndGetValue(string16(), |
+ ASCIIToUTF16("dropLocation()"))); |
+ ASSERT_TRUE(value->GetAsList(&end) && end->GetSize() == 2); |
+ double end_x, end_y; |
+ ASSERT_TRUE(end->GetDouble(0, &end_x) && end->GetDouble(1, &end_y)); |
+ |
+ WebDropData drop_data; |
+ GURL url = GURL("https://www.domain.com/index.html"); |
+ drop_data.url = url; |
+ |
+ // Pretend that the URL is being dragged over the embedder. Start the drag |
+ // from outside the plugin, then move the drag inside the plugin and drop. |
+ // This should trigger appropriate messages from the embedder to the guest, |
+ // and end with a drop on the guest. The guest changes title when a drop |
+ // happens. |
+ const string16 expected_title = ASCIIToUTF16("DROPPED"); |
+ content::TitleWatcher title_watcher(test_guest()->web_contents(), |
+ expected_title); |
+ |
+ rvh->DragTargetDragEnter(drop_data, gfx::Point(start_x, start_y), |
+ gfx::Point(start_x, start_y), WebKit::WebDragOperationEvery, 0); |
+ rvh->DragTargetDragOver(gfx::Point(end_x, end_y), gfx::Point(end_x, end_y), |
+ WebKit::WebDragOperationEvery, 0); |
+ rvh->DragTargetDrop(gfx::Point(end_x, end_y), gfx::Point(end_x, end_y), 0); |
+ |
+ string16 actual_title = title_watcher.WaitAndGetTitle(); |
+ EXPECT_EQ(expected_title, actual_title); |
+} |
+ |
} // namespace content |