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

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 synchronously and makes sure the returned value is
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 base::Value* value = 567 scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(string16(),
555 rvh->ExecuteJavascriptAndGetValue(string16(), 568 ASCIIToUTF16("CanGoBack()")));
556 ASCIIToUTF16("CanGoBack()"));
557 bool result = false; 569 bool result = false;
558 ASSERT_TRUE(value->GetAsBoolean(&result)); 570 ASSERT_TRUE(value->GetAsBoolean(&result));
559 EXPECT_TRUE(result); 571 EXPECT_TRUE(result);
560 572
561 value = rvh->ExecuteJavascriptAndGetValue(string16(), 573 value.reset(rvh->ExecuteJavascriptAndGetValue(string16(),
562 ASCIIToUTF16("CanGoForward()")); 574 ASCIIToUTF16("CanGoForward()")));
563 result = false; 575 result = false;
564 ASSERT_TRUE(value->GetAsBoolean(&result)); 576 ASSERT_TRUE(value->GetAsBoolean(&result));
565 EXPECT_TRUE(result); 577 EXPECT_TRUE(result);
566 } 578 }
567 579
568 // Go forward and verify that we're back at P3. 580 // Go forward and verify that we're back at P3.
569 { 581 {
570 const string16 expected_title = ASCIIToUTF16("P3"); 582 const string16 expected_title = ASCIIToUTF16("P3");
571 content::TitleWatcher title_watcher(test_guest()->web_contents(), 583 content::TitleWatcher title_watcher(test_guest()->web_contents(),
572 expected_title); 584 expected_title);
573 585
574 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16("Forward();")); 586 ExecuteSyncJSFunction(rvh, ASCIIToUTF16("Forward();"));
575
576 string16 actual_title = title_watcher.WaitAndGetTitle(); 587 string16 actual_title = title_watcher.WaitAndGetTitle();
577 EXPECT_EQ(expected_title, actual_title); 588 EXPECT_EQ(expected_title, actual_title);
578 589
579 base::Value* value = 590 scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(string16(),
580 rvh->ExecuteJavascriptAndGetValue(string16(), 591 ASCIIToUTF16("CanGoForward()")));
581 ASCIIToUTF16("CanGoForward()"));
582 bool result = true; 592 bool result = true;
583 ASSERT_TRUE(value->GetAsBoolean(&result)); 593 ASSERT_TRUE(value->GetAsBoolean(&result));
584 EXPECT_FALSE(result); 594 EXPECT_FALSE(result);
585 } 595 }
586 596
587 // Go back two entries and verify that we're back at P1. 597 // Go back two entries and verify that we're back at P1.
588 { 598 {
589 const string16 expected_title = ASCIIToUTF16("P1"); 599 const string16 expected_title = ASCIIToUTF16("P1");
590 content::TitleWatcher title_watcher(test_guest()->web_contents(), 600 content::TitleWatcher title_watcher(test_guest()->web_contents(),
591 expected_title); 601 expected_title);
592 602
593 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16("Go(-2);")); 603 ExecuteSyncJSFunction(rvh, ASCIIToUTF16("Go(-2);"));
594
595 string16 actual_title = title_watcher.WaitAndGetTitle(); 604 string16 actual_title = title_watcher.WaitAndGetTitle();
596 EXPECT_EQ(expected_title, actual_title); 605 EXPECT_EQ(expected_title, actual_title);
597 606
598 base::Value* value = 607 scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(string16(),
599 rvh->ExecuteJavascriptAndGetValue(string16(), 608 ASCIIToUTF16("CanGoBack()")));
600 ASCIIToUTF16("CanGoBack()"));
601 bool result = true; 609 bool result = true;
602 ASSERT_TRUE(value->GetAsBoolean(&result)); 610 ASSERT_TRUE(value->GetAsBoolean(&result));
603 EXPECT_FALSE(result); 611 EXPECT_FALSE(result);
604 } 612 }
605 } 613 }
606 614
607 // This tests verifies that reloading the embedder does not crash the browser 615 // This tests verifies that reloading the embedder does not crash the browser
608 // and that the guest is reset. 616 // and that the guest is reset.
609 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadEmbedder) { 617 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, ReloadEmbedder) {
610 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 618 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
611 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 619 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
612 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 620 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
613 test_embedder()->web_contents()->GetRenderViewHost()); 621 test_embedder()->web_contents()->GetRenderViewHost());
614 622
615 // Change the title of the page to 'modified' so that we know that 623 // Change the title of the page to 'modified' so that we know that
616 // the page has successfully reloaded when it goes back to 'embedder' 624 // the page has successfully reloaded when it goes back to 'embedder'
617 // in the next step. 625 // in the next step.
618 { 626 {
619 const string16 expected_title = ASCIIToUTF16("modified"); 627 const string16 expected_title = ASCIIToUTF16("modified");
620 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 628 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
621 expected_title); 629 expected_title);
622 630
623 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 631 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(StringPrintf("SetTitle('%s');",
624 StringPrintf("SetTitle('%s');", "modified"))); 632 "modified")));
625 633
626 string16 actual_title = title_watcher.WaitAndGetTitle(); 634 string16 actual_title = title_watcher.WaitAndGetTitle();
627 EXPECT_EQ(expected_title, actual_title); 635 EXPECT_EQ(expected_title, actual_title);
628 } 636 }
629 637
630 // Reload the embedder page, and verify that the reload was successful. 638 // Reload the embedder page, and verify that the reload was successful.
631 // Then navigate the guest to verify that the browser process does not crash. 639 // Then navigate the guest to verify that the browser process does not crash.
632 { 640 {
633 const string16 expected_title = ASCIIToUTF16("embedder"); 641 const string16 expected_title = ASCIIToUTF16("embedder");
634 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 642 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
635 expected_title); 643 expected_title);
636 644
637 test_embedder()->web_contents()->GetController().Reload(false); 645 test_embedder()->web_contents()->GetController().Reload(false);
638 string16 actual_title = title_watcher.WaitAndGetTitle(); 646 string16 actual_title = title_watcher.WaitAndGetTitle();
639 EXPECT_EQ(expected_title, actual_title); 647 EXPECT_EQ(expected_title, actual_title);
640 648
641 test_embedder()->web_contents()->GetRenderViewHost()-> 649 ExecuteSyncJSFunction(test_embedder()->web_contents()->GetRenderViewHost(),
642 ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 650 ASCIIToUTF16(StringPrintf("SetSrc('%s');", kHTMLForGuest)));
643 StringPrintf("SetSrc('%s');", kHTMLForGuest)));
644 651
645 const BrowserPluginEmbedder::ContainerInstanceMap& instance_map = 652 const BrowserPluginEmbedder::ContainerInstanceMap& instance_map =
646 test_embedder()->guest_web_contents_for_testing(); 653 test_embedder()->guest_web_contents_for_testing();
647 WebContentsImpl* test_guest_web_contents = static_cast<WebContentsImpl*>( 654 WebContentsImpl* test_guest_web_contents = static_cast<WebContentsImpl*>(
648 instance_map.begin()->second); 655 instance_map.begin()->second);
649 TestBrowserPluginGuest* new_test_guest = 656 TestBrowserPluginGuest* new_test_guest =
650 static_cast<TestBrowserPluginGuest*>( 657 static_cast<TestBrowserPluginGuest*>(
651 test_guest_web_contents->GetBrowserPluginGuest()); 658 test_guest_web_contents->GetBrowserPluginGuest());
652 659
653 // Wait for the guest to send an UpdateRectMsg, meaning it is ready. 660 // Wait for the guest to send an UpdateRectMsg, meaning it is ready.
654 new_test_guest->WaitForUpdateRectMsg(); 661 new_test_guest->WaitForUpdateRectMsg();
655 } 662 }
656 } 663 }
657 664
658 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, TerminateGuest) { 665 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, TerminateGuest) {
659 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 666 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
660 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, ""); 667 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuest, true, "");
661 668
662 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 669 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
663 test_embedder()->web_contents()->GetRenderViewHost()); 670 test_embedder()->web_contents()->GetRenderViewHost());
664 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 671 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
665 "document.getElementById('plugin').terminate()")); 672 "document.getElementById('plugin').terminate()"));
666 673
667 // Expect the guest to crash. 674 // Expect the guest to crash.
668 test_guest()->WaitForCrashed(); 675 test_guest()->WaitForCrashed();
669 } 676 }
670 677
671 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadStart) { 678 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadStart) {
672 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 679 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
673 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, ""); 680 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, "");
674 681
675 const string16 expected_title = ASCIIToUTF16(kHTMLForGuest); 682 const string16 expected_title = ASCIIToUTF16(kHTMLForGuest);
676 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 683 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
677 expected_title); 684 expected_title);
678 // Renavigate the guest to |kHTMLForGuest|. 685 // Renavigate the guest to |kHTMLForGuest|.
679 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 686 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
680 test_embedder()->web_contents()->GetRenderViewHost()); 687 test_embedder()->web_contents()->GetRenderViewHost());
681 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 688 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
682 StringPrintf("SetSrc('%s');", kHTMLForGuest))); 689 StringPrintf("SetSrc('%s');", kHTMLForGuest)));
683 690
684 string16 actual_title = title_watcher.WaitAndGetTitle(); 691 string16 actual_title = title_watcher.WaitAndGetTitle();
685 EXPECT_EQ(expected_title, actual_title); 692 EXPECT_EQ(expected_title, actual_title);
686 } 693 }
687 694
688 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadAbort) { 695 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadAbort) {
689 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 696 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
690 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, ""); 697 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, "");
691 698
692 const string16 expected_title = ASCIIToUTF16("ERR_EMPTY_RESPONSE"); 699 const string16 expected_title = ASCIIToUTF16("ERR_EMPTY_RESPONSE");
693 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 700 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
694 expected_title); 701 expected_title);
695 702
696 // Renavigate the guest to "close-socket". 703 // Renavigate the guest to "close-socket".
697 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 704 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
698 test_embedder()->web_contents()->GetRenderViewHost()); 705 test_embedder()->web_contents()->GetRenderViewHost());
699 GURL test_url = test_server()->GetURL("close-socket"); 706 GURL test_url = test_server()->GetURL("close-socket");
700 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 707 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
701 StringPrintf("SetSrc('%s');", test_url.spec().c_str()))); 708 StringPrintf("SetSrc('%s');", test_url.spec().c_str())));
702 709
703 string16 actual_title = title_watcher.WaitAndGetTitle(); 710 string16 actual_title = title_watcher.WaitAndGetTitle();
704 EXPECT_EQ(expected_title, actual_title); 711 EXPECT_EQ(expected_title, actual_title);
705 } 712 }
706 713
707 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadRedirect) { 714 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, LoadRedirect) {
708 const char* kEmbedderURL = "files/browser_plugin_embedder.html"; 715 const char kEmbedderURL[] = "files/browser_plugin_embedder.html";
709 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, ""); 716 StartBrowserPluginTest(kEmbedderURL, "about:blank", true, "");
710 717
711 const string16 expected_title = ASCIIToUTF16("redirected"); 718 const string16 expected_title = ASCIIToUTF16("redirected");
712 content::TitleWatcher title_watcher(test_embedder()->web_contents(), 719 content::TitleWatcher title_watcher(test_embedder()->web_contents(),
713 expected_title); 720 expected_title);
714 721
715 // Navigate with a redirect and wait until the title changes. 722 // Navigate with a redirect and wait until the title changes.
716 GURL redirect_url(test_server()->GetURL( 723 GURL redirect_url(test_server()->GetURL(
717 "server-redirect?files/title1.html")); 724 "server-redirect?files/title1.html"));
718 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( 725 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
719 test_embedder()->web_contents()->GetRenderViewHost()); 726 test_embedder()->web_contents()->GetRenderViewHost());
720 rvh->ExecuteJavascriptAndGetValue(string16(), ASCIIToUTF16( 727 ExecuteSyncJSFunction(rvh, ASCIIToUTF16(
721 StringPrintf("SetSrc('%s');", redirect_url.spec().c_str()))); 728 StringPrintf("SetSrc('%s');", redirect_url.spec().c_str())));
722 729
723 string16 actual_title = title_watcher.WaitAndGetTitle(); 730 string16 actual_title = title_watcher.WaitAndGetTitle();
724 EXPECT_EQ(expected_title, actual_title); 731 EXPECT_EQ(expected_title, actual_title);
725 732
726 // Verify that we heard a loadRedirect during the navigation. 733 // Verify that we heard a loadRedirect during the navigation.
727 base::Value* v = rvh->ExecuteJavascriptAndGetValue( 734 scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(
728 string16(), ASCIIToUTF16("redirectOldUrl")); 735 string16(), ASCIIToUTF16("redirectOldUrl")));
729 std::string result; 736 std::string result;
730 EXPECT_TRUE(v->GetAsString(&result)); 737 EXPECT_TRUE(value->GetAsString(&result));
731 EXPECT_EQ(redirect_url.spec().c_str(), result); 738 EXPECT_EQ(redirect_url.spec().c_str(), result);
732 739
733 v = rvh->ExecuteJavascriptAndGetValue( 740 value.reset(rvh->ExecuteJavascriptAndGetValue(
734 string16(), ASCIIToUTF16("redirectNewUrl")); 741 string16(), ASCIIToUTF16("redirectNewUrl")));
735 EXPECT_TRUE(v->GetAsString(&result)); 742 EXPECT_TRUE(value->GetAsString(&result));
736 EXPECT_EQ(test_server()->GetURL("files/title1.html").spec().c_str(), result); 743 EXPECT_EQ(test_server()->GetURL("files/title1.html").spec().c_str(), result);
737 } 744 }
738 745
746 // Tests that a drag-n-drop over the browser plugin in the embedder happens
747 // correctly.
748 IN_PROC_BROWSER_TEST_F(BrowserPluginHostTest, AcceptDragEvents) {
749 const char kEmbedderURL[] = "files/browser_plugin_dragging.html";
750 StartBrowserPluginTest(kEmbedderURL, kHTMLForGuestAcceptDrag, true, "");
751
752 RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
753 test_embedder()->web_contents()->GetRenderViewHost());
754
755 // Get a location in the embedder outside of the plugin.
756 base::ListValue *start, *end;
757 scoped_ptr<base::Value> value(rvh->ExecuteJavascriptAndGetValue(string16(),
758 ASCIIToUTF16("dragLocation()")));
759 ASSERT_TRUE(value->GetAsList(&start) && start->GetSize() == 2);
760 double start_x, start_y;
761 ASSERT_TRUE(start->GetDouble(0, &start_x) && start->GetDouble(1, &start_y));
762
763 // Get a location in the embedder that falls inside the plugin.
764 value.reset(rvh->ExecuteJavascriptAndGetValue(string16(),
765 ASCIIToUTF16("dropLocation()")));
766 ASSERT_TRUE(value->GetAsList(&end) && end->GetSize() == 2);
767 double end_x, end_y;
768 ASSERT_TRUE(end->GetDouble(0, &end_x) && end->GetDouble(1, &end_y));
769
770 WebDropData drop_data;
771 GURL url = GURL("https://www.domain.com/index.html");
772 drop_data.url = url;
773
774 // Pretend that the URL is being dragged over the embedder. Start the drag
775 // from outside the plugin, then move the drag inside the plugin and drop.
776 // This should trigger appropriate messages from the embedder to the guest,
777 // and end with a drop on the guest. The guest changes title when a drop
778 // happens.
779 const string16 expected_title = ASCIIToUTF16("DROPPED");
780 content::TitleWatcher title_watcher(test_guest()->web_contents(),
781 expected_title);
782
783 rvh->DragTargetDragEnter(drop_data, gfx::Point(start_x, start_y),
784 gfx::Point(start_x, start_y), WebKit::WebDragOperationEvery, 0);
785 rvh->DragTargetDragOver(gfx::Point(end_x, end_y), gfx::Point(end_x, end_y),
786 WebKit::WebDragOperationEvery, 0);
787 rvh->DragTargetDrop(gfx::Point(end_x, end_y), gfx::Point(end_x, end_y), 0);
788
789 string16 actual_title = title_watcher.WaitAndGetTitle();
790 EXPECT_EQ(expected_title, actual_title);
791 }
792
739 } // namespace content 793 } // 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