Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Side by Side Diff: content/browser/browser_plugin/browser_plugin_host_browsertest.cc

Issue 11088043: browser-plugin: Allow accepting drag-n-drop events. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/command_line.h" 5 #include "base/command_line.h"
6 #include "base/memory/singleton.h" 6 #include "base/memory/singleton.h"
7 #include "base/run_loop.h" 7 #include "base/run_loop.h"
8 #include "base/test/test_timeouts.h" 8 #include "base/test/test_timeouts.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "content/browser/browser_plugin/browser_plugin_guest.h" 10 #include "content/browser/browser_plugin/browser_plugin_guest.h"
11 #include "content/browser/browser_plugin/browser_plugin_host_factory.h" 11 #include "content/browser/browser_plugin/browser_plugin_host_factory.h"
12 #include "content/browser/browser_plugin/test_browser_plugin_embedder.h" 12 #include "content/browser/browser_plugin/test_browser_plugin_embedder.h"
13 #include "content/browser/browser_plugin/test_browser_plugin_guest.h" 13 #include "content/browser/browser_plugin/test_browser_plugin_guest.h"
14 #include "content/browser/renderer_host/render_view_host_impl.h" 14 #include "content/browser/renderer_host/render_view_host_impl.h"
15 #include "content/browser/web_contents/web_contents_impl.h" 15 #include "content/browser/web_contents/web_contents_impl.h"
16 #include "content/common/view_messages.h" 16 #include "content/common/view_messages.h"
17 #include "content/public/browser/notification_service.h" 17 #include "content/public/browser/notification_service.h"
18 #include "content/public/browser/notification_types.h" 18 #include "content/public/browser/notification_types.h"
19 #include "content/public/browser/render_view_host_observer.h" 19 #include "content/public/browser/render_view_host_observer.h"
20 #include "content/public/browser/render_widget_host_view.h"
20 #include "content/public/common/content_switches.h" 21 #include "content/public/common/content_switches.h"
21 #include "content/public/test/browser_test_utils.h" 22 #include "content/public/test/browser_test_utils.h"
22 #include "content/public/test/test_utils.h" 23 #include "content/public/test/test_utils.h"
23 #include "content/shell/shell.h" 24 #include "content/shell/shell.h"
24 #include "content/test/content_browser_test_utils.h" 25 #include "content/test/content_browser_test_utils.h"
25 #include "content/test/content_browser_test.h" 26 #include "content/test/content_browser_test.h"
26 #include "net/base/net_util.h" 27 #include "net/base/net_util.h"
27 #include "net/test/test_server.h" 28 #include "net/test/test_server.h"
28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" 29 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
29 30
30 using WebKit::WebInputEvent; 31 using WebKit::WebInputEvent;
31 using WebKit::WebMouseEvent; 32 using WebKit::WebMouseEvent;
32 using content::BrowserPluginEmbedder; 33 using content::BrowserPluginEmbedder;
33 using content::BrowserPluginGuest; 34 using content::BrowserPluginGuest;
34 using content::BrowserPluginHostFactory; 35 using content::BrowserPluginHostFactory;
35 36
36 namespace { 37 namespace {
37 38
38 const char* kHTMLForGuest = 39 const char kHTMLForGuest[] =
39 "data:text/html,<html><body>hello world</body></html>"; 40 "data:text/html,<html><body>hello world</body></html>";
40 const char* kHTMLForGuestInfiniteLoop = 41 const char kHTMLForGuestInfiniteLoop[] =
41 "data:text/html,<html><head><script type=\"text/javascript\">" 42 "data:text/html,<html><head><script type=\"text/javascript\">"
42 "function StartInfiniteLoop() {" 43 "function StartInfiniteLoop() {"
43 " setTimeout(function () {while (true) {} }, 0);" 44 " setTimeout(function () {while (true) {} }, 0);"
44 "}" 45 "}"
45 "</script></head><body></body></html>"; 46 "</script></head><body></body></html>";
46 const char kHTMLForGuestTouchHandler[] = 47 const char kHTMLForGuestTouchHandler[] =
47 "data:text/html,<html><body><div id=\"touch\">With touch</div></body>" 48 "data:text/html,<html><body><div id=\"touch\">With touch</div></body>"
48 "<script type=\"text/javascript\">" 49 "<script type=\"text/javascript\">"
49 "function handler() {}" 50 "function handler() {}"
50 "function InstallTouchHandler() { " 51 "function InstallTouchHandler() { "
51 " document.getElementById(\"touch\").addEventListener(\"touchstart\", " 52 " document.getElementById(\"touch\").addEventListener(\"touchstart\", "
52 " handler);" 53 " handler);"
53 "}" 54 "}"
54 "function UninstallTouchHandler() { " 55 "function UninstallTouchHandler() { "
55 " document.getElementById(\"touch\").removeEventListener(\"touchstart\", " 56 " document.getElementById(\"touch\").removeEventListener(\"touchstart\", "
56 " handler);" 57 " handler);"
57 "}" 58 "}"
58 "</script></html>"; 59 "</script></html>";
59 const char* kHTMLForGuestWithTitle = 60 const char kHTMLForGuestWithTitle[] =
60 "data:text/html," 61 "data:text/html,"
61 "<html><head><title>%s</title></head>" 62 "<html><head><title>%s</title></head>"
62 "<body>hello world</body>" 63 "<body>hello world</body>"
63 "</html>"; 64 "</html>";
65 const char kHTMLForGuestAcceptDrag[] =
66 "data:text/html,<html><body>"
67 "<script>"
68 "function dropped() {"
69 " document.title = \"DROPPED\";"
70 "}"
71 "</script>"
72 "<textarea id=\"text\" style=\"width:100%; height: 100%\""
73 " ondrop=\"dropped();\">"
74 "</textarea>"
75 "</body></html>";
64 76
65 std::string GetHTMLForGuestWithTitle(const std::string& title) { 77 std::string GetHTMLForGuestWithTitle(const std::string& title) {
66 return StringPrintf(kHTMLForGuestWithTitle, title.c_str()); 78 return StringPrintf(kHTMLForGuestWithTitle, title.c_str());
67 } 79 }
68 80
69 } // namespace 81 } // namespace
70 82
71 namespace content { 83 namespace content {
72 84
73 // Test factory for creating test instances of BrowserPluginEmbedder and 85 // Test factory for creating test instances of BrowserPluginEmbedder and
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 238
227 static void SimulateTabKeyPress(WebContents* web_contents) { 239 static void SimulateTabKeyPress(WebContents* web_contents) {
228 SimulateKeyPress(web_contents, 240 SimulateKeyPress(web_contents,
229 ui::VKEY_TAB, 241 ui::VKEY_TAB,
230 false, // control. 242 false, // control.
231 false, // shift. 243 false, // shift.
232 false, // alt. 244 false, // alt.
233 false); // command. 245 false); // command.
234 } 246 }
235 247
248 // 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.
249 // freed properly.
250 void ExecuteSyncJSFunction(RenderViewHost* rvh, const string16& jscript) {
251 scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(
252 string16(), jscript));
253 }
254
236 // This helper method does the following: 255 // This helper method does the following:
237 // 1. Start the test server and navigate the shell to |embedder_url|. 256 // 1. Start the test server and navigate the shell to |embedder_url|.
238 // 2. Execute custom pre-navigation |embedder_code| if provided. 257 // 2. Execute custom pre-navigation |embedder_code| if provided.
239 // 3. Navigate the guest to the |guest_url|. 258 // 3. Navigate the guest to the |guest_url|.
240 // 4. Verify that the guest has been created and has begun painting 259 // 4. Verify that the guest has been created and has begun painting
241 // pixels. 260 // pixels.
242 void StartBrowserPluginTest(const std::string& embedder_url, 261 void StartBrowserPluginTest(const std::string& embedder_url,
243 const std::string& guest_url, 262 const std::string& guest_url,
244 bool is_guest_data_url, 263 bool is_guest_data_url,
245 const std::string& embedder_code) { 264 const std::string& embedder_code) {
246 ASSERT_TRUE(test_server()->Start()); 265 ASSERT_TRUE(test_server()->Start());
247 GURL test_url(test_server()->GetURL(embedder_url)); 266 GURL test_url(test_server()->GetURL(embedder_url));
248 NavigateToURL(shell(), test_url); 267 NavigateToURL(shell(), test_url);
249 268
250 WebContentsImpl* embedder_web_contents = static_cast<WebContentsImpl*>( 269 WebContentsImpl* embedder_web_contents = static_cast<WebContentsImpl*>(
251 shell()->web_contents()); 270 shell()->web_contents());
252 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 271 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
253 embedder_web_contents->GetRenderViewHost()); 272 embedder_web_contents->GetRenderViewHost());
254 273
255 // Allow the test to do some operations on the embedder before we perform 274 // Allow the test to do some operations on the embedder before we perform
256 // the first navigation of the guest. 275 // the first navigation of the guest.
257 if (!embedder_code.empty()) { 276 if (!embedder_code.empty())
258 rvh->ExecuteJavascriptAndGetValue(string16(), 277 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(embedder_code));
259 ASCIIToUTF16(embedder_code));
260 }
261 278
262 if (!is_guest_data_url) { 279 if (!is_guest_data_url) {
263 test_url = test_server()->GetURL(guest_url); 280 test_url = test_server()->GetURL(guest_url);
264 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 281 ExecuteSyncJSFunction(rvh,
265 StringPrintf("SetSrc('%s');", test_url.spec().c_str()))); 282 ASCIIToUTF16(StringPrintf("SetSrc('%s');", test_url.spec().c_str())));
266 } else { 283 } else {
267 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 284 ExecuteSyncJSFunction(rvh,
268 StringPrintf("SetSrc('%s');", guest_url.c_str()))); 285 ASCIIToUTF16(StringPrintf("SetSrc('%s');", guest_url.c_str())));
269 } 286 }
270 287
271 // Wait to make sure embedder is created/attached to WebContents. 288 // Wait to make sure embedder is created/attached to WebContents.
272 TestBrowserPluginHostFactory::GetInstance()->WaitForEmbedderCreation(); 289 TestBrowserPluginHostFactory::GetInstance()->WaitForEmbedderCreation();
273 290
274 test_embedder_ = static_cast<TestBrowserPluginEmbedder*>( 291 test_embedder_ = static_cast<TestBrowserPluginEmbedder*>(
275 embedder_web_contents->GetBrowserPluginEmbedder()); 292 embedder_web_contents->GetBrowserPluginEmbedder());
276 ASSERT_TRUE(test_embedder_); 293 ASSERT_TRUE(test_embedder_);
277 test_embedder_->WaitForGuestAdded(); 294 test_embedder_->WaitForGuestAdded();
278 295
(...skipping 24 matching lines...) Expand all
303 // RenderViewGone to be called and times out. http://crbug.com/151190. 320 // RenderViewGone to be called and times out. http://crbug.com/151190.
304 #if defined(OS_WIN) 321 #if defined(OS_WIN)
305 #define MAYBE_NavigateGuest DISABLED_NavigateGuest 322 #define MAYBE_NavigateGuest DISABLED_NavigateGuest
306 #else 323 #else
307 #define MAYBE_NavigateGuest NavigateGuest 324 #define MAYBE_NavigateGuest NavigateGuest
308 #endif 325 #endif
309 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, MAYBE_NavigateGuest) { 326 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, MAYBE_NavigateGuest) {
310 // Override the hang timeout for guest to be very small. 327 // Override the hang timeout for guest to be very small.
311 content::BrowserPluginGuest::set_factory_for_testing( 328 content::BrowserPluginGuest::set_factory_for_testing(
312 TestShortHangTimeoutGuestFactory::GetInstance()); 329 TestShortHangTimeoutGuestFactory::GetInstance());
313 const char* kEmbedderURL = "files/browser_plugin_embedder_crash.html"; 330 const char kEmbedderURL[] = "files/browser_plugin_embedder_crash.html";
314 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuestInfiniteLoop, true, ""); 331 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuestInfiniteLoop, true, "");
315 332
316 test_guest()->web_contents()-> 333 ExecuteSyncJSFunction(test_guest()->web_contents()->GetRenderViewHost(),
317 GetRenderViewHost()->ExecuteJavascriptAndGetValue( 334 ASCIIToUTF16("StartInfiniteLoop();"));
318 string16(), ASCIIToUTF16("StartInfiniteLoop();"));
319 335
320 // Send a mouse event to the guest. 336 // Send a mouse event to the guest.
321 SimulateMouseClick(test_embedder()->web_contents()); 337 SimulateMouseClick(test_embedder()->web_contents());
322 338
323 // Expect the guest to crash. 339 // Expect the guest to crash.
324 test_guest()->WaitForCrashed(); 340 test_guest()->WaitForCrashed();
325 } 341 }
326 342
327 // This test ensures that if guest isn't there and we resize the guest (from 343 // This test ensures that if guest isn't there and we resize the guest (from
328 // js), it remembers the size correctly. 344 // js), it remembers the size correctly.
329 // 345 //
330 // Initially we load an embedder with a guest without a src attribute (which has 346 // Initially we load an embedder with a guest without a src attribute (which has
331 // dimension 640x480), resize it to 100x200, and then we set the source to a 347 // dimension 640x480), resize it to 100x200, and then we set the source to a
332 // sample guest. In the end we verify that the correct size has been set. 348 // sample guest. In the end we verify that the correct size has been set.
333 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, NavigateAfterResize) { 349 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, NavigateAfterResize) {
334 const gfx::Size nxt_size = gfx::Size(100, 200); 350 const gfx::Size nxt_size = gfx::Size(100, 200);
335 const std::string embedder_code = 351 const std::string embedder_code =
336 StringPrintf("SetSize(%d, %d);", nxt_size.width(), nxt_size.height()); 352 StringPrintf("SetSize(%d, %d);", nxt_size.width(), nxt_size.height());
337 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 353 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
338 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, embedder_code); 354 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, embedder_code);
339 355
340 // Wait for the guest to receive a damage buffer of size 100x200. 356 // Wait for the guest to receive a damage buffer of size 100x200.
341 // This means the guest will be painted properly at that size. 357 // This means the guest will be painted properly at that size.
342 test_guest()->WaitForDamageBufferWithSize(nxt_size); 358 test_guest()->WaitForDamageBufferWithSize(nxt_size);
343 } 359 }
344 360
345 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AdvanceFocus) { 361 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AdvanceFocus) {
346 const char* kEmbedderURL = "files/browser_plugin_focus.html"; 362 const char kEmbedderURL[] = "files/browser_plugin_focus.html";
347 const char* kGuestURL = "files/browser_plugin_focus_child.html"; 363 const char* kGuestURL = "files/browser_plugin_focus_child.html";
348 StartBrowserPluginTest(kEmbedderURL, kGuestURL, false, ""); 364 StartBrowserPluginTest(kEmbedderURL, kGuestURL, false, "");
349 365
350 SimulateMouseClick(test_embedder()->web_contents()); 366 SimulateMouseClick(test_embedder()->web_contents());
351 BrowserPluginHostTest::SimulateTabKeyPress(test_embedder()->web_contents()); 367 BrowserPluginHostTest::SimulateTabKeyPress(test_embedder()->web_contents());
352 // Wait until we focus into the guest. 368 // Wait until we focus into the guest.
353 test_guest()->WaitForFocus(); 369 test_guest()->WaitForFocus();
354 370
355 // TODO(fsamuel): A third Tab key press should not be necessary. 371 // TODO(fsamuel): A third Tab key press should not be necessary.
356 // The browser plugin will take keyboard focus but it will not 372 // The browser plugin will take keyboard focus but it will not
(...skipping 10 matching lines...) Expand all
367 // a RenderViewHost swap in the web_contents. We verify that the embedder in the 383 // a RenderViewHost swap in the web_contents. We verify that the embedder in the
368 // web_contents gets cleared properly. 384 // web_contents gets cleared properly.
369 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderChangedAfterSwap) { 385 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderChangedAfterSwap) {
370 net::TestServer https_server( 386 net::TestServer https_server(
371 net::TestServer::TYPE_HTTPS, 387 net::TestServer::TYPE_HTTPS,
372 net::TestServer::kLocalhost, 388 net::TestServer::kLocalhost,
373 FilePath(FILE_PATH_LITERAL("content/test/data"))); 389 FilePath(FILE_PATH_LITERAL("content/test/data")));
374 ASSERT_TRUE(https_server.Start()); 390 ASSERT_TRUE(https_server.Start());
375 391
376 // 1. Load an embedder page with one guest in it. 392 // 1. Load an embedder page with one guest in it.
377 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 393 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
378 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 394 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
379 395
380 // 2. Navigate to a URL in https, so we trigger a RenderViewHost swap. 396 // 2. Navigate to a URL in https, so we trigger a RenderViewHost swap.
381 GURL test_https_url(https_server.GetURL( 397 GURL test_https_url(https_server.GetURL(
382 "files/browser_plugin_title_change.html")); 398 "files/browser_plugin_title_change.html"));
383 content::WindowedNotificationObserver swap_observer( 399 content::WindowedNotificationObserver swap_observer(
384 content::NOTIFICATION_WEB_CONTENTS_SWAPPED, 400 content::NOTIFICATION_WEB_CONTENTS_SWAPPED,
385 content::Source<WebContents>(test_embedder()->web_contents())); 401 content::Source<WebContents>(test_embedder()->web_contents()));
386 NavigateToURL(shell(), test_https_url); 402 NavigateToURL(shell(), test_https_url);
387 swap_observer.Wait(); 403 swap_observer.Wait();
388 404
389 TestBrowserPluginEmbedder* test_embedder_after_swap = 405 TestBrowserPluginEmbedder* test_embedder_after_swap =
390 static_cast<TestBrowserPluginEmbedder*>( 406 static_cast<TestBrowserPluginEmbedder*>(
391 static_cast<WebContentsImpl*>(shell()->web_contents())-> 407 static_cast<WebContentsImpl*>(shell()->web_contents())->
392 GetBrowserPluginEmbedder()); 408 GetBrowserPluginEmbedder());
393 // Verify we have a no embedder in web_contents (since the new page doesn't 409 // Verify we have a no embedder in web_contents (since the new page doesn't
394 // have any browser plugin). 410 // have any browser plugin).
395 ASSERT_TRUE(!test_embedder_after_swap); 411 ASSERT_TRUE(!test_embedder_after_swap);
396 ASSERT_NE(test_embedder(), test_embedder_after_swap); 412 ASSERT_NE(test_embedder(), test_embedder_after_swap);
397 } 413 }
398 414
399 // This test opens two pages in http and there is no RenderViewHost swap, 415 // This test opens two pages in http and there is no RenderViewHost swap,
400 // therefore the embedder created on first page navigation stays the same in 416 // therefore the embedder created on first page navigation stays the same in
401 // web_contents. 417 // web_contents.
402 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderSameAfterNav) { 418 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderSameAfterNav) {
403 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 419 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
404 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 420 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
405 WebContentsImpl* embedder_web_contents = test_embedder()->web_contents(); 421 WebContentsImpl* embedder_web_contents = test_embedder()->web_contents();
406 422
407 // Navigate to another page in same host and port, so RenderViewHost swap 423 // Navigate to another page in same host and port, so RenderViewHost swap
408 // does not happen and existing embedder doesn't change in web_contents. 424 // does not happen and existing embedder doesn't change in web_contents.
409 GURL test_url_new(test_server()->GetURL( 425 GURL test_url_new(test_server()->GetURL(
410 "files/browser_plugin_title_change.html")); 426 "files/browser_plugin_title_change.html"));
411 const string16 expected_title = ASCIIToUTF16("done"); 427 const string16 expected_title = ASCIIToUTF16("done");
412 content::TitleWatcher title_watcher(shell()->web_contents(), expected_title); 428 content::TitleWatcher title_watcher(shell()->web_contents(), expected_title);
413 NavigateToURL(shell(), test_url_new); 429 NavigateToURL(shell(), test_url_new);
414 LOG(INFO) << "Start waiting for title"; 430 LOG(INFO) << "Start waiting for title";
415 string16 actual_title = title_watcher.WaitAndGetTitle(); 431 string16 actual_title = title_watcher.WaitAndGetTitle();
416 EXPECT_EQ(expected_title, actual_title); 432 EXPECT_EQ(expected_title, actual_title);
417 LOG(INFO) << "Done navigating to second page"; 433 LOG(INFO) << "Done navigating to second page";
418 434
419 TestBrowserPluginEmbedder* test_embedder_after_nav = 435 TestBrowserPluginEmbedder* test_embedder_after_nav =
420 static_cast<TestBrowserPluginEmbedder*>( 436 static_cast<TestBrowserPluginEmbedder*>(
421 embedder_web_contents->GetBrowserPluginEmbedder()); 437 embedder_web_contents->GetBrowserPluginEmbedder());
422 // Embedder must not change in web_contents. 438 // Embedder must not change in web_contents.
423 ASSERT_EQ(test_embedder_after_nav, test_embedder()); 439 ASSERT_EQ(test_embedder_after_nav, test_embedder());
424 } 440 }
425 441
426 // This test verifies that hiding the embedder also hides the guest. 442 // This test verifies that hiding the embedder also hides the guest.
427 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, BrowserPluginVisibilityChanged) { 443 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, BrowserPluginVisibilityChanged) {
428 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 444 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
429 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 445 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
430 446
431 // Hide the Browser Plugin. 447 // Hide the Browser Plugin.
432 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 448 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
433 test_embedder()->web_contents()->GetRenderViewHost()); 449 test_embedder()->web_contents()->GetRenderViewHost());
434 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 450 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
435 "document.getElementById('plugin').style.visibility = 'hidden'")); 451 "document.getElementById('plugin').style.visibility = 'hidden'"));
436 452
437 // Make sure that the guest is hidden. 453 // Make sure that the guest is hidden.
438 test_guest()->WaitUntilHidden(); 454 test_guest()->WaitUntilHidden();
439 } 455 }
440 456
441 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderVisibilityChanged) { 457 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, EmbedderVisibilityChanged) {
442 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 458 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
443 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 459 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
444 460
445 // Hide the embedder. 461 // Hide the embedder.
446 test_embedder()->web_contents()->WasHidden(); 462 test_embedder()->web_contents()->WasHidden();
447 463
448 // Make sure that hiding the embedder also hides the guest. 464 // Make sure that hiding the embedder also hides the guest.
449 test_guest()->WaitUntilHidden(); 465 test_guest()->WaitUntilHidden();
450 } 466 }
451 467
452 // This test verifies that calling the reload method reloads the guest. 468 // This test verifies that calling the reload method reloads the guest.
453 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadGuest) { 469 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadGuest) {
454 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 470 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
455 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 471 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
456 472
457 test_guest()->ResetUpdateRectCount(); 473 test_guest()->ResetUpdateRectCount();
458 474
459 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 475 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
460 test_embedder()->web_contents()->GetRenderViewHost()); 476 test_embedder()->web_contents()->GetRenderViewHost());
461 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 477 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
462 "document.getElementById('plugin').reload()")); 478 "document.getElementById('plugin').reload()"));
463 test_guest()->WaitForReload(); 479 test_guest()->WaitForReload();
464 } 480 }
465 481
466 // This test verifies that calling the stop method forwards the stop request 482 // This test verifies that calling the stop method forwards the stop request
467 // to the guest's WebContents. 483 // to the guest's WebContents.
468 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, StopGuest) { 484 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, StopGuest) {
469 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 485 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
470 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 486 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
471 487
472 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 488 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
473 test_embedder()->web_contents()->GetRenderViewHost()); 489 test_embedder()->web_contents()->GetRenderViewHost());
474 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 490 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
475 "document.getElementById('plugin').stop()")); 491 "document.getElementById('plugin').stop()"));
476 test_guest()->WaitForStop(); 492 test_guest()->WaitForStop();
477 } 493 }
478 494
479 // Verifies that installing/uninstalling touch-event handlers in the guest 495 // Verifies that installing/uninstalling touch-event handlers in the guest
480 // plugin correctly updates the touch-event handling state in the embedder. 496 // plugin correctly updates the touch-event handling state in the embedder.
481 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AcceptTouchEvents) { 497 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AcceptTouchEvents) {
482 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 498 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
483 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuestTouchHandler, true, ""); 499 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuestTouchHandler, true, "");
484 500
485 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 501 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
486 test_embedder()->web_contents()->GetRenderViewHost()); 502 test_embedder()->web_contents()->GetRenderViewHost());
487 // The embedder should not have any touch event handlers at this point. 503 // The embedder should not have any touch event handlers at this point.
488 EXPECT_FALSE(rvh->has_touch_handler()); 504 EXPECT_FALSE(rvh->has_touch_handler());
489 505
490 // Install the touch handler in the guest. This should cause the embedder to 506 // Install the touch handler in the guest. This should cause the embedder to
491 // start listening for touch events too. 507 // start listening for touch events too.
492 RenderViewHostMessageObserver observer(rvh, 508 RenderViewHostMessageObserver observer(rvh,
493 ViewHostMsg_HasTouchEventHandlers::ID); 509 ViewHostMsg_HasTouchEventHandlers::ID);
494 test_guest()->web_contents()-> 510 ExecuteSyncJSFunction(test_guest()->web_contents()->GetRenderViewHost(),
495 GetRenderViewHost()->ExecuteJavascriptAndGetValue( 511 ASCIIToUTF16("InstallTouchHandler();"));
496 string16(), ASCIIToUTF16("InstallTouchHandler();"));
497 observer.WaitUntilMessageReceived(); 512 observer.WaitUntilMessageReceived();
498 EXPECT_TRUE(rvh->has_touch_handler()); 513 EXPECT_TRUE(rvh->has_touch_handler());
499 514
500 // Uninstalling the touch-handler in guest should cause the embedder to stop 515 // Uninstalling the touch-handler in guest should cause the embedder to stop
501 // listening for touch events. 516 // listening for touch events.
502 observer.ResetState(); 517 observer.ResetState();
503 test_guest()->web_contents()-> 518 ExecuteSyncJSFunction(test_guest()->web_contents()->GetRenderViewHost(),
504 GetRenderViewHost()->ExecuteJavascriptAndGetValue( 519 ASCIIToUTF16("UninstallTouchHandler();"));
505 string16(), ASCIIToUTF16("UninstallTouchHandler();"));
506 observer.WaitUntilMessageReceived(); 520 observer.WaitUntilMessageReceived();
507 EXPECT_FALSE(rvh->has_touch_handler()); 521 EXPECT_FALSE(rvh->has_touch_handler());
508 } 522 }
509 523
510 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, Renavigate) { 524 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, Renavigate) {
511 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 525 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
512 StartBrowserPluginTest( 526 StartBrowserPluginTest(
513 kEmbedderURL, GetHTMLForGuestWithTitle("P1"), true, ""); 527 kEmbedderURL, GetHTMLForGuestWithTitle("P1"), true, "");
514 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 528 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
515 test_embedder()->web_contents()->GetRenderViewHost()); 529 test_embedder()->web_contents()->GetRenderViewHost());
516 530
517 // Navigate to P2 and verify that the navigation occurred. 531 // Navigate to P2 and verify that the navigation occurred.
518 { 532 {
519 const string16 expected_title = ASCIIToUTF16("P2"); 533 const string16 expected_title = ASCIIToUTF16("P2");
520 content::TitleWatcher title_watcher(test_guest()->web_contents(), 534 content::TitleWatcher title_watcher(test_guest()->web_contents(),
521 expected_title); 535 expected_title);
522 536
523 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 537 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(StringPrintf("SetSrc('%s');",
524 StringPrintf("SetSrc('%s');", GetHTMLForGuestWithTitle("P2").c_str()))); 538 GetHTMLForGuestWithTitle("P2").c_str())));
525 539
526 string16 actual_title = title_watcher.WaitAndGetTitle(); 540 string16 actual_title = title_watcher.WaitAndGetTitle();
527 EXPECT_EQ(expected_title, actual_title); 541 EXPECT_EQ(expected_title, actual_title);
528 } 542 }
529 543
530 // Navigate to P3 and verify that the navigation occurred. 544 // Navigate to P3 and verify that the navigation occurred.
531 { 545 {
532 const string16 expected_title = ASCIIToUTF16("P3"); 546 const string16 expected_title = ASCIIToUTF16("P3");
533 content::TitleWatcher title_watcher(test_guest()->web_contents(), 547 content::TitleWatcher title_watcher(test_guest()->web_contents(),
534 expected_title); 548 expected_title);
535 549
536 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 550 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(StringPrintf("SetSrc('%s');",
537 StringPrintf("SetSrc('%s');", GetHTMLForGuestWithTitle("P3").c_str()))); 551 GetHTMLForGuestWithTitle("P3").c_str())));
538 552
539 string16 actual_title = title_watcher.WaitAndGetTitle(); 553 string16 actual_title = title_watcher.WaitAndGetTitle();
540 EXPECT_EQ(expected_title, actual_title); 554 EXPECT_EQ(expected_title, actual_title);
541 } 555 }
542 556
543 // Go back and verify that we're back at P2. 557 // Go back and verify that we're back at P2.
544 { 558 {
545 const string16 expected_title = ASCIIToUTF16("P2"); 559 const string16 expected_title = ASCIIToUTF16("P2");
546 content::TitleWatcher title_watcher(test_guest()->web_contents(), 560 content::TitleWatcher title_watcher(test_guest()->web_contents(),
547 expected_title); 561 expected_title);
548 562
549 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16("Back();")); 563 ExecuteSyncJSFunction(rvh, ASCIIToUTF16("Back();"));
550
551 string16 actual_title = title_watcher.WaitAndGetTitle(); 564 string16 actual_title = title_watcher.WaitAndGetTitle();
552 EXPECT_EQ(expected_title, actual_title); 565 EXPECT_EQ(expected_title, actual_title);
553 } 566 }
554 567
555 // Go forward and verify that we're back at P3. 568 // Go forward and verify that we're back at P3.
556 { 569 {
557 const string16 expected_title = ASCIIToUTF16("P3"); 570 const string16 expected_title = ASCIIToUTF16("P3");
558 content::TitleWatcher title_watcher(test_guest()->web_contents(), 571 content::TitleWatcher title_watcher(test_guest()->web_contents(),
559 expected_title); 572 expected_title);
560 573
561 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16("Forward();")); 574 ExecuteSyncJSFunction(rvh, ASCIIToUTF16("Forward();"));
562
563 string16 actual_title = title_watcher.WaitAndGetTitle(); 575 string16 actual_title = title_watcher.WaitAndGetTitle();
564 EXPECT_EQ(expected_title, actual_title); 576 EXPECT_EQ(expected_title, actual_title);
565 } 577 }
566 578
567 // Go back two entries and verify that we're back at P1. 579 // Go back two entries and verify that we're back at P1.
568 { 580 {
569 const string16 expected_title = ASCIIToUTF16("P1"); 581 const string16 expected_title = ASCIIToUTF16("P1");
570 content::TitleWatcher title_watcher(test_guest()->web_contents(), 582 content::TitleWatcher title_watcher(test_guest()->web_contents(),
571 expected_title); 583 expected_title);
572 584
573 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16("Go(-2);")); 585 ExecuteSyncJSFunction(rvh, ASCIIToUTF16("Go(-2);"));
574
575 string16 actual_title = title_watcher.WaitAndGetTitle(); 586 string16 actual_title = title_watcher.WaitAndGetTitle();
576 EXPECT_EQ(expected_title, actual_title); 587 EXPECT_EQ(expected_title, actual_title);
577 } 588 }
578 } 589 }
579 590
580 // This tests verifies that reloading the embedder does not crash the browser 591 // This tests verifies that reloading the embedder does not crash the browser
581 // and that the guest is reset. 592 // and that the guest is reset.
582 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadEmbedder) { 593 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadEmbedder) {
583 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 594 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
584 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 595 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
585 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 596 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
586 test_embedder()->web_contents()->GetRenderViewHost()); 597 test_embedder()->web_contents()->GetRenderViewHost());
587 598
588 // Change the title of the page to 'modified' so that we know that 599 // Change the title of the page to 'modified' so that we know that
589 // the page has successfully reloaded when it goes back to 'embedder' 600 // the page has successfully reloaded when it goes back to 'embedder'
590 // in the next step. 601 // in the next step.
591 { 602 {
592 const string16 expected_title = ASCIIToUTF16("modified"); 603 const string16 expected_title = ASCIIToUTF16("modified");
593 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 604 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
594 expected_title); 605 expected_title);
595 606
596 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 607 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(StringPrintf("SetTitle('%s');",
597 StringPrintf("SetTitle('%s');", "modified"))); 608 "modified")));
598 609
599 string16 actual_title = title_watcher.WaitAndGetTitle(); 610 string16 actual_title = title_watcher.WaitAndGetTitle();
600 EXPECT_EQ(expected_title, actual_title); 611 EXPECT_EQ(expected_title, actual_title);
601 } 612 }
602 613
603 // Reload the embedder page, and verify that the reload was successful. 614 // Reload the embedder page, and verify that the reload was successful.
604 // Then navigate the guest to verify that the browser process does not crash. 615 // Then navigate the guest to verify that the browser process does not crash.
605 { 616 {
606 const string16 expected_title = ASCIIToUTF16("embedder"); 617 const string16 expected_title = ASCIIToUTF16("embedder");
607 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 618 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
608 expected_title); 619 expected_title);
609 620
610 test_embedder()->web_contents()->GetController().Reload(false); 621 test_embedder()->web_contents()->GetController().Reload(false);
611 string16 actual_title = title_watcher.WaitAndGetTitle(); 622 string16 actual_title = title_watcher.WaitAndGetTitle();
612 EXPECT_EQ(expected_title, actual_title); 623 EXPECT_EQ(expected_title, actual_title);
613 624
614 test_embedder()->web_contents()->GetRenderViewHost()-> 625 ExecuteSyncJSFunction(test_embedder()->web_contents()->GetRenderViewHost(),
615 ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 626 ASCIIToUTF16(StringPrintf("SetSrc('%s');", kHTMLForGuest)));
616 StringPrintf("SetSrc('%s');", kHTMLForGuest)));
617 627
618 const BrowserPluginEmbedder::ContainerInstanceMap& instance_map = 628 const BrowserPluginEmbedder::ContainerInstanceMap& instance_map =
619 test_embedder()->guest_web_contents_for_testing(); 629 test_embedder()->guest_web_contents_for_testing();
620 WebContentsImpl* test_guest_web_contents = static_cast<WebContentsImpl*>( 630 WebContentsImpl* test_guest_web_contents = static_cast<WebContentsImpl*>(
621 instance_map.begin()->second); 631 instance_map.begin()->second);
622 TestBrowserPluginGuest* new_test_guest = 632 TestBrowserPluginGuest* new_test_guest =
623 static_cast<TestBrowserPluginGuest*>( 633 static_cast<TestBrowserPluginGuest*>(
624 test_guest_web_contents->GetBrowserPluginGuest()); 634 test_guest_web_contents->GetBrowserPluginGuest());
625 635
626 // Wait for the guest to send an UpdateRectMsg, meaning it is ready. 636 // Wait for the guest to send an UpdateRectMsg, meaning it is ready.
627 new_test_guest->WaitForUpdateRectMsg(); 637 new_test_guest->WaitForUpdateRectMsg();
628 } 638 }
629 } 639 }
630 640
631 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, TerminateGuest) { 641 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, TerminateGuest) {
632 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 642 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
633 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 643 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
634 644
635 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 645 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
636 test_embedder()->web_contents()->GetRenderViewHost()); 646 test_embedder()->web_contents()->GetRenderViewHost());
637 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 647 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
638 "document.getElementById('plugin').terminate()")); 648 "document.getElementById('plugin').terminate()"));
639 649
640 // Expect the guest to crash. 650 // Expect the guest to crash.
641 test_guest()->WaitForCrashed(); 651 test_guest()->WaitForCrashed();
642 } 652 }
643 653
644 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadStart) { 654 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadStart) {
645 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 655 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
646 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, ""); 656 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, "");
647 657
648 const string16 expected_title = ASCIIToUTF16(kHTMLForGuest); 658 const string16 expected_title = ASCIIToUTF16(kHTMLForGuest);
649 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 659 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
650 expected_title); 660 expected_title);
651 // Renavigate the guest to |kHTMLForGuest|. 661 // Renavigate the guest to |kHTMLForGuest|.
652 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 662 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
653 test_embedder()->web_contents()->GetRenderViewHost()); 663 test_embedder()->web_contents()->GetRenderViewHost());
654 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 664 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
655 StringPrintf("SetSrc('%s');", kHTMLForGuest))); 665 StringPrintf("SetSrc('%s');", kHTMLForGuest)));
656 666
657 string16 actual_title = title_watcher.WaitAndGetTitle(); 667 string16 actual_title = title_watcher.WaitAndGetTitle();
658 EXPECT_EQ(expected_title, actual_title); 668 EXPECT_EQ(expected_title, actual_title);
659 } 669 }
660 670
661 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadAbort) { 671 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadAbort) {
662 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 672 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
663 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, ""); 673 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, "");
664 674
665 const string16 expected_title = ASCIIToUTF16("ERR_EMPTY_RESPONSE"); 675 const string16 expected_title = ASCIIToUTF16("ERR_EMPTY_RESPONSE");
666 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 676 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
667 expected_title); 677 expected_title);
668 678
669 // Renavigate the guest to "close-socket". 679 // Renavigate the guest to "close-socket".
670 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 680 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
671 test_embedder()->web_contents()->GetRenderViewHost()); 681 test_embedder()->web_contents()->GetRenderViewHost());
672 GURL test_url = test_server()->GetURL("close-socket"); 682 GURL test_url = test_server()->GetURL("close-socket");
673 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 683 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
674 StringPrintf("SetSrc('%s');", test_url.spec().c_str()))); 684 StringPrintf("SetSrc('%s');", test_url.spec().c_str())));
675 685
676 string16 actual_title = title_watcher.WaitAndGetTitle(); 686 string16 actual_title = title_watcher.WaitAndGetTitle();
677 EXPECT_EQ(expected_title, actual_title); 687 EXPECT_EQ(expected_title, actual_title);
678 } 688 }
679 689
680 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadRedirect) { 690 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadRedirect) {
681 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 691 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
682 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, ""); 692 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, "");
683 693
684 const string16 expected_title = ASCIIToUTF16("redirected"); 694 const string16 expected_title = ASCIIToUTF16("redirected");
685 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 695 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
686 expected_title); 696 expected_title);
687 697
688 // Navigate with a redirect and wait until the title changes. 698 // Navigate with a redirect and wait until the title changes.
689 GURL redirect_url(test_server()->GetURL( 699 GURL redirect_url(test_server()->GetURL(
690 "server-redirect?files/title1.html")); 700 "server-redirect?files/title1.html"));
691 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 701 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
692 test_embedder()->web_contents()->GetRenderViewHost()); 702 test_embedder()->web_contents()->GetRenderViewHost());
693 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 703 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
694 StringPrintf("SetSrc('%s');", redirect_url.spec().c_str()))); 704 StringPrintf("SetSrc('%s');", redirect_url.spec().c_str())));
695 705
696 string16 actual_title = title_watcher.WaitAndGetTitle(); 706 string16 actual_title = title_watcher.WaitAndGetTitle();
697 EXPECT_EQ(expected_title, actual_title); 707 EXPECT_EQ(expected_title, actual_title);
698 708
699 // Verify that we heard a loadRedirect during the navigation. 709 // Verify that we heard a loadRedirect during the navigation.
700 base::Value* v = rvh->ExecuteJavascriptAndGetValue( 710 scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(
701 string16(), ASCIIToUTF16("redirectOldUrl")); 711 string16(), ASCIIToUTF16("redirectOldUrl")));
702 std::string result; 712 std::string result;
703 EXPECT_TRUE(v->GetAsString(&result)); 713 EXPECT_TRUE(value->GetAsString(&result));
704 EXPECT_EQ(redirect_url.spec().c_str(), result); 714 EXPECT_EQ(redirect_url.spec().c_str(), result);
705 715
706 v = rvh->ExecuteJavascriptAndGetValue( 716 value.reset(rvh->ExecuteJavascriptAndGetValue(
707 string16(), ASCIIToUTF16("redirectNewUrl")); 717 string16(), ASCIIToUTF16("redirectNewUrl")));
708 EXPECT_TRUE(v->GetAsString(&result)); 718 EXPECT_TRUE(value->GetAsString(&result));
709 EXPECT_EQ(test_server()->GetURL("files/title1.html").spec().c_str(), result); 719 EXPECT_EQ(test_server()->GetURL("files/title1.html").spec().c_str(), result);
710 } 720 }
711 721
722 // Tests that a drag-n-drop over the browser plugin in the embedder happens
723 // correctly.
724 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AcceptDragEvents) {
725 const char kEmbedderURL[] = "files/browser_plugin_dragging.html";
726 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuestAcceptDrag, true, "");
727
728 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
729 test_embedder()->web_contents()->GetRenderViewHost());
730
731 // Get a location in the embedder outside of the plugin.
732 base::ListValue *start, *end;
733 scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(string16(),
734 ASCIIToUTF16("dragLocation()")));
735 ASSERT_TRUE(value->GetAsList(&start) && start->GetSize() == 2);
736 double start_x, start_y;
737 ASSERT_TRUE(start->GetDouble(0, &start_x) && start->GetDouble(1, &start_y));
738
739 // Get a location in the embedder that falls inside the plugin.
740 value.reset(rvh->ExecuteJavascriptAndGetValue(string16(),
741 ASCIIToUTF16("dropLocation()")));
742 ASSERT_TRUE(value->GetAsList(&end) && end->GetSize() == 2);
743 double end_x, end_y;
744 ASSERT_TRUE(end->GetDouble(0, &end_x) && end->GetDouble(1, &end_y));
745
746 WebDropData drop_data;
747 GURL url = GURL("https://www.domain.com/index.html");
748 drop_data.url = url;
749
750 // Pretend that the URL is being dragged over the embedder. Start the drag
751 // from outside the plugin, then move the drag inside the plugin and drop.
752 // This should trigger appropriate messages from the embedder to the guest,
753 // and end with a drop on the guest. The guest changes title when a drop
754 // happens.
755 const string16 expected_title = ASCIIToUTF16("DROPPED");
756 content::TitleWatcher title_watcher(test_guest()->web_contents(),
757 expected_title);
758
759 rvh->DragTargetDragEnter(drop_data, gfx::Point(start_x, start_y),
760 gfx::Point(start_x, start_y), WebKit::WebDragOperationEvery, 0);
761 rvh->DragTargetDragOver(gfx::Point(end_x, end_y), gfx::Point(end_x, end_y),
762 WebKit::WebDragOperationEvery, 0);
763 rvh->DragTargetDrop(gfx::Point(end_x, end_y), gfx::Point(end_x, end_y), 0);
764
765 string16 actual_title = title_watcher.WaitAndGetTitle();
766 EXPECT_EQ(expected_title, actual_title);
767 }
768
712 } // namespace content 769 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/browser_plugin/browser_plugin_guest_helper.cc ('k') | content/common/browser_plugin_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698