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 |
deleted file mode 100644 |
index 24014ed2c0094d2f386ca7ff18db7bd5f06485fb..0000000000000000000000000000000000000000 |
--- a/content/browser/renderer_host/render_view_host_manager_browsertest.cc |
+++ /dev/null |
@@ -1,1361 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <set> |
- |
-#include "base/json/json_reader.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/path_service.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/values.h" |
-#include "content/browser/renderer_host/render_view_host_impl.h" |
-#include "content/browser/site_instance_impl.h" |
-#include "content/browser/web_contents/web_contents_impl.h" |
-#include "content/common/content_constants_internal.h" |
-#include "content/public/browser/navigation_controller.h" |
-#include "content/public/browser/navigation_entry.h" |
-#include "content/public/browser/notification_details.h" |
-#include "content/public/browser/notification_observer.h" |
-#include "content/public/browser/notification_registrar.h" |
-#include "content/public/browser/notification_types.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/browser/web_contents_observer.h" |
-#include "content/public/common/url_constants.h" |
-#include "content/public/test/browser_test_utils.h" |
-#include "content/public/test/test_navigation_observer.h" |
-#include "content/public/test/test_utils.h" |
-#include "content/shell/browser/shell.h" |
-#include "content/test/content_browser_test.h" |
-#include "content/test/content_browser_test_utils.h" |
-#include "net/base/net_util.h" |
-#include "net/test/spawned_test_server/spawned_test_server.h" |
- |
-namespace content { |
- |
-class RenderViewHostManagerTest : public ContentBrowserTest { |
- public: |
- RenderViewHostManagerTest() {} |
- |
- static bool GetFilePathWithHostAndPortReplacement( |
- const std::string& original_file_path, |
- const net::HostPortPair& host_port_pair, |
- std::string* replacement_path) { |
- std::vector<net::SpawnedTestServer::StringPair> replacement_text; |
- replacement_text.push_back( |
- make_pair("REPLACE_WITH_HOST_AND_PORT", host_port_pair.ToString())); |
- return net::SpawnedTestServer::GetFilePathWithReplacements( |
- original_file_path, replacement_text, replacement_path); |
- } |
-}; |
- |
-// Web pages should not have script access to the swapped out page. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- DISABLED_NoScriptAccessAfterSwapOut) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Open a same-site link in a new window. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickSameSiteTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the navigation in the new window to finish, if it hasn't. |
- WaitForLoadStop(new_shell->web_contents()); |
- EXPECT_EQ("/files/navigate_opener.html", |
- new_shell->web_contents()->GetLastCommittedURL().path()); |
- |
- // Should have the same SiteInstance. |
- scoped_refptr<SiteInstance> blank_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, blank_site_instance); |
- |
- // We should have access to the opened window's location. |
- success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(testScriptAccessToWindow());", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Now navigate the new window to a different site. |
- NavigateToURL(new_shell, https_server.GetURL("files/title1.html")); |
- scoped_refptr<SiteInstance> new_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_NE(orig_site_instance, new_site_instance); |
- |
- // We should no longer have script access to the opened window's location. |
- success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(testScriptAccessToWindow());", |
- &success)); |
- EXPECT_FALSE(success); |
-} |
- |
-// Test for crbug.com/24447. Following a cross-site link with rel=noreferrer |
-// and target=_blank should create a new SiteInstance. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- SwapProcessWithRelNoreferrerAndTargetBlank) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Test clicking a rel=noreferrer + target=blank link. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickNoRefTargetBlankLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Wait for the window to open. |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- EXPECT_EQ("/files/title2.html", |
- new_shell->web_contents()->GetVisibleURL().path()); |
- |
- // Wait for the cross-site transition in the new tab to finish. |
- WaitForLoadStop(new_shell->web_contents()); |
- WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( |
- new_shell->web_contents()); |
- EXPECT_FALSE(web_contents->GetRenderManagerForTesting()-> |
- pending_render_view_host()); |
- |
- // Should have a new SiteInstance. |
- scoped_refptr<SiteInstance> noref_blank_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_NE(orig_site_instance, noref_blank_site_instance); |
-} |
- |
-// As of crbug.com/69267, we create a new BrowsingInstance (and SiteInstance) |
-// for rel=noreferrer links in new windows, even to same site pages and named |
-// targets. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- SwapProcessWithSameSiteRelNoreferrer) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Test clicking a same-site rel=noreferrer + target=foo link. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickSameSiteNoRefTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Wait for the window to open. |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Opens in new window. |
- EXPECT_EQ("/files/title2.html", |
- new_shell->web_contents()->GetVisibleURL().path()); |
- |
- // Wait for the cross-site transition in the new tab to finish. |
- WaitForLoadStop(new_shell->web_contents()); |
- WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( |
- new_shell->web_contents()); |
- EXPECT_FALSE(web_contents->GetRenderManagerForTesting()-> |
- pending_render_view_host()); |
- |
- // Should have a new SiteInstance (in a new BrowsingInstance). |
- scoped_refptr<SiteInstance> noref_blank_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_NE(orig_site_instance, noref_blank_site_instance); |
-} |
- |
-// Test for crbug.com/24447. Following a cross-site link with just |
-// target=_blank should not create a new SiteInstance. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- DontSwapProcessWithOnlyTargetBlank) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Test clicking a target=blank link. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickTargetBlankLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Wait for the window to open. |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the cross-site transition in the new tab to finish. |
- WaitForLoadStop(new_shell->web_contents()); |
- EXPECT_EQ("/files/title2.html", |
- new_shell->web_contents()->GetLastCommittedURL().path()); |
- |
- // Should have the same SiteInstance. |
- scoped_refptr<SiteInstance> blank_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, blank_site_instance); |
-} |
- |
-// Test for crbug.com/24447. Following a cross-site link with rel=noreferrer |
-// and no target=_blank should not create a new SiteInstance. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- DontSwapProcessWithOnlyRelNoreferrer) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Test clicking a rel=noreferrer link. |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickNoRefLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Wait for the cross-site transition in the current tab to finish. |
- WaitForLoadStop(shell()->web_contents()); |
- |
- // Opens in same window. |
- EXPECT_EQ(1u, Shell::windows().size()); |
- EXPECT_EQ("/files/title2.html", |
- shell()->web_contents()->GetLastCommittedURL().path()); |
- |
- // Should have the same SiteInstance. |
- scoped_refptr<SiteInstance> noref_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, noref_site_instance); |
-} |
- |
-// Test for crbug.com/116192. Targeted links should still work after the |
-// named target window has swapped processes. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- AllowTargetedNavigationsAfterSwap) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Test clicking a target=foo link. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickSameSiteTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the navigation in the new tab to finish, if it hasn't. |
- WaitForLoadStop(new_shell->web_contents()); |
- EXPECT_EQ("/files/navigate_opener.html", |
- new_shell->web_contents()->GetLastCommittedURL().path()); |
- |
- // Should have the same SiteInstance. |
- scoped_refptr<SiteInstance> blank_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, blank_site_instance); |
- |
- // Now navigate the new tab to a different site. |
- NavigateToURL(new_shell, https_server.GetURL("files/title1.html")); |
- scoped_refptr<SiteInstance> new_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_NE(orig_site_instance, new_site_instance); |
- |
- // Clicking the original link in the first tab should cause us to swap back. |
- TestNavigationObserver navigation_observer(new_shell->web_contents()); |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickSameSiteTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- navigation_observer.Wait(); |
- |
- // Should have swapped back and shown the new window again. |
- scoped_refptr<SiteInstance> revisit_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, revisit_site_instance); |
- |
- // If it navigates away to another process, the original window should |
- // still be able to close it (using a cross-process close message). |
- NavigateToURL(new_shell, https_server.GetURL("files/title1.html")); |
- EXPECT_EQ(new_site_instance, |
- new_shell->web_contents()->GetSiteInstance()); |
- WebContentsDestroyedWatcher close_watcher(new_shell->web_contents()); |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(testCloseWindow());", |
- &success)); |
- EXPECT_TRUE(success); |
- close_watcher.Wait(); |
-} |
- |
-// Test that setting the opener to null in a window affects cross-process |
-// navigations, including those to existing entries. http://crbug.com/156669. |
-// Flaky on windows: http://crbug.com/291249 |
-#if defined(OS_WIN) |
-#define MAYBE_DisownOpener DISABLED_DisownOpener |
-#else |
-#define MAYBE_DisownOpener DisownOpener |
-#endif |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, MAYBE_DisownOpener) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Test clicking a target=_blank link. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickSameSiteTargetBlankLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the navigation in the new tab to finish, if it hasn't. |
- WaitForLoadStop(new_shell->web_contents()); |
- EXPECT_EQ("/files/title2.html", |
- new_shell->web_contents()->GetLastCommittedURL().path()); |
- |
- // Should have the same SiteInstance. |
- scoped_refptr<SiteInstance> blank_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, blank_site_instance); |
- |
- // Now navigate the new tab to a different site. |
- NavigateToURL(new_shell, https_server.GetURL("files/title1.html")); |
- scoped_refptr<SiteInstance> new_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_NE(orig_site_instance, new_site_instance); |
- |
- // Now disown the opener. |
- EXPECT_TRUE(ExecuteScript(new_shell->web_contents(), |
- "window.opener = null;")); |
- |
- // Go back and ensure the opener is still null. |
- { |
- TestNavigationObserver back_nav_load_observer(new_shell->web_contents()); |
- new_shell->web_contents()->GetController().GoBack(); |
- back_nav_load_observer.Wait(); |
- } |
- success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- new_shell->web_contents(), |
- "window.domAutomationController.send(window.opener == null);", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Now navigate forward again (creating a new process) and check opener. |
- NavigateToURL(new_shell, https_server.GetURL("files/title1.html")); |
- success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- new_shell->web_contents(), |
- "window.domAutomationController.send(window.opener == null);", |
- &success)); |
- EXPECT_TRUE(success); |
-} |
- |
-// Test that subframes can disown their openers. http://crbug.com/225528. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, DisownSubframeOpener) { |
- const GURL frame_url("data:text/html,<iframe name=\"foo\"></iframe>"); |
- NavigateToURL(shell(), frame_url); |
- |
- // Give the frame an opener using window.open. |
- EXPECT_TRUE(ExecuteScript(shell()->web_contents(), |
- "window.open('about:blank','foo');")); |
- |
- // Now disown the frame's opener. Shouldn't crash. |
- EXPECT_TRUE(ExecuteScript(shell()->web_contents(), |
- "window.frames[0].opener = null;")); |
-} |
- |
-// 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". |
-// 5) Post a message from "foo" to a subframe of opener, which replies back. |
-// 6) Post a message from _blank to a subframe of "foo". |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- SupportCrossProcessPostMessage) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance and RVHM for later comparison. |
- WebContents* opener_contents = shell()->web_contents(); |
- scoped_refptr<SiteInstance> orig_site_instance( |
- opener_contents->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != 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. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- opener_contents, |
- "window.domAutomationController.send(clickSameSiteTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the navigation in the new window to finish, if it hasn't, then |
- // send it to post_message.html on a different site. |
- WebContents* foo_contents = new_shell->web_contents(); |
- WaitForLoadStop(foo_contents); |
- EXPECT_EQ("/files/navigate_opener.html", |
- foo_contents->GetLastCommittedURL().path()); |
- NavigateToURL(new_shell, 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. |
- ShellAddedObserver new_shell_observer2; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickSameSiteTargetBlankLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Wait for the navigation in the new window to finish, if it hasn't, then |
- // send it to post_message.html on the original site. |
- Shell* new_shell2 = new_shell_observer2.GetShell(); |
- WebContents* new_contents = new_shell2->web_contents(); |
- WaitForLoadStop(new_contents); |
- EXPECT_EQ("/files/title2.html", new_contents->GetLastCommittedURL().path()); |
- NavigateToURL(new_shell2, 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(3u, Shell::windows().size()); |
- EXPECT_TRUE( |
- opener_manager->GetSwappedOutRenderViewHost(foo_site_instance.get())); |
- EXPECT_FALSE( |
- new_manager->GetSwappedOutRenderViewHost(foo_site_instance.get())); |
- |
- // 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(ExecuteScriptAndExtractBool( |
- foo_contents, |
- "window.domAutomationController.send(postToOpener('msg'," |
- " 'http://google.com'));", |
- &success)); |
- EXPECT_TRUE(success); |
- ASSERT_FALSE( |
- opener_manager->GetSwappedOutRenderViewHost(orig_site_instance.get())); |
- |
- // 3) Post a message from the foo window to the opener. The opener will |
- // reply, causing the foo window to update its own title. |
- base::string16 expected_title = ASCIIToUTF16("msg"); |
- TitleWatcher title_watcher(foo_contents, expected_title); |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- foo_contents, |
- "window.domAutomationController.send(postToOpener('msg','*'));", |
- &success)); |
- EXPECT_TRUE(success); |
- ASSERT_FALSE( |
- opener_manager->GetSwappedOutRenderViewHost(orig_site_instance.get())); |
- ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle()); |
- |
- // We should have received only 1 message in the opener and "foo" tabs, |
- // and updated the title. |
- int opener_received_messages = 0; |
- EXPECT_TRUE(ExecuteScriptAndExtractInt( |
- opener_contents, |
- "window.domAutomationController.send(window.receivedMessages);", |
- &opener_received_messages)); |
- int foo_received_messages = 0; |
- EXPECT_TRUE(ExecuteScriptAndExtractInt( |
- foo_contents, |
- "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. |
- expected_title = ASCIIToUTF16("msg2"); |
- TitleWatcher title_watcher2(foo_contents, expected_title); |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- new_contents, |
- "window.domAutomationController.send(postToFoo('msg2'));", |
- &success)); |
- EXPECT_TRUE(success); |
- ASSERT_EQ(expected_title, title_watcher2.WaitAndGetTitle()); |
- |
- // 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.get())); |
- |
- // TODO(nasko): Test subframe targeting of postMessage once |
- // http://crbug.com/153701 is fixed. |
-} |
- |
-// Test for crbug.com/278336. MessagePorts should work cross-process. I.e., |
-// messages which contain Transferables and get intercepted by |
-// RenderViewImpl::willCheckAndDispatchMessageEvent (because the RenderView is |
-// swapped out) should work. |
-// Specifically: |
-// 1) Create 2 windows (opener and "foo") and send "foo" cross-process. |
-// 2) Post a message containing a message port from opener to "foo". |
-// 3) Post a message from "foo" back to opener via the passed message port. |
-// The test will be enabled when the feature implementation lands. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- SupportCrossProcessPostMessageWithMessagePort) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance and RVHM for later comparison. |
- WebContents* opener_contents = shell()->web_contents(); |
- scoped_refptr<SiteInstance> orig_site_instance( |
- opener_contents->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- RenderViewHostManager* opener_manager = static_cast<WebContentsImpl*>( |
- opener_contents)->GetRenderManagerForTesting(); |
- |
- // 1) Open a named target=foo window. We will later post a message between the |
- // opener and the new window. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- opener_contents, |
- "window.domAutomationController.send(clickSameSiteTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the navigation in the new window to finish, if it hasn't, then |
- // send it to post_message.html on a different site. |
- WebContents* foo_contents = new_shell->web_contents(); |
- WaitForLoadStop(foo_contents); |
- EXPECT_EQ("/files/navigate_opener.html", |
- foo_contents->GetLastCommittedURL().path()); |
- NavigateToURL( |
- new_shell, |
- https_server.GetURL("files/post_message.html")); |
- scoped_refptr<SiteInstance> foo_site_instance( |
- foo_contents->GetSiteInstance()); |
- EXPECT_NE(orig_site_instance, foo_site_instance); |
- |
- // We now have two windows. The opener should have a swapped out RVH |
- // for the new SiteInstance. |
- EXPECT_EQ(2u, Shell::windows().size()); |
- EXPECT_TRUE( |
- opener_manager->GetSwappedOutRenderViewHost(foo_site_instance.get())); |
- |
- // 2) Post a message containing a MessagePort from opener to the the foo |
- // window. The foo window will reply via the passed port, causing the opener |
- // to update its own title. |
- WindowedNotificationObserver title_observer( |
- NOTIFICATION_WEB_CONTENTS_TITLE_UPDATED, |
- Source<WebContents>(opener_contents)); |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- opener_contents, |
- "window.domAutomationController.send(postWithPortToFoo());", |
- &success)); |
- EXPECT_TRUE(success); |
- ASSERT_FALSE( |
- opener_manager->GetSwappedOutRenderViewHost(orig_site_instance.get())); |
- title_observer.Wait(); |
- |
- // Check message counts. |
- int opener_received_messages_via_port = 0; |
- EXPECT_TRUE(ExecuteScriptAndExtractInt( |
- opener_contents, |
- "window.domAutomationController.send(window.receivedMessagesViaPort);", |
- &opener_received_messages_via_port)); |
- int foo_received_messages = 0; |
- EXPECT_TRUE(ExecuteScriptAndExtractInt( |
- foo_contents, |
- "window.domAutomationController.send(window.receivedMessages);", |
- &foo_received_messages)); |
- int foo_received_messages_with_port = 0; |
- EXPECT_TRUE(ExecuteScriptAndExtractInt( |
- foo_contents, |
- "window.domAutomationController.send(window.receivedMessagesWithPort);", |
- &foo_received_messages_with_port)); |
- EXPECT_EQ(1, foo_received_messages); |
- EXPECT_EQ(1, foo_received_messages_with_port); |
- EXPECT_EQ(1, opener_received_messages_via_port); |
- EXPECT_EQ(ASCIIToUTF16("msg-with-port"), foo_contents->GetTitle()); |
- EXPECT_EQ(ASCIIToUTF16("msg-back-via-port"), opener_contents->GetTitle()); |
-} |
- |
-// Test for crbug.com/116192. Navigations to a window's opener should |
-// still work after a process swap. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- AllowTargetedNavigationsInOpenerAfterSwap) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original tab and SiteInstance for later comparison. |
- WebContents* orig_contents = shell()->web_contents(); |
- scoped_refptr<SiteInstance> orig_site_instance( |
- orig_contents->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Test clicking a target=foo link. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- orig_contents, |
- "window.domAutomationController.send(clickSameSiteTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the navigation in the new window to finish, if it hasn't. |
- WaitForLoadStop(new_shell->web_contents()); |
- EXPECT_EQ("/files/navigate_opener.html", |
- new_shell->web_contents()->GetLastCommittedURL().path()); |
- |
- // Should have the same SiteInstance. |
- scoped_refptr<SiteInstance> blank_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, blank_site_instance); |
- |
- // Now navigate the original (opener) tab to a different site. |
- NavigateToURL(shell(), https_server.GetURL("files/title1.html")); |
- scoped_refptr<SiteInstance> new_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_NE(orig_site_instance, new_site_instance); |
- |
- // The opened tab should be able to navigate the opener back to its process. |
- TestNavigationObserver navigation_observer(orig_contents); |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- new_shell->web_contents(), |
- "window.domAutomationController.send(navigateOpener());", |
- &success)); |
- EXPECT_TRUE(success); |
- navigation_observer.Wait(); |
- |
- // Should have swapped back into this process. |
- scoped_refptr<SiteInstance> revisit_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, revisit_site_instance); |
-} |
- |
-// Test that opening a new window in the same SiteInstance and then navigating |
-// both windows to a different SiteInstance allows the first process to exit. |
-// See http://crbug.com/126333. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- ProcessExitWithSwappedOutViews) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Test clicking a target=foo link. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickSameSiteTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the navigation in the new window to finish, if it hasn't. |
- WaitForLoadStop(new_shell->web_contents()); |
- EXPECT_EQ("/files/navigate_opener.html", |
- new_shell->web_contents()->GetLastCommittedURL().path()); |
- |
- // Should have the same SiteInstance. |
- scoped_refptr<SiteInstance> opened_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, opened_site_instance); |
- |
- // Now navigate the opened window to a different site. |
- NavigateToURL(new_shell, https_server.GetURL("files/title1.html")); |
- scoped_refptr<SiteInstance> new_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_NE(orig_site_instance, new_site_instance); |
- |
- // The original process should still be alive, since it is still used in the |
- // first window. |
- RenderProcessHost* orig_process = orig_site_instance->GetProcess(); |
- EXPECT_TRUE(orig_process->HasConnection()); |
- |
- // Navigate the first window to a different site as well. The original |
- // process should exit, since all of its views are now swapped out. |
- WindowedNotificationObserver exit_observer( |
- NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
- Source<RenderProcessHost>(orig_process)); |
- NavigateToURL(shell(), https_server.GetURL("files/title1.html")); |
- exit_observer.Wait(); |
- scoped_refptr<SiteInstance> new_site_instance2( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(new_site_instance, new_site_instance2); |
-} |
- |
-// Test for crbug.com/76666. A cross-site navigation that fails with a 204 |
-// error should not make us ignore future renderer-initiated navigations. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, ClickLinkAfter204Error) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/test/data"))); |
- ASSERT_TRUE(https_server.Start()); |
- |
- // Load a page with links that open in a new window. |
- // The links will point to the HTTPS server. |
- std::string replacement_path; |
- ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( |
- "files/click-noreferrer-links.html", |
- https_server.host_port_pair(), |
- &replacement_path)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_TRUE(orig_site_instance.get() != NULL); |
- |
- // Load a cross-site page that fails with a 204 error. |
- NavigateToURL(shell(), https_server.GetURL("nocontent")); |
- |
- // We should still be looking at the normal page. The typed URL will |
- // still be visible until the user clears it manually, but the last |
- // committed URL will be the previous page. |
- scoped_refptr<SiteInstance> post_nav_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, post_nav_site_instance); |
- EXPECT_EQ("/nocontent", |
- shell()->web_contents()->GetVisibleURL().path()); |
- EXPECT_EQ("/files/click-noreferrer-links.html", |
- shell()->web_contents()->GetController(). |
- GetLastCommittedEntry()->GetVirtualURL().path()); |
- |
- // Renderer-initiated navigations should work. |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickNoRefLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Wait for the cross-site transition in the current tab to finish. |
- WaitForLoadStop(shell()->web_contents()); |
- |
- // Opens in same tab. |
- EXPECT_EQ(1u, Shell::windows().size()); |
- EXPECT_EQ("/files/title2.html", |
- shell()->web_contents()->GetLastCommittedURL().path()); |
- |
- // Should have the same SiteInstance. |
- scoped_refptr<SiteInstance> noref_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- EXPECT_EQ(orig_site_instance, noref_site_instance); |
-} |
- |
-// Test for crbug.com/9682. We should show the URL for a pending renderer- |
-// initiated navigation in a new tab, until the content of the initial |
-// about:blank page is modified by another window. At that point, we should |
-// revert to showing about:blank to prevent a URL spoof. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, ShowLoadingURLUntilSpoof) { |
- ASSERT_TRUE(test_server()->Start()); |
- |
- // Load a page that can open a URL that won't commit in a new window. |
- NavigateToURL( |
- shell(), test_server()->GetURL("files/click-nocontent-link.html")); |
- WebContents* orig_contents = shell()->web_contents(); |
- |
- // Click a /nocontent link that opens in a new window but never commits. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- orig_contents, |
- "window.domAutomationController.send(clickNoContentTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Wait for the window to open. |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Ensure the destination URL is visible, because it is considered the |
- // initial navigation. |
- WebContents* contents = new_shell->web_contents(); |
- EXPECT_TRUE(contents->GetController().IsInitialNavigation()); |
- EXPECT_EQ("/nocontent", |
- contents->GetController().GetVisibleEntry()->GetURL().path()); |
- |
- // Now modify the contents of the new window from the opener. This will also |
- // modify the title of the document to give us something to listen for. |
- base::string16 expected_title = ASCIIToUTF16("Modified Title"); |
- TitleWatcher title_watcher(contents, expected_title); |
- success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- orig_contents, |
- "window.domAutomationController.send(modifyNewWindow());", |
- &success)); |
- EXPECT_TRUE(success); |
- ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle()); |
- |
- // At this point, we should no longer be showing the destination URL. |
- // The visible entry should be null, resulting in about:blank in the address |
- // bar. |
- EXPECT_FALSE(contents->GetController().GetVisibleEntry()); |
-} |
- |
-// Test for crbug.com/9682. We should not show the URL for a pending renderer- |
-// initiated navigation in a new tab if it is not the initial navigation. In |
-// this case, the renderer will not notify us of a modification, so we cannot |
-// show the pending URL without allowing a spoof. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- DontShowLoadingURLIfNotInitialNav) { |
- ASSERT_TRUE(test_server()->Start()); |
- |
- // Load a page that can open a URL that won't commit in a new window. |
- NavigateToURL( |
- shell(), test_server()->GetURL("files/click-nocontent-link.html")); |
- WebContents* orig_contents = shell()->web_contents(); |
- |
- // Click a /nocontent link that opens in a new window but never commits. |
- // By using an onclick handler that first creates the window, the slow |
- // navigation is not considered an initial navigation. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- orig_contents, |
- "window.domAutomationController.send(" |
- "clickNoContentScriptedTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Wait for the window to open. |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Ensure the destination URL is not visible, because it is not the initial |
- // navigation. |
- WebContents* contents = new_shell->web_contents(); |
- EXPECT_FALSE(contents->GetController().IsInitialNavigation()); |
- EXPECT_FALSE(contents->GetController().GetVisibleEntry()); |
-} |
- |
-// Test for http://crbug.com/93427. Ensure that cross-site navigations |
-// do not cause back/forward navigations to be considered stale by the |
-// renderer. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, BackForwardNotStale) { |
- NavigateToURL(shell(), GURL(kAboutBlankURL)); |
- |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/test/data"))); |
- ASSERT_TRUE(https_server.Start()); |
- |
- // Visit a page on first site. |
- std::string replacement_path_a1; |
- ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( |
- "files/title1.html", |
- test_server()->host_port_pair(), |
- &replacement_path_a1)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path_a1)); |
- |
- // Visit three pages on second site. |
- std::string replacement_path_b1; |
- ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( |
- "files/title1.html", |
- https_server.host_port_pair(), |
- &replacement_path_b1)); |
- NavigateToURL(shell(), https_server.GetURL(replacement_path_b1)); |
- std::string replacement_path_b2; |
- ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( |
- "files/title2.html", |
- https_server.host_port_pair(), |
- &replacement_path_b2)); |
- NavigateToURL(shell(), https_server.GetURL(replacement_path_b2)); |
- std::string replacement_path_b3; |
- ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( |
- "files/title3.html", |
- https_server.host_port_pair(), |
- &replacement_path_b3)); |
- NavigateToURL(shell(), https_server.GetURL(replacement_path_b3)); |
- |
- // History is now [blank, A1, B1, B2, *B3]. |
- WebContents* contents = shell()->web_contents(); |
- EXPECT_EQ(5, contents->GetController().GetEntryCount()); |
- |
- // Open another window in same process to keep this process alive. |
- Shell* new_shell = CreateBrowser(); |
- NavigateToURL(new_shell, https_server.GetURL(replacement_path_b1)); |
- |
- // Go back three times to first site. |
- { |
- TestNavigationObserver back_nav_load_observer(shell()->web_contents()); |
- shell()->web_contents()->GetController().GoBack(); |
- back_nav_load_observer.Wait(); |
- } |
- { |
- TestNavigationObserver back_nav_load_observer(shell()->web_contents()); |
- shell()->web_contents()->GetController().GoBack(); |
- back_nav_load_observer.Wait(); |
- } |
- { |
- TestNavigationObserver back_nav_load_observer(shell()->web_contents()); |
- shell()->web_contents()->GetController().GoBack(); |
- back_nav_load_observer.Wait(); |
- } |
- |
- // Now go forward twice to B2. Shouldn't be left spinning. |
- { |
- TestNavigationObserver forward_nav_load_observer(shell()->web_contents()); |
- shell()->web_contents()->GetController().GoForward(); |
- forward_nav_load_observer.Wait(); |
- } |
- { |
- TestNavigationObserver forward_nav_load_observer(shell()->web_contents()); |
- shell()->web_contents()->GetController().GoForward(); |
- forward_nav_load_observer.Wait(); |
- } |
- |
- // Go back twice to first site. |
- { |
- TestNavigationObserver back_nav_load_observer(shell()->web_contents()); |
- shell()->web_contents()->GetController().GoBack(); |
- back_nav_load_observer.Wait(); |
- } |
- { |
- TestNavigationObserver back_nav_load_observer(shell()->web_contents()); |
- shell()->web_contents()->GetController().GoBack(); |
- back_nav_load_observer.Wait(); |
- } |
- |
- // Now go forward directly to B3. Shouldn't be left spinning. |
- { |
- TestNavigationObserver forward_nav_load_observer(shell()->web_contents()); |
- shell()->web_contents()->GetController().GoToIndex(4); |
- forward_nav_load_observer.Wait(); |
- } |
-} |
- |
-// Test for http://crbug.com/130016. |
-// Swapping out a render view should update its visiblity state. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- SwappedOutViewHasCorrectVisibilityState) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/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)); |
- NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
- |
- // Open a same-site link in a new widnow. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(clickSameSiteTargetedLink());", |
- &success)); |
- EXPECT_TRUE(success); |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the navigation in the new tab to finish, if it hasn't. |
- WaitForLoadStop(new_shell->web_contents()); |
- EXPECT_EQ("/files/navigate_opener.html", |
- new_shell->web_contents()->GetLastCommittedURL().path()); |
- |
- RenderViewHost* rvh = new_shell->web_contents()->GetRenderViewHost(); |
- |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- rvh, |
- "window.domAutomationController.send(" |
- " document.visibilityState == 'visible');", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Now navigate the new window to a different site. This should swap out the |
- // tab's existing RenderView, causing it become hidden. |
- NavigateToURL(new_shell, https_server.GetURL("files/title1.html")); |
- |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- rvh, |
- "window.domAutomationController.send(" |
- " document.visibilityState == 'hidden');", |
- &success)); |
- EXPECT_TRUE(success); |
- |
- // Going back should make the previously swapped-out view to become visible |
- // again. |
- { |
- TestNavigationObserver back_nav_load_observer(new_shell->web_contents()); |
- new_shell->web_contents()->GetController().GoBack(); |
- back_nav_load_observer.Wait(); |
- } |
- |
- EXPECT_EQ("/files/navigate_opener.html", |
- new_shell->web_contents()->GetLastCommittedURL().path()); |
- |
- EXPECT_EQ(rvh, new_shell->web_contents()->GetRenderViewHost()); |
- |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- rvh, |
- "window.domAutomationController.send(" |
- " document.visibilityState == 'visible');", |
- &success)); |
- EXPECT_TRUE(success); |
-} |
- |
-// This class ensures that all the given RenderViewHosts have properly been |
-// shutdown. |
-class RenderViewHostDestructionObserver : public WebContentsObserver { |
- public: |
- explicit RenderViewHostDestructionObserver(WebContents* web_contents) |
- : WebContentsObserver(web_contents) {} |
- virtual ~RenderViewHostDestructionObserver() {} |
- void EnsureRVHGetsDestructed(RenderViewHost* rvh) { |
- watched_render_view_hosts_.insert(rvh); |
- } |
- size_t GetNumberOfWatchedRenderViewHosts() const { |
- return watched_render_view_hosts_.size(); |
- } |
- |
- private: |
- // WebContentsObserver implementation: |
- virtual void RenderViewDeleted(RenderViewHost* rvh) OVERRIDE { |
- watched_render_view_hosts_.erase(rvh); |
- } |
- |
- std::set<RenderViewHost*> watched_render_view_hosts_; |
-}; |
- |
-// Test for crbug.com/90867. Make sure we don't leak render view hosts since |
-// they may cause crashes or memory corruptions when trying to call dead |
-// delegate_. This test also verifies crbug.com/117420 and crbug.com/143255 to |
-// ensure that a separate SiteInstance is created when navigating to view-source |
-// URLs, regardless of current URL. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, LeakingRenderViewHosts) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/test/data"))); |
- ASSERT_TRUE(https_server.Start()); |
- |
- // Observe the created render_view_host's to make sure they will not leak. |
- RenderViewHostDestructionObserver rvh_observers(shell()->web_contents()); |
- |
- GURL navigated_url(test_server()->GetURL("files/title2.html")); |
- GURL view_source_url(kViewSourceScheme + std::string(":") + |
- navigated_url.spec()); |
- |
- // Let's ensure that when we start with a blank window, navigating away to a |
- // view-source URL, we create a new SiteInstance. |
- RenderViewHost* blank_rvh = shell()->web_contents()->GetRenderViewHost(); |
- SiteInstance* blank_site_instance = blank_rvh->GetSiteInstance(); |
- EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), GURL::EmptyGURL()); |
- EXPECT_EQ(blank_site_instance->GetSiteURL(), GURL::EmptyGURL()); |
- rvh_observers.EnsureRVHGetsDestructed(blank_rvh); |
- |
- // Now navigate to the view-source URL and ensure we got a different |
- // SiteInstance and RenderViewHost. |
- NavigateToURL(shell(), view_source_url); |
- EXPECT_NE(blank_rvh, shell()->web_contents()->GetRenderViewHost()); |
- EXPECT_NE(blank_site_instance, shell()->web_contents()-> |
- GetRenderViewHost()->GetSiteInstance()); |
- rvh_observers.EnsureRVHGetsDestructed( |
- shell()->web_contents()->GetRenderViewHost()); |
- |
- // Load a random page and then navigate to view-source: of it. |
- // This used to cause two RVH instances for the same SiteInstance, which |
- // was a problem. This is no longer the case. |
- NavigateToURL(shell(), navigated_url); |
- SiteInstance* site_instance1 = shell()->web_contents()-> |
- GetRenderViewHost()->GetSiteInstance(); |
- rvh_observers.EnsureRVHGetsDestructed( |
- shell()->web_contents()->GetRenderViewHost()); |
- |
- NavigateToURL(shell(), view_source_url); |
- rvh_observers.EnsureRVHGetsDestructed( |
- shell()->web_contents()->GetRenderViewHost()); |
- SiteInstance* site_instance2 = shell()->web_contents()-> |
- GetRenderViewHost()->GetSiteInstance(); |
- |
- // Ensure that view-source navigations force a new SiteInstance. |
- EXPECT_NE(site_instance1, site_instance2); |
- |
- // Now navigate to a different instance so that we swap out again. |
- NavigateToURL(shell(), https_server.GetURL("files/title2.html")); |
- rvh_observers.EnsureRVHGetsDestructed( |
- shell()->web_contents()->GetRenderViewHost()); |
- |
- // This used to leak a render view host. |
- shell()->Close(); |
- |
- RunAllPendingInMessageLoop(); // Needed on ChromeOS. |
- |
- EXPECT_EQ(0U, rvh_observers.GetNumberOfWatchedRenderViewHosts()); |
-} |
- |
-// Test for crbug.com/143155. Frame tree updates during unload should not |
-// interrupt the intended navigation and show swappedout:// instead. |
-// Specifically: |
-// 1) Open 2 tabs in an HTTP SiteInstance, with a subframe in the opener. |
-// 2) Send the second tab to a different HTTPS SiteInstance. |
-// This creates a swapped out opener for the first tab in the HTTPS process. |
-// 3) Navigate the first tab to the HTTPS SiteInstance, and have the first |
-// tab's unload handler remove its frame. |
-// This used to cause an update to the frame tree of the swapped out RV, |
-// just as it was navigating to a real page. That pre-empted the real |
-// navigation and visibly sent the tab to swappedout://. |
-IN_PROC_BROWSER_TEST_F(RenderViewHostManagerTest, |
- DontPreemptNavigationWithFrameTreeUpdate) { |
- // Start two servers with different sites. |
- ASSERT_TRUE(test_server()->Start()); |
- net::SpawnedTestServer https_server( |
- net::SpawnedTestServer::TYPE_HTTPS, |
- net::SpawnedTestServer::kLocalhost, |
- base::FilePath(FILE_PATH_LITERAL("content/test/data"))); |
- ASSERT_TRUE(https_server.Start()); |
- |
- // 1. Load a page that deletes its iframe during unload. |
- NavigateToURL(shell(), |
- test_server()->GetURL("files/remove_frame_on_unload.html")); |
- |
- // Get the original SiteInstance for later comparison. |
- scoped_refptr<SiteInstance> orig_site_instance( |
- shell()->web_contents()->GetSiteInstance()); |
- |
- // Open a same-site page in a new window. |
- ShellAddedObserver new_shell_observer; |
- bool success = false; |
- EXPECT_TRUE(ExecuteScriptAndExtractBool( |
- shell()->web_contents(), |
- "window.domAutomationController.send(openWindow());", |
- &success)); |
- EXPECT_TRUE(success); |
- Shell* new_shell = new_shell_observer.GetShell(); |
- |
- // Wait for the navigation in the new window to finish, if it hasn't. |
- WaitForLoadStop(new_shell->web_contents()); |
- EXPECT_EQ("/files/title1.html", |
- new_shell->web_contents()->GetLastCommittedURL().path()); |
- |
- // Should have the same SiteInstance. |
- EXPECT_EQ(orig_site_instance, new_shell->web_contents()->GetSiteInstance()); |
- |
- // 2. Send the second tab to a different process. |
- NavigateToURL(new_shell, https_server.GetURL("files/title1.html")); |
- scoped_refptr<SiteInstance> new_site_instance( |
- new_shell->web_contents()->GetSiteInstance()); |
- EXPECT_NE(orig_site_instance, new_site_instance); |
- |
- // 3. Send the first tab to the second tab's process. |
- NavigateToURL(shell(), https_server.GetURL("files/title1.html")); |
- |
- // Make sure it ends up at the right page. |
- WaitForLoadStop(shell()->web_contents()); |
- EXPECT_EQ(https_server.GetURL("files/title1.html"), |
- shell()->web_contents()->GetLastCommittedURL()); |
- EXPECT_EQ(new_site_instance, shell()->web_contents()->GetSiteInstance()); |
-} |
- |
-} // namespace content |