Chromium Code Reviews| 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 703a4f9e894ce006e34f8cb50df369202d02aa0e..d2aafbfa59358b241c729914e78071a07ca8f7de 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 sunchronously and makes sure the returned value is |
|
Charlie Reis
2012/10/11 21:28:20
nit: synchronously
sadrul
2012/10/12 00:18:47
Done.
|
| + // 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,8 +560,7 @@ 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); |
| } |
| @@ -558,8 +571,7 @@ 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); |
| } |
| @@ -570,8 +582,7 @@ 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); |
| } |
| @@ -580,7 +591,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()); |
| @@ -593,8 +604,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); |
| @@ -611,9 +622,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(); |
| @@ -629,12 +639,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. |
| @@ -642,7 +652,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); |
| @@ -651,7 +661,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(); |
| @@ -659,7 +669,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"); |
| @@ -670,7 +680,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(); |
| @@ -678,7 +688,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"); |
| @@ -690,23 +700,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 |