| OLD | NEW | 
|     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/file_util.h" |     5 #include "base/file_util.h" | 
|     6 #include "base/memory/ref_counted.h" |     6 #include "base/memory/ref_counted.h" | 
|     7 #include "base/path_service.h" |     7 #include "base/path_service.h" | 
 |     8 #include "base/utf_string_conversions.h" | 
|     8 #include "chrome/browser/ui/browser.h" |     9 #include "chrome/browser/ui/browser.h" | 
|     9 #include "chrome/test/base/in_process_browser_test.h" |    10 #include "chrome/test/base/in_process_browser_test.h" | 
|    10 #include "chrome/test/base/ui_test_utils.h" |    11 #include "chrome/test/base/ui_test_utils.h" | 
|    11 #include "content/browser/renderer_host/render_view_host_impl.h" |    12 #include "content/browser/renderer_host/render_view_host_impl.h" | 
|    12 #include "content/browser/site_instance_impl.h" |    13 #include "content/browser/site_instance_impl.h" | 
|    13 #include "content/browser/web_contents/web_contents_impl.h" |    14 #include "content/browser/web_contents/web_contents_impl.h" | 
|    14 #include "content/public/browser/navigation_controller.h" |    15 #include "content/public/browser/navigation_controller.h" | 
|    15 #include "content/public/browser/notification_details.h" |    16 #include "content/public/browser/notification_details.h" | 
|    16 #include "content/public/browser/notification_observer.h" |    17 #include "content/public/browser/notification_observer.h" | 
|    17 #include "content/public/browser/notification_registrar.h" |    18 #include "content/public/browser/notification_registrar.h" | 
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   387   // Should have the same SiteInstance. |   388   // Should have the same SiteInstance. | 
|   388   scoped_refptr<SiteInstance> blank_site_instance( |   389   scoped_refptr<SiteInstance> blank_site_instance( | 
|   389       browser()->GetSelectedWebContents()->GetSiteInstance()); |   390       browser()->GetSelectedWebContents()->GetSiteInstance()); | 
|   390   EXPECT_EQ(orig_site_instance, blank_site_instance); |   391   EXPECT_EQ(orig_site_instance, blank_site_instance); | 
|   391  |   392  | 
|   392   // Now navigate the new tab to a different site. |   393   // Now navigate the new tab to a different site. | 
|   393   content::WebContents* new_contents = browser()->GetSelectedWebContents(); |   394   content::WebContents* new_contents = browser()->GetSelectedWebContents(); | 
|   394   ui_test_utils::NavigateToURL(browser(), |   395   ui_test_utils::NavigateToURL(browser(), | 
|   395                                https_server.GetURL("files/title1.html")); |   396                                https_server.GetURL("files/title1.html")); | 
|   396   scoped_refptr<SiteInstance> new_site_instance( |   397   scoped_refptr<SiteInstance> new_site_instance( | 
|   397       browser()->GetSelectedWebContents()->GetSiteInstance()); |   398       new_contents->GetSiteInstance()); | 
|   398   EXPECT_NE(orig_site_instance, new_site_instance); |   399   EXPECT_NE(orig_site_instance, new_site_instance); | 
|   399  |   400  | 
|   400   // Clicking the original link in the first tab should cause us to swap back. |   401   // Clicking the original link in the first tab should cause us to swap back. | 
|   401   browser()->ActivateTabAt(0, true); |   402   browser()->ActivateTabAt(0, true); | 
|   402   ui_test_utils::WindowedNotificationObserver navigation_observer( |   403   ui_test_utils::WindowedNotificationObserver navigation_observer( | 
|   403         content::NOTIFICATION_NAV_ENTRY_COMMITTED, |   404         content::NOTIFICATION_NAV_ENTRY_COMMITTED, | 
|   404         content::Source<content::NavigationController>( |   405         content::Source<content::NavigationController>( | 
|   405             &new_contents->GetController())); |   406             &new_contents->GetController())); | 
|   406   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |   407   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 
|   407       browser()->GetSelectedWebContents()->GetRenderViewHost(), L"", |   408       browser()->GetSelectedWebContents()->GetRenderViewHost(), L"", | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|   427         content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |   428         content::NOTIFICATION_WEB_CONTENTS_DESTROYED, | 
|   428         content::Source<content::WebContents>(new_contents)); |   429         content::Source<content::WebContents>(new_contents)); | 
|   429   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |   430   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 
|   430       browser()->GetSelectedWebContents()->GetRenderViewHost(), L"", |   431       browser()->GetSelectedWebContents()->GetRenderViewHost(), L"", | 
|   431       L"window.domAutomationController.send(testCloseWindow());", |   432       L"window.domAutomationController.send(testCloseWindow());", | 
|   432       &success)); |   433       &success)); | 
|   433   EXPECT_TRUE(success); |   434   EXPECT_TRUE(success); | 
|   434   close_observer.Wait(); |   435   close_observer.Wait(); | 
|   435 } |   436 } | 
|   436  |   437  | 
 |   438 // Test for crbug.com/99202.  PostMessage calls should still work after | 
 |   439 // navigating the source and target windows to different sites. | 
 |   440 // Specifically: | 
 |   441 // 1) Create 3 windows (opener, "foo", and _blank) and send "foo" cross-process. | 
 |   442 // 2) Fail to post a message from "foo" to opener with the wrong target origin. | 
 |   443 // 3) Post a message from "foo" to opener, which replies back to "foo". | 
 |   444 // 4) Post a message from _blank to "foo". | 
 |   445 IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, | 
 |   446                        SupportCrossProcessPostMessage) { | 
 |   447   // Start two servers with different sites. | 
 |   448   ASSERT_TRUE(test_server()->Start()); | 
 |   449   net::TestServer https_server( | 
 |   450       net::TestServer::TYPE_HTTPS, | 
 |   451       net::TestServer::kLocalhost, | 
 |   452       FilePath(FILE_PATH_LITERAL("chrome/test/data"))); | 
 |   453   ASSERT_TRUE(https_server.Start()); | 
 |   454  | 
 |   455   // Load a page with links that open in a new window. | 
 |   456   std::string replacement_path; | 
 |   457   ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( | 
 |   458       "files/click-noreferrer-links.html", | 
 |   459       https_server.host_port_pair(), | 
 |   460       &replacement_path)); | 
 |   461   ui_test_utils::NavigateToURL(browser(), | 
 |   462                                test_server()->GetURL(replacement_path)); | 
 |   463  | 
 |   464   // Get the original SiteInstance and RVHM for later comparison. | 
 |   465   content::WebContents* opener_contents = browser()->GetSelectedWebContents(); | 
 |   466   scoped_refptr<SiteInstance> orig_site_instance( | 
 |   467       opener_contents->GetSiteInstance()); | 
 |   468   EXPECT_TRUE(orig_site_instance != NULL); | 
 |   469   RenderViewHostManager* opener_manager = | 
 |   470       static_cast<WebContentsImpl*>(opener_contents)-> | 
 |   471           GetRenderManagerForTesting(); | 
 |   472  | 
 |   473   // 1) Open two more windows, one named.  These initially have openers but no | 
 |   474   // reference to each other.  We will later post a message between them. | 
 |   475  | 
 |   476   // First, a named target=foo window. | 
 |   477   ui_test_utils::WindowedTabAddedNotificationObserver new_tab_observer(( | 
 |   478       content::Source<content::WebContentsDelegate>(browser()))); | 
 |   479   bool success = false; | 
 |   480   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 
 |   481       opener_contents->GetRenderViewHost(), L"", | 
 |   482       L"window.domAutomationController.send(clickSameSiteTargetedLink());", | 
 |   483       &success)); | 
 |   484   EXPECT_TRUE(success); | 
 |   485   new_tab_observer.Wait(); | 
 |   486  | 
 |   487   // Wait for the navigation in the new tab to finish, if it hasn't, then | 
 |   488   // send it to post_message.html on a different site. | 
 |   489   content::WebContents* foo_contents = browser()->GetSelectedWebContents(); | 
 |   490   ui_test_utils::WaitForLoadStop(foo_contents); | 
 |   491   EXPECT_EQ("/files/navigate_opener.html", foo_contents->GetURL().path()); | 
 |   492   EXPECT_EQ(1, browser()->active_index()); | 
 |   493   ui_test_utils::NavigateToURL(browser(), | 
 |   494                                https_server.GetURL("files/post_message.html")); | 
 |   495   scoped_refptr<SiteInstance> foo_site_instance( | 
 |   496       foo_contents->GetSiteInstance()); | 
 |   497   EXPECT_NE(orig_site_instance, foo_site_instance); | 
 |   498  | 
 |   499   // Second, a target=_blank window. | 
 |   500   browser()->ActivateTabAt(0, true); | 
 |   501   ui_test_utils::WindowedTabAddedNotificationObserver new_tab_observer2(( | 
 |   502       content::Source<content::WebContentsDelegate>(browser()))); | 
 |   503   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 
 |   504       browser()->GetSelectedWebContents()->GetRenderViewHost(), L"", | 
 |   505       L"window.domAutomationController.send(clickSameSiteTargetBlankLink());", | 
 |   506       &success)); | 
 |   507   EXPECT_TRUE(success); | 
 |   508   new_tab_observer2.Wait(); | 
 |   509  | 
 |   510   // Wait for the navigation in the new tab to finish, if it hasn't, then | 
 |   511   // send it to post_message.html on the original site. | 
 |   512   content::WebContents* new_contents = browser()->GetSelectedWebContents(); | 
 |   513   ui_test_utils::WaitForLoadStop(new_contents); | 
 |   514   EXPECT_EQ("/files/title2.html", new_contents->GetURL().path()); | 
 |   515   EXPECT_EQ(1, browser()->active_index()); | 
 |   516   ui_test_utils::NavigateToURL( | 
 |   517       browser(), test_server()->GetURL("files/post_message.html")); | 
 |   518   EXPECT_EQ(orig_site_instance, new_contents->GetSiteInstance()); | 
 |   519   RenderViewHostManager* new_manager = | 
 |   520       static_cast<WebContentsImpl*>(new_contents)->GetRenderManagerForTesting(); | 
 |   521  | 
 |   522   // We now have three windows.  The opener should have a swapped out RVH | 
 |   523   // for the new SiteInstance, but the _blank window should not. | 
 |   524   EXPECT_EQ(3, browser()->tab_count()); | 
 |   525   EXPECT_TRUE(opener_manager->GetSwappedOutRenderViewHost(foo_site_instance)); | 
 |   526   EXPECT_FALSE(new_manager->GetSwappedOutRenderViewHost(foo_site_instance)); | 
 |   527  | 
 |   528   // 2) Fail to post a message from the foo window to the opener if the target | 
 |   529   // origin is wrong.  We won't see an error, but we can check for the right | 
 |   530   // number of received messages below. | 
 |   531   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 
 |   532       foo_contents->GetRenderViewHost(), L"", | 
 |   533       L"window.domAutomationController.send(postToOpener('msg'," | 
 |   534       L"'http://google.com'));", | 
 |   535       &success)); | 
 |   536   EXPECT_TRUE(success); | 
 |   537  | 
 |   538   // 3) Post a message from the foo window to the opener.  The opener will | 
 |   539   // reply, causing the foo window to update its own title. | 
 |   540   ui_test_utils::WindowedNotificationObserver title_observer( | 
 |   541         content::NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, | 
 |   542         content::Source<content::WebContents>(foo_contents)); | 
 |   543   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 
 |   544       foo_contents->GetRenderViewHost(), L"", | 
 |   545       L"window.domAutomationController.send(postToOpener('msg','*'));", | 
 |   546       &success)); | 
 |   547   EXPECT_TRUE(success); | 
 |   548   title_observer.Wait(); | 
 |   549  | 
 |   550   // We should have received only 1 message in the opener and "foo" tabs, | 
 |   551   // and updated the title. | 
 |   552   int opener_received_messages = 0; | 
 |   553   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt( | 
 |   554       opener_contents->GetRenderViewHost(), L"", | 
 |   555       L"window.domAutomationController.send(window.receivedMessages);", | 
 |   556       &opener_received_messages)); | 
 |   557   int foo_received_messages = 0; | 
 |   558   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt( | 
 |   559       foo_contents->GetRenderViewHost(), L"", | 
 |   560       L"window.domAutomationController.send(window.receivedMessages);", | 
 |   561       &foo_received_messages)); | 
 |   562   EXPECT_EQ(1, foo_received_messages); | 
 |   563   EXPECT_EQ(1, opener_received_messages); | 
 |   564   EXPECT_EQ(ASCIIToUTF16("msg"), foo_contents->GetTitle()); | 
 |   565  | 
 |   566   // 4) Now post a message from the _blank window to the foo window.  The | 
 |   567   // foo window will update its title and will not reply. | 
 |   568   ui_test_utils::WindowedNotificationObserver title_observer2( | 
 |   569         content::NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, | 
 |   570         content::Source<content::WebContents>(foo_contents)); | 
 |   571   EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( | 
 |   572       new_contents->GetRenderViewHost(), L"", | 
 |   573       L"window.domAutomationController.send(postToFoo('msg2'));", | 
 |   574       &success)); | 
 |   575   EXPECT_TRUE(success); | 
 |   576   title_observer2.Wait(); | 
 |   577   EXPECT_EQ(ASCIIToUTF16("msg2"), foo_contents->GetTitle()); | 
 |   578  | 
 |   579   // This postMessage should have created a swapped out RVH for the new | 
 |   580   // SiteInstance in the target=_blank window. | 
 |   581   EXPECT_TRUE(new_manager->GetSwappedOutRenderViewHost(foo_site_instance)); | 
 |   582 } | 
 |   583  | 
|   437 // Test for crbug.com/116192.  Navigations to a window's opener should |   584 // Test for crbug.com/116192.  Navigations to a window's opener should | 
|   438 // still work after a process swap. |   585 // still work after a process swap. | 
|   439 IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |   586 IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, | 
|   440                        AllowTargetedNavigationsInOpenerAfterSwap) { |   587                        AllowTargetedNavigationsInOpenerAfterSwap) { | 
|   441   // Start two servers with different sites. |   588   // Start two servers with different sites. | 
|   442   ASSERT_TRUE(test_server()->Start()); |   589   ASSERT_TRUE(test_server()->Start()); | 
|   443   net::TestServer https_server( |   590   net::TestServer https_server( | 
|   444       net::TestServer::TYPE_HTTPS, |   591       net::TestServer::TYPE_HTTPS, | 
|   445       net::TestServer::kLocalhost, |   592       net::TestServer::kLocalhost, | 
|   446       FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |   593       FilePath(FILE_PATH_LITERAL("chrome/test/data"))); | 
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   869   // Now navigate to a different instance so that we swap out again. |  1016   // Now navigate to a different instance so that we swap out again. | 
|   870   ui_test_utils::NavigateToURL(browser(), |  1017   ui_test_utils::NavigateToURL(browser(), | 
|   871                                https_server.GetURL("files/title2.html")); |  1018                                https_server.GetURL("files/title2.html")); | 
|   872   rvh_observers.AddObserverToRVH(browser()->GetSelectedWebContents()-> |  1019   rvh_observers.AddObserverToRVH(browser()->GetSelectedWebContents()-> | 
|   873       GetRenderViewHost()); |  1020       GetRenderViewHost()); | 
|   874  |  1021  | 
|   875   // This used to leak a render view host. |  1022   // This used to leak a render view host. | 
|   876   browser()->CloseTabContents(browser()->GetSelectedWebContents()); |  1023   browser()->CloseTabContents(browser()->GetSelectedWebContents()); | 
|   877   EXPECT_EQ(0U, rvh_observers.GetNumObservers()); |  1024   EXPECT_EQ(0U, rvh_observers.GetNumObservers()); | 
|   878 } |  1025 } | 
| OLD | NEW |