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

Unified Diff: content/browser/renderer_host/render_view_host_manager_browsertest.cc

Issue 9108001: Adds support for calling postMessage on a frame living in a different renderer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rename struct, hide FromRoutingID. Created 8 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_view_host_manager_browsertest.cc
diff --git a/content/browser/renderer_host/render_view_host_manager_browsertest.cc b/content/browser/renderer_host/render_view_host_manager_browsertest.cc
index ec3552c7c63f0184ea223f2de1476ff7e9d7fc6f..9312241390ff6b6da823cfe20fc06e9c4cd66326 100644
--- a/content/browser/renderer_host/render_view_host_manager_browsertest.cc
+++ b/content/browser/renderer_host/render_view_host_manager_browsertest.cc
@@ -5,6 +5,7 @@
#include "base/file_util.h"
#include "base/memory/ref_counted.h"
#include "base/path_service.h"
+#include "base/utf_string_conversions.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
@@ -394,7 +395,7 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
ui_test_utils::NavigateToURL(browser(),
https_server.GetURL("files/title1.html"));
scoped_refptr<SiteInstance> new_site_instance(
- browser()->GetSelectedWebContents()->GetSiteInstance());
+ new_contents->GetSiteInstance());
EXPECT_NE(orig_site_instance, new_site_instance);
// Clicking the original link in the first tab should cause us to swap back.
@@ -434,6 +435,152 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
close_observer.Wait();
}
+// Test for crbug.com/99202. PostMessage calls should still work after
+// navigating the source and target windows to different sites.
+// Specifically:
+// 1) Create 3 windows (opener, "foo", and _blank) and send "foo" cross-process.
+// 2) Fail to post a message from "foo" to opener with the wrong target origin.
+// 3) Post a message from "foo" to opener, which replies back to "foo".
+// 4) Post a message from _blank to "foo".
+IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,
+ SupportCrossProcessPostMessage) {
+ // Start two servers with different sites.
+ ASSERT_TRUE(test_server()->Start());
+ net::TestServer https_server(
+ net::TestServer::TYPE_HTTPS,
+ net::TestServer::kLocalhost,
+ FilePath(FILE_PATH_LITERAL("chrome/test/data")));
+ ASSERT_TRUE(https_server.Start());
+
+ // Load a page with links that open in a new window.
+ std::string replacement_path;
+ ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
+ "files/click-noreferrer-links.html",
+ https_server.host_port_pair(),
+ &replacement_path));
+ ui_test_utils::NavigateToURL(browser(),
+ test_server()->GetURL(replacement_path));
+
+ // Get the original SiteInstance and RVHM for later comparison.
+ content::WebContents* opener_contents = browser()->GetSelectedWebContents();
+ scoped_refptr<SiteInstance> orig_site_instance(
+ opener_contents->GetSiteInstance());
+ EXPECT_TRUE(orig_site_instance != NULL);
+ RenderViewHostManager* opener_manager =
+ static_cast<WebContentsImpl*>(opener_contents)->
+ GetRenderManagerForTesting();
+
+ // 1) Open two more windows, one named. These initially have openers but no
+ // reference to each other. We will later post a message between them.
+
+ // First, a named target=foo window.
+ ui_test_utils::WindowedTabAddedNotificationObserver new_tab_observer((
+ content::Source<content::WebContentsDelegate>(browser())));
+ bool success = false;
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
+ opener_contents->GetRenderViewHost(), L"",
+ L"window.domAutomationController.send(clickSameSiteTargetedLink());",
+ &success));
+ EXPECT_TRUE(success);
+ new_tab_observer.Wait();
+
+ // Wait for the navigation in the new tab to finish, if it hasn't, then
+ // send it to post_message.html on a different site.
+ content::WebContents* foo_contents = browser()->GetSelectedWebContents();
+ ui_test_utils::WaitForLoadStop(foo_contents);
+ EXPECT_EQ("/files/navigate_opener.html", foo_contents->GetURL().path());
+ EXPECT_EQ(1, browser()->active_index());
+ ui_test_utils::NavigateToURL(browser(),
+ https_server.GetURL("files/post_message.html"));
+ scoped_refptr<SiteInstance> foo_site_instance(
+ foo_contents->GetSiteInstance());
+ EXPECT_NE(orig_site_instance, foo_site_instance);
+
+ // Second, a target=_blank window.
+ browser()->ActivateTabAt(0, true);
+ ui_test_utils::WindowedTabAddedNotificationObserver new_tab_observer2((
+ content::Source<content::WebContentsDelegate>(browser())));
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
+ browser()->GetSelectedWebContents()->GetRenderViewHost(), L"",
+ L"window.domAutomationController.send(clickSameSiteTargetBlankLink());",
+ &success));
+ EXPECT_TRUE(success);
+ new_tab_observer2.Wait();
+
+ // Wait for the navigation in the new tab to finish, if it hasn't, then
+ // send it to post_message.html on the original site.
+ content::WebContents* new_contents = browser()->GetSelectedWebContents();
+ ui_test_utils::WaitForLoadStop(new_contents);
+ EXPECT_EQ("/files/title2.html", new_contents->GetURL().path());
+ EXPECT_EQ(1, browser()->active_index());
+ ui_test_utils::NavigateToURL(
+ browser(), test_server()->GetURL("files/post_message.html"));
+ EXPECT_EQ(orig_site_instance, new_contents->GetSiteInstance());
+ RenderViewHostManager* new_manager =
+ static_cast<WebContentsImpl*>(new_contents)->GetRenderManagerForTesting();
+
+ // We now have three windows. The opener should have a swapped out RVH
+ // for the new SiteInstance, but the _blank window should not.
+ EXPECT_EQ(3, browser()->tab_count());
+ EXPECT_TRUE(opener_manager->GetSwappedOutRenderViewHost(foo_site_instance));
+ EXPECT_FALSE(new_manager->GetSwappedOutRenderViewHost(foo_site_instance));
+
+ // 2) Fail to post a message from the foo window to the opener if the target
+ // origin is wrong. We won't see an error, but we can check for the right
+ // number of received messages below.
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
+ foo_contents->GetRenderViewHost(), L"",
+ L"window.domAutomationController.send(postToOpener('msg',"
+ L"'http://google.com'));",
+ &success));
+ EXPECT_TRUE(success);
+
+ // 3) Post a message from the foo window to the opener. The opener will
+ // reply, causing the foo window to update its own title.
+ ui_test_utils::WindowedNotificationObserver title_observer(
+ content::NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED,
+ content::Source<content::WebContents>(foo_contents));
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
+ foo_contents->GetRenderViewHost(), L"",
+ L"window.domAutomationController.send(postToOpener('msg','*'));",
+ &success));
+ EXPECT_TRUE(success);
+ title_observer.Wait();
+
+ // We should have received only 1 message in the opener and "foo" tabs,
+ // and updated the title.
+ int opener_received_messages = 0;
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt(
+ opener_contents->GetRenderViewHost(), L"",
+ L"window.domAutomationController.send(window.receivedMessages);",
+ &opener_received_messages));
+ int foo_received_messages = 0;
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt(
+ foo_contents->GetRenderViewHost(), L"",
+ L"window.domAutomationController.send(window.receivedMessages);",
+ &foo_received_messages));
+ EXPECT_EQ(1, foo_received_messages);
+ EXPECT_EQ(1, opener_received_messages);
+ EXPECT_EQ(ASCIIToUTF16("msg"), foo_contents->GetTitle());
+
+ // 4) Now post a message from the _blank window to the foo window. The
+ // foo window will update its title and will not reply.
+ ui_test_utils::WindowedNotificationObserver title_observer2(
+ content::NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED,
+ content::Source<content::WebContents>(foo_contents));
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
+ new_contents->GetRenderViewHost(), L"",
+ L"window.domAutomationController.send(postToFoo('msg2'));",
+ &success));
+ EXPECT_TRUE(success);
+ title_observer2.Wait();
+ EXPECT_EQ(ASCIIToUTF16("msg2"), foo_contents->GetTitle());
+
+ // This postMessage should have created a swapped out RVH for the new
+ // SiteInstance in the target=_blank window.
+ EXPECT_TRUE(new_manager->GetSwappedOutRenderViewHost(foo_site_instance));
+}
+
// Test for crbug.com/116192. Navigations to a window's opener should
// still work after a process swap.
IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest,

Powered by Google App Engine
This is Rietveld 408576698