1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include <set>
61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/webui/web_ui_impl.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/content_constants_internal.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/common/bindings_policy.h"
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/common/content_switches.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test.h"
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/content_browser_test_utils.h"
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/dns/mock_host_resolver.h"
35b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kOpenUrlViaClickTargetFunc[] =
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "(function(url) {\n"
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "  var lnk = document.createElement(\"a\");\n"
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "  lnk.href = url;\n"
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "  lnk.target = \"_blank\";\n"
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "  document.body.appendChild(lnk);\n"
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "  lnk.click();\n"
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "})";
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Adds a link with given url and target=_blank, and clicks on it.
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void OpenUrlViaClickTarget(const internal::ToRenderFrameHost& adapter,
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           const GURL& url) {
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(ExecuteScript(adapter,
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      std::string(kOpenUrlViaClickTargetFunc) + "(\"" + url.spec() + "\");"));
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // anonymous namespace
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class RenderFrameHostManagerTest : public ContentBrowserTest {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderFrameHostManagerTest() : foo_com_("foo.com") {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    replace_host_.SetHostStr(foo_com_);
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetFilePathWithHostAndPortReplacement(
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& original_file_path,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::HostPortPair& host_port_pair,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string* replacement_path) {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<net::SpawnedTestServer::StringPair> replacement_text;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    replacement_text.push_back(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        make_pair("REPLACE_WITH_HOST_AND_PORT", host_port_pair.ToString()));
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return net::SpawnedTestServer::GetFilePathWithReplacements(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        original_file_path, replacement_text, replacement_path);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void StartServer() {
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Support multiple sites on the test server.
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    host_resolver()->AddRule("*", "127.0.0.1");
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(test_server()->Start());
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    foo_host_port_ = test_server()->host_port_pair();
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    foo_host_port_.set_host(foo_com_);
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns a URL on foo.com with the given path.
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL GetCrossSiteURL(const std::string& path) {
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GURL cross_site_url(test_server()->GetURL(path));
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return cross_site_url.ReplaceComponents(replace_host_);
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string foo_com_;
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL::Replacements replace_host_;
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  net::HostPortPair foo_host_port_;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Web pages should not have script access to the swapped out page.
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, NoScriptAccessAfterSwapOut) {
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance for later comparison.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a same-site link in a new window.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetedLink());",
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the navigation in the new window to finish, if it hasn't.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/files/navigate_opener.html",
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetLastCommittedURL().path());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have the same SiteInstance.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> blank_site_instance(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(orig_site_instance, blank_site_instance);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have access to the opened window's location.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  success = false;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(testScriptAccessToWindow());",
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate the new window to a different site.
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, GetCrossSiteURL("files/title1.html"));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> new_site_instance(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(orig_site_instance, new_site_instance);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should no longer have script access to the opened window's location.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  success = false;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(testScriptAccessToWindow());",
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(success);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/24447.  Following a cross-site link with rel=noreferrer
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and target=_blank should create a new SiteInstance.
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       SwapProcessWithRelNoreferrerAndTargetBlank) {
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance for later comparison.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test clicking a rel=noreferrer + target=blank link.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickNoRefTargetBlankLink());",
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the window to open.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("/files/title2.html",
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetVisibleURL().path());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the cross-site transition in the new tab to finish.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(web_contents->GetRenderManagerForTesting()->
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_render_view_host());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have a new SiteInstance.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> noref_blank_site_instance(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(orig_site_instance, noref_blank_site_instance);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// As of crbug.com/69267, we create a new BrowsingInstance (and SiteInstance)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for rel=noreferrer links in new windows, even to same site pages and named
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// targets.
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       SwapProcessWithSameSiteRelNoreferrer) {
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance for later comparison.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test clicking a same-site rel=noreferrer + target=foo link.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteNoRefTargetedLink());",
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the window to open.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens in new window.
2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("/files/title2.html",
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetVisibleURL().path());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the cross-site transition in the new tab to finish.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(web_contents->GetRenderManagerForTesting()->
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_render_view_host());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have a new SiteInstance (in a new BrowsingInstance).
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> noref_blank_site_instance(
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(orig_site_instance, noref_blank_site_instance);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/24447.  Following a cross-site link with just
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// target=_blank should not create a new SiteInstance.
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DontSwapProcessWithOnlyTargetBlank) {
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance for later comparison.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test clicking a target=blank link.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickTargetBlankLink());",
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the window to open.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the cross-site transition in the new tab to finish.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/files/title2.html",
2893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetLastCommittedURL().path());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have the same SiteInstance.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> blank_site_instance(
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(orig_site_instance, blank_site_instance);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/24447.  Following a cross-site link with rel=noreferrer
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and no target=_blank should not create a new SiteInstance.
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DontSwapProcessWithOnlyRelNoreferrer) {
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance for later comparison.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test clicking a rel=noreferrer link.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickNoRefLink());",
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the cross-site transition in the current tab to finish.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(shell()->web_contents());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens in same window.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, Shell::windows().size());
3293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("/files/title2.html",
3303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            shell()->web_contents()->GetLastCommittedURL().path());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have the same SiteInstance.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> noref_site_instance(
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(orig_site_instance, noref_site_instance);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/116192.  Targeted links should still work after the
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// named target window has swapped processes.
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       AllowTargetedNavigationsAfterSwap) {
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance for later comparison.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test clicking a target=foo link.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetedLink());",
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the navigation in the new tab to finish, if it hasn't.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/files/navigate_opener.html",
3703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetLastCommittedURL().path());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have the same SiteInstance.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> blank_site_instance(
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(orig_site_instance, blank_site_instance);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate the new tab to a different site.
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL cross_site_url(GetCrossSiteURL("files/title1.html"));
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, cross_site_url);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> new_site_instance(
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(orig_site_instance, new_site_instance);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clicking the original link in the first tab should cause us to swap back.
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TestNavigationObserver navigation_observer(new_shell->web_contents());
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetedLink());",
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_observer.Wait();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have swapped back and shown the new window again.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> revisit_site_instance(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(orig_site_instance, revisit_site_instance);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If it navigates away to another process, the original window should
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // still be able to close it (using a cross-process close message).
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, cross_site_url);
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(new_site_instance.get(),
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new_shell->web_contents()->GetSiteInstance());
4038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  WebContentsDestroyedWatcher close_watcher(new_shell->web_contents());
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(testCloseWindow());",
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
4098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  close_watcher.Wait();
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that setting the opener to null in a window affects cross-process
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// navigations, including those to existing entries.  http://crbug.com/156669.
41403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This test crashes under ThreadSanitizer, http://crbug.com/356758.
41503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(THREAD_SANITIZER)
416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define MAYBE_DisownOpener DISABLED_DisownOpener
417d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else
418d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define MAYBE_DisownOpener DisownOpener
419d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, MAYBE_DisownOpener) {
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Load a page with links that open in a new window.
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string replacement_path;
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "files/click-noreferrer-links.html",
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &replacement_path));
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the original SiteInstance for later comparison.
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
434868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test clicking a target=_blank link.
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShellAddedObserver new_shell_observer;
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool success = false;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetBlankLink());",
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &success));
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(success);
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
44503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(new_shell->web_contents()->HasOpener());
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wait for the navigation in the new tab to finish, if it hasn't.
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ("/files/title2.html",
4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetLastCommittedURL().path());
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Should have the same SiteInstance.
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SiteInstance> blank_site_instance(
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(orig_site_instance, blank_site_instance);
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now navigate the new tab to a different site.
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, GetCrossSiteURL("files/title1.html"));
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SiteInstance> new_site_instance(
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(orig_site_instance, new_site_instance);
46203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(new_shell->web_contents()->HasOpener());
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now disown the opener.
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScript(new_shell->web_contents(),
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            "window.opener = null;"));
46703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(new_shell->web_contents()->HasOpener());
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Go back and ensure the opener is still null.
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver back_nav_load_observer(new_shell->web_contents());
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new_shell->web_contents()->GetController().GoBack();
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    back_nav_load_observer.Wait();
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  success = false;
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_shell->web_contents(),
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(window.opener == null);",
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &success));
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(success);
48103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(new_shell->web_contents()->HasOpener());
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now navigate forward again (creating a new process) and check opener.
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, GetCrossSiteURL("files/title1.html"));
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  success = false;
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_shell->web_contents(),
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(window.opener == null);",
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &success));
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(success);
49103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(new_shell->web_contents()->HasOpener());
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Test that subframes can disown their openers.  http://crbug.com/225528.
495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, DisownSubframeOpener) {
496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL frame_url("data:text/html,<iframe name=\"foo\"></iframe>");
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  NavigateToURL(shell(), frame_url);
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Give the frame an opener using window.open.
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(ExecuteScript(shell()->web_contents(),
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            "window.open('about:blank','foo');"));
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Now disown the frame's opener.  Shouldn't crash.
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(ExecuteScript(shell()->web_contents(),
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                            "window.frames[0].opener = null;"));
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
507c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/99202.  PostMessage calls should still work after
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigating the source and target windows to different sites.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specifically:
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) Create 3 windows (opener, "foo", and _blank) and send "foo" cross-process.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) Fail to post a message from "foo" to opener with the wrong target origin.
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) Post a message from "foo" to opener, which replies back to "foo".
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4) Post a message from _blank to "foo".
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 5) Post a message from "foo" to a subframe of opener, which replies back.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6) Post a message from _blank to a subframe of "foo".
517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       SupportCrossProcessPostMessage) {
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance and RVHM for later comparison.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* opener_contents = shell()->web_contents();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      opener_contents->GetSiteInstance());
533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderFrameHostManager* opener_manager = static_cast<WebContentsImpl*>(
535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      opener_contents)->GetRenderManagerForTesting();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1) Open two more windows, one named.  These initially have openers but no
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reference to each other.  We will later post a message between them.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First, a named target=foo window.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      opener_contents,
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetedLink());",
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the navigation in the new window to finish, if it hasn't, then
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // send it to post_message.html on a different site.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* foo_contents = new_shell->web_contents();
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(foo_contents);
5543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("/files/navigate_opener.html",
5553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            foo_contents->GetLastCommittedURL().path());
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, GetCrossSiteURL("files/post_message.html"));
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> foo_site_instance(
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      foo_contents->GetSiteInstance());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(orig_site_instance, foo_site_instance);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second, a target=_blank window.
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer2;
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetBlankLink());",
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the navigation in the new window to finish, if it hasn't, then
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // send it to post_message.html on the original site.
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell2 = new_shell_observer2.GetShell();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* new_contents = new_shell2->web_contents();
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_contents);
5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("/files/title2.html", new_contents->GetLastCommittedURL().path());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(new_shell2, test_server()->GetURL("files/post_message.html"));
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(orig_site_instance.get(), new_contents->GetSiteInstance());
577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderFrameHostManager* new_manager =
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<WebContentsImpl*>(new_contents)->GetRenderManagerForTesting();
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We now have three windows.  The opener should have a swapped out RVH
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the new SiteInstance, but the _blank window should not.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3u, Shell::windows().size());
583868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
584868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      opener_manager->GetSwappedOutRenderViewHost(foo_site_instance.get()));
585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(
586868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new_manager->GetSwappedOutRenderViewHost(foo_site_instance.get()));
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2) Fail to post a message from the foo window to the opener if the target
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origin is wrong.  We won't see an error, but we can check for the right
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // number of received messages below.
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      foo_contents,
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(postToOpener('msg',"
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "    'http://google.com'));",
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_FALSE(
598868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      opener_manager->GetSwappedOutRenderViewHost(orig_site_instance.get()));
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3) Post a message from the foo window to the opener.  The opener will
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reply, causing the foo window to update its own title.
6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::string16 expected_title = ASCIIToUTF16("msg");
6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TitleWatcher title_watcher(foo_contents, expected_title);
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      foo_contents,
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(postToOpener('msg','*'));",
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_FALSE(
610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      opener_manager->GetSwappedOutRenderViewHost(orig_site_instance.get()));
6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have received only 1 message in the opener and "foo" tabs,
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and updated the title.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int opener_received_messages = 0;
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractInt(
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      opener_contents,
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(window.receivedMessages);",
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &opener_received_messages));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int foo_received_messages = 0;
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractInt(
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      foo_contents,
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(window.receivedMessages);",
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &foo_received_messages));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, foo_received_messages);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, opener_received_messages);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("msg"), foo_contents->GetTitle());
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 4) Now post a message from the _blank window to the foo window.  The
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // foo window will update its title and will not reply.
6314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  expected_title = ASCIIToUTF16("msg2");
6324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TitleWatcher title_watcher2(foo_contents, expected_title);
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_contents,
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(postToFoo('msg2'));",
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(expected_title, title_watcher2.WaitAndGetTitle());
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This postMessage should have created a swapped out RVH for the new
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SiteInstance in the target=_blank window.
642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(
643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new_manager->GetSwappedOutRenderViewHost(foo_site_instance.get()));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(nasko): Test subframe targeting of postMessage once
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/153701 is fixed.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Test for crbug.com/278336. MessagePorts should work cross-process. I.e.,
6508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// messages which contain Transferables and get intercepted by
6518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// RenderViewImpl::willCheckAndDispatchMessageEvent (because the RenderView is
6528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// swapped out) should work.
6538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Specifically:
6548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// 1) Create 2 windows (opener and "foo") and send "foo" cross-process.
6558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// 2) Post a message containing a message port from opener to "foo".
6568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// 3) Post a message from "foo" back to opener via the passed message port.
6578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// The test will be enabled when the feature implementation lands.
658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
6598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                       SupportCrossProcessPostMessageWithMessagePort) {
6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
6618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Load a page with links that open in a new window.
6638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  std::string replacement_path;
6648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
6658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "files/click-noreferrer-links.html",
6665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
6678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &replacement_path));
6688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
6698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Get the original SiteInstance and RVHM for later comparison.
6718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  WebContents* opener_contents = shell()->web_contents();
6728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
6738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      opener_contents->GetSiteInstance());
6748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  RenderFrameHostManager* opener_manager = static_cast<WebContentsImpl*>(
6768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      opener_contents)->GetRenderManagerForTesting();
6778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // 1) Open a named target=foo window. We will later post a message between the
6798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // opener and the new window.
6808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ShellAddedObserver new_shell_observer;
6818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool success = false;
6828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
6838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      opener_contents,
6848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetedLink());",
6858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &success));
6868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(success);
6878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
6888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Wait for the navigation in the new window to finish, if it hasn't, then
6908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // send it to post_message.html on a different site.
6918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  WebContents* foo_contents = new_shell->web_contents();
6928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  WaitForLoadStop(foo_contents);
6938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ("/files/navigate_opener.html",
6948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)            foo_contents->GetLastCommittedURL().path());
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, GetCrossSiteURL("files/post_message.html"));
6968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_refptr<SiteInstance> foo_site_instance(
6978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      foo_contents->GetSiteInstance());
6988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_NE(orig_site_instance, foo_site_instance);
6998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // We now have two windows. The opener should have a swapped out RVH
7018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // for the new SiteInstance.
7028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(2u, Shell::windows().size());
7038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(
7048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      opener_manager->GetSwappedOutRenderViewHost(foo_site_instance.get()));
7058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // 2) Post a message containing a MessagePort from opener to the the foo
7078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // window. The foo window will reply via the passed port, causing the opener
7088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // to update its own title.
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 expected_title = ASCIIToUTF16("msg-back-via-port");
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TitleWatcher title_observer(opener_contents, expected_title);
7118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
7128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      opener_contents,
7138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "window.domAutomationController.send(postWithPortToFoo());",
7148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &success));
7158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(success);
7168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_FALSE(
7178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      opener_manager->GetSwappedOutRenderViewHost(orig_site_instance.get()));
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(expected_title, title_observer.WaitAndGetTitle());
7198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Check message counts.
7218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  int opener_received_messages_via_port = 0;
7228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractInt(
7238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      opener_contents,
7248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "window.domAutomationController.send(window.receivedMessagesViaPort);",
7258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &opener_received_messages_via_port));
7268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  int foo_received_messages = 0;
7278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractInt(
7288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      foo_contents,
7298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "window.domAutomationController.send(window.receivedMessages);",
7308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &foo_received_messages));
7318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  int foo_received_messages_with_port = 0;
7328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractInt(
7338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      foo_contents,
7348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      "window.domAutomationController.send(window.receivedMessagesWithPort);",
7358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      &foo_received_messages_with_port));
7368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(1, foo_received_messages);
7378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(1, foo_received_messages_with_port);
7388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(1, opener_received_messages_via_port);
7398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("msg-with-port"), foo_contents->GetTitle());
7408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("msg-back-via-port"), opener_contents->GetTitle());
7418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
7428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/116192.  Navigations to a window's opener should
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// still work after a process swap.
745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       AllowTargetedNavigationsInOpenerAfterSwap) {
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original tab and SiteInstance for later comparison.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* orig_contents = shell()->web_contents();
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      orig_contents->GetSiteInstance());
761868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test clicking a target=foo link.
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      orig_contents,
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetedLink());",
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the navigation in the new window to finish, if it hasn't.
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/files/navigate_opener.html",
7763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetLastCommittedURL().path());
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have the same SiteInstance.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> blank_site_instance(
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(orig_site_instance, blank_site_instance);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate the original (opener) tab to a different site.
7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), GetCrossSiteURL("files/title1.html"));
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> new_site_instance(
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(orig_site_instance, new_site_instance);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The opened tab should be able to navigate the opener back to its process.
790868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TestNavigationObserver navigation_observer(orig_contents);
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_shell->web_contents(),
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(navigateOpener());",
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigation_observer.Wait();
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have swapped back into this process.
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> revisit_site_instance(
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(orig_site_instance, revisit_site_instance);
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that opening a new window in the same SiteInstance and then navigating
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// both windows to a different SiteInstance allows the first process to exit.
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/126333.
807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ProcessExitWithSwappedOutViews) {
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
8155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance for later comparison.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test clicking a target=foo link.
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetedLink());",
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the navigation in the new window to finish, if it hasn't.
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/files/navigate_opener.html",
8373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetLastCommittedURL().path());
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have the same SiteInstance.
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> opened_site_instance(
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(orig_site_instance, opened_site_instance);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate the opened window to a different site.
8455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, GetCrossSiteURL("files/title1.html"));
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> new_site_instance(
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(orig_site_instance, new_site_instance);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The original process should still be alive, since it is still used in the
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first window.
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderProcessHost* orig_process = orig_site_instance->GetProcess();
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(orig_process->HasConnection());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate the first window to a different site as well.  The original
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process should exit, since all of its views are now swapped out.
8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderProcessHostWatcher exit_observer(
8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      orig_process,
8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RenderProcessHostWatcher::WATCH_FOR_HOST_DESTRUCTION);
8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), GetCrossSiteURL("files/title1.html"));
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exit_observer.Wait();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> new_site_instance2(
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(new_site_instance, new_site_instance2);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/76666.  A cross-site navigation that fails with a 204
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// error should not make us ignore future renderer-initiated navigations.
869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, ClickLinkAfter204Error) {
8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance for later comparison.
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
875868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(orig_site_instance.get() != NULL);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a cross-site page that fails with a 204 error.
8780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  NavigateToURL(shell(), GetCrossSiteURL("nocontent"));
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // We should still be looking at the normal page.  Because we started from a
8810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // blank new tab, the typed URL will still be visible until the user clears it
8820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // manually.  The last committed URL will be the previous page.
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> post_nav_site_instance(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(orig_site_instance, post_nav_site_instance);
8863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("/nocontent",
8873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            shell()->web_contents()->GetVisibleURL().path());
8880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(
8890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      shell()->web_contents()->GetController().GetLastCommittedEntry());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Renderer-initiated navigations should work.
8920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  base::string16 expected_title = ASCIIToUTF16("Title Of Awesomeness");
8930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TitleWatcher title_watcher(shell()->web_contents(), expected_title);
8940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GURL url = test_server()->GetURL("files/title2.html");
8950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(ExecuteScript(
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
8970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::StringPrintf("location.href = '%s'", url.spec().c_str())));
8980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle());
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens in same tab.
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, Shell::windows().size());
9023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ("/files/title2.html",
9033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            shell()->web_contents()->GetLastCommittedURL().path());
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have the same SiteInstance.
9060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<SiteInstance> new_site_instance(
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
9080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(orig_site_instance, new_site_instance);
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
911868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Test for crbug.com/9682.  We should show the URL for a pending renderer-
912868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// initiated navigation in a new tab, until the content of the initial
913868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// about:blank page is modified by another window.  At that point, we should
914868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// revert to showing about:blank to prevent a URL spoof.
915f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, ShowLoadingURLUntilSpoof) {
916868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
917868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
918868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Load a page that can open a URL that won't commit in a new window.
919868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NavigateToURL(
920868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      shell(), test_server()->GetURL("files/click-nocontent-link.html"));
921868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContents* orig_contents = shell()->web_contents();
922868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Click a /nocontent link that opens in a new window but never commits.
924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool success = false;
926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
927868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      orig_contents,
928868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "window.domAutomationController.send(clickNoContentTargetedLink());",
929868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &success));
930868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(success);
931868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
932868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Wait for the window to open.
933868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
934868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
935868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Ensure the destination URL is visible, because it is considered the
936868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // initial navigation.
937868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContents* contents = new_shell->web_contents();
938868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(contents->GetController().IsInitialNavigation());
939868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ("/nocontent",
940868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            contents->GetController().GetVisibleEntry()->GetURL().path());
941868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Now modify the contents of the new window from the opener.  This will also
943868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // modify the title of the document to give us something to listen for.
9444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::string16 expected_title = ASCIIToUTF16("Modified Title");
9454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  TitleWatcher title_watcher(contents, expected_title);
946868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  success = false;
947868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      orig_contents,
949868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "window.domAutomationController.send(modifyNewWindow());",
950868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &success));
951868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(success);
9524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle());
953868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // At this point, we should no longer be showing the destination URL.
955868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The visible entry should be null, resulting in about:blank in the address
956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // bar.
957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(contents->GetController().GetVisibleEntry());
958868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
959868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
960868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Test for crbug.com/9682.  We should not show the URL for a pending renderer-
961868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// initiated navigation in a new tab if it is not the initial navigation.  In
962868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// this case, the renderer will not notify us of a modification, so we cannot
963868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// show the pending URL without allowing a spoof.
964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
965868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       DontShowLoadingURLIfNotInitialNav) {
966868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
967868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
968868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Load a page that can open a URL that won't commit in a new window.
969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NavigateToURL(
970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      shell(), test_server()->GetURL("files/click-nocontent-link.html"));
971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContents* orig_contents = shell()->web_contents();
972868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
973868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Click a /nocontent link that opens in a new window but never commits.
974868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // By using an onclick handler that first creates the window, the slow
975868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // navigation is not considered an initial navigation.
976868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
977868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool success = false;
978868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
979868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      orig_contents,
980868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "window.domAutomationController.send("
981868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "clickNoContentScriptedTargetedLink());",
982868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      &success));
983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(success);
984868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
985868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Wait for the window to open.
986868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
987868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
988868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Ensure the destination URL is not visible, because it is not the initial
989868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // navigation.
990868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContents* contents = new_shell->web_contents();
991868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(contents->GetController().IsInitialNavigation());
992868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(contents->GetController().GetVisibleEntry());
993868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
994868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
995effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Crashes under ThreadSanitizer, http://crbug.com/356758.
996effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(THREAD_SANITIZER)
997effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MAYBE_BackForwardNotStale DISABLED_BackForwardNotStale
998effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
999effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MAYBE_BackForwardNotStale BackForwardNotStale
1000effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for http://crbug.com/93427.  Ensure that cross-site navigations
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// do not cause back/forward navigations to be considered stale by the
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// renderer.
1004effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, MAYBE_BackForwardNotStale) {
10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
1006f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NavigateToURL(shell(), GURL(url::kAboutBlankURL));
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit a page on first site.
10095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL("files/title1.html"));
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit three pages on second site.
10125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), GetCrossSiteURL("files/title1.html"));
10135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), GetCrossSiteURL("files/title2.html"));
10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), GetCrossSiteURL("files/title3.html"));
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // History is now [blank, A1, B1, B2, *B3].
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* contents = shell()->web_contents();
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, contents->GetController().GetEntryCount());
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open another window in same process to keep this process alive.
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = CreateBrowser();
10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, GetCrossSiteURL("files/title1.html"));
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Go back three times to first site.
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver back_nav_load_observer(shell()->web_contents());
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell()->web_contents()->GetController().GoBack();
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    back_nav_load_observer.Wait();
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1031868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver back_nav_load_observer(shell()->web_contents());
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell()->web_contents()->GetController().GoBack();
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    back_nav_load_observer.Wait();
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1036868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver back_nav_load_observer(shell()->web_contents());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell()->web_contents()->GetController().GoBack();
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    back_nav_load_observer.Wait();
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go forward twice to B2.  Shouldn't be left spinning.
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1043868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver forward_nav_load_observer(shell()->web_contents());
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell()->web_contents()->GetController().GoForward();
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    forward_nav_load_observer.Wait();
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver forward_nav_load_observer(shell()->web_contents());
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell()->web_contents()->GetController().GoForward();
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    forward_nav_load_observer.Wait();
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Go back twice to first site.
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver back_nav_load_observer(shell()->web_contents());
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell()->web_contents()->GetController().GoBack();
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    back_nav_load_observer.Wait();
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1060868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver back_nav_load_observer(shell()->web_contents());
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell()->web_contents()->GetController().GoBack();
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    back_nav_load_observer.Wait();
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now go forward directly to B3.  Shouldn't be left spinning.
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1067868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver forward_nav_load_observer(shell()->web_contents());
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shell()->web_contents()->GetController().GoToIndex(4);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    forward_nav_load_observer.Wait();
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for http://crbug.com/130016.
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Swapping out a render view should update its visiblity state.
1075f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       SwappedOutViewHasCorrectVisibilityState) {
10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a page with links that open in a new window.
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string replacement_path;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetFilePathWithHostAndPortReplacement(
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "files/click-noreferrer-links.html",
10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      foo_host_port_,
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &replacement_path));
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), test_server()->GetURL(replacement_path));
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a same-site link in a new widnow.
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(clickSameSiteTargetedLink());",
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the navigation in the new tab to finish, if it hasn't.
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/files/navigate_opener.html",
11003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetLastCommittedURL().path());
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* rvh = new_shell->web_contents()->GetRenderViewHost();
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      rvh,
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send("
1107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "    document.visibilityState == 'visible');",
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate the new window to a different site. This should swap out the
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // tab's existing RenderView, causing it become hidden.
11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, GetCrossSiteURL("files/title1.html"));
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      rvh,
11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send("
1118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "    document.visibilityState == 'hidden');",
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Going back should make the previously swapped-out view to become visible
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // again.
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TestNavigationObserver back_nav_load_observer(new_shell->web_contents());
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_shell->web_contents()->GetController().GoBack();
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    back_nav_load_observer.Wait();
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/files/navigate_opener.html",
11313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetLastCommittedURL().path());
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(rvh, new_shell->web_contents()->GetRenderViewHost());
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      rvh,
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send("
1138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "    document.visibilityState == 'visible');",
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// This class ensures that all the given RenderViewHosts have properly been
11441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// shutdown.
11451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class RenderViewHostDestructionObserver : public WebContentsObserver {
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
11471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit RenderViewHostDestructionObserver(WebContents* web_contents)
11481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : WebContentsObserver(web_contents) {}
11491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~RenderViewHostDestructionObserver() {}
11501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void EnsureRVHGetsDestructed(RenderViewHost* rvh) {
11511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    watched_render_view_hosts_.insert(rvh);
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  size_t GetNumberOfWatchedRenderViewHosts() const {
11541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return watched_render_view_hosts_.size();
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1156a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
11581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // WebContentsObserver implementation:
11591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void RenderViewDeleted(RenderViewHost* rvh) OVERRIDE {
11601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    watched_render_view_hosts_.erase(rvh);
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::set<RenderViewHost*> watched_render_view_hosts_;
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Crashes under ThreadSanitizer, http://crbug.com/356758.
1167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(THREAD_SANITIZER)
1168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MAYBE_LeakingRenderViewHosts DISABLED_LeakingRenderViewHosts
1169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#else
1170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define MAYBE_LeakingRenderViewHosts LeakingRenderViewHosts
1171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/90867. Make sure we don't leak render view hosts since
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// they may cause crashes or memory corruptions when trying to call dead
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate_. This test also verifies crbug.com/117420 and crbug.com/143255 to
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ensure that a separate SiteInstance is created when navigating to view-source
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URLs, regardless of current URL.
1177effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
1178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       MAYBE_LeakingRenderViewHosts) {
11795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observe the created render_view_host's to make sure they will not leak.
11821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderViewHostDestructionObserver rvh_observers(shell()->web_contents());
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL navigated_url(test_server()->GetURL("files/title2.html"));
1185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL view_source_url(kViewSourceScheme + std::string(":") +
1186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       navigated_url.spec());
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let's ensure that when we start with a blank window, navigating away to a
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // view-source URL, we create a new SiteInstance.
1190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RenderViewHost* blank_rvh = shell()->web_contents()->GetRenderViewHost();
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstance* blank_site_instance = blank_rvh->GetSiteInstance();
11923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), GURL::EmptyGURL());
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(blank_site_instance->GetSiteURL(), GURL::EmptyGURL());
11941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  rvh_observers.EnsureRVHGetsDestructed(blank_rvh);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to the view-source URL and ensure we got a different
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SiteInstance and RenderViewHost.
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), view_source_url);
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(blank_rvh, shell()->web_contents()->GetRenderViewHost());
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(blank_site_instance, shell()->web_contents()->
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRenderViewHost()->GetSiteInstance());
12021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  rvh_observers.EnsureRVHGetsDestructed(
12031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      shell()->web_contents()->GetRenderViewHost());
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load a random page and then navigate to view-source: of it.
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This used to cause two RVH instances for the same SiteInstance, which
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // was a problem.  This is no longer the case.
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), navigated_url);
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstance* site_instance1 = shell()->web_contents()->
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRenderViewHost()->GetSiteInstance();
12111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  rvh_observers.EnsureRVHGetsDestructed(
12121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      shell()->web_contents()->GetRenderViewHost());
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(), view_source_url);
12151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  rvh_observers.EnsureRVHGetsDestructed(
12161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      shell()->web_contents()->GetRenderViewHost());
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstance* site_instance2 = shell()->web_contents()->
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetRenderViewHost()->GetSiteInstance();
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that view-source navigations force a new SiteInstance.
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(site_instance1, site_instance2);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a different instance so that we swap out again.
12245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), GetCrossSiteURL("files/title2.html"));
12251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  rvh_observers.EnsureRVHGetsDestructed(
12261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      shell()->web_contents()->GetRenderViewHost());
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This used to leak a render view host.
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shell()->Close();
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAllPendingInMessageLoop();  // Needed on ChromeOS.
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(0U, rvh_observers.GetNumberOfWatchedRenderViewHosts());
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/143155.  Frame tree updates during unload should not
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interrupt the intended navigation and show swappedout:// instead.
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specifically:
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) Open 2 tabs in an HTTP SiteInstance, with a subframe in the opener.
12405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 2) Send the second tab to a different foo.com SiteInstance.
12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//    This creates a swapped out opener for the first tab in the foo process.
12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 3) Navigate the first tab to the foo.com SiteInstance, and have the first
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    tab's unload handler remove its frame.
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This used to cause an update to the frame tree of the swapped out RV,
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// just as it was navigating to a real page.  That pre-empted the real
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation and visibly sent the tab to swappedout://.
1247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DontPreemptNavigationWithFrameTreeUpdate) {
12495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartServer();
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. Load a page that deletes its iframe during unload.
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURL(shell(),
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                test_server()->GetURL("files/remove_frame_on_unload.html"));
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the original SiteInstance for later comparison.
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> orig_site_instance(
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shell()->web_contents()->GetSiteInstance());
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a same-site page in a new window.
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellAddedObserver new_shell_observer;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success = false;
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(ExecuteScriptAndExtractBool(
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shell()->web_contents(),
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "window.domAutomationController.send(openWindow());",
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &success));
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(success);
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell* new_shell = new_shell_observer.GetShell();
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the navigation in the new window to finish, if it hasn't.
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(new_shell->web_contents());
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("/files/title1.html",
12723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            new_shell->web_contents()->GetLastCommittedURL().path());
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should have the same SiteInstance.
12751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(orig_site_instance.get(),
12761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            new_shell->web_contents()->GetSiteInstance());
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. Send the second tab to a different process.
12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(new_shell, GetCrossSiteURL("files/title1.html"));
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstance> new_site_instance(
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_shell->web_contents()->GetSiteInstance());
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(orig_site_instance, new_site_instance);
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3. Send the first tab to the second tab's process.
12855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), GetCrossSiteURL("files/title1.html"));
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure it ends up at the right page.
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForLoadStop(shell()->web_contents());
12895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(GetCrossSiteURL("files/title1.html"),
12903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)            shell()->web_contents()->GetLastCommittedURL());
12911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(new_site_instance.get(),
12921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            shell()->web_contents()->GetSiteInstance());
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ensure that renderer-side debug URLs do not cause a process swap, since they
12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// are meant to run in the current page.  We had a bug where we expected a
12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// BrowsingInstance swap to occur on pages like view-source and extensions,
12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// which broke chrome://crash and javascript: URLs.
12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// See http://crbug.com/335503.
13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, RendererDebugURLsDontSwap) {
13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL original_url(test_server()->GetURL("files/title2.html"));
13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL view_source_url(kViewSourceScheme + std::string(":") +
13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       original_url.spec());
13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), view_source_url);
13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that javascript: URLs work.
13105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 expected_title = ASCIIToUTF16("msg");
13115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TitleWatcher title_watcher(shell()->web_contents(), expected_title);
13125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shell()->LoadURL(GURL("javascript:document.title='msg'"));
13135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle());
13145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Crash the renderer of the view-source page.
13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderProcessHostWatcher crash_observer(
13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      shell()->web_contents(),
13185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), GURL(kChromeUICrashURL));
13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  crash_observer.Wait();
13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ensure that renderer-side debug URLs don't take effect on crashed renderers.
13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Otherwise, we might try to load an unprivileged about:blank page into a
13255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// WebUI-enabled RenderProcessHost, failing a safety check in InitRenderView.
13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// See http://crbug.com/334214.
13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       IgnoreRendererDebugURLsWhenCrashed) {
13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Visit a WebUI page with bindings.
13305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL webui_url = GURL(std::string(kChromeUIScheme) + "://" +
13315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        std::string(kChromeUIGpuHost));
13325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), webui_url);
13335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
13345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  shell()->web_contents()->GetRenderProcessHost()->GetID()));
13355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Crash the renderer of the WebUI page.
13375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderProcessHostWatcher crash_observer(
13385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      shell()->web_contents(),
13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
13405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), GURL(kChromeUICrashURL));
13415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  crash_observer.Wait();
13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Load the crash URL again but don't wait for any action.  If it is not
13445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ignored this time, we will fail the WebUI CHECK in InitRenderView.
13455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  shell()->LoadURL(GURL(kChromeUICrashURL));
13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Ensure that such URLs can still work as the initial navigation of a tab.
13485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We postpone the initial navigation of the tab using an empty GURL, so that
13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // we can add a watcher for crashes.
13505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Shell* shell2 = Shell::CreateNewWindow(
13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      shell()->web_contents()->GetBrowserContext(), GURL(), NULL,
13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      MSG_ROUTING_NONE, gfx::Size());
13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  RenderProcessHostWatcher crash_observer2(
13545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      shell2->web_contents(),
13555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell2, GURL(kChromeUIKillURL));
13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  crash_observer2.Wait();
13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Ensure that pending_and_current_web_ui_ is cleared when a URL commits.
13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Otherwise it might get picked up by InitRenderView when granting bindings
13625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to other RenderViewHosts.  See http://crbug.com/330811.
13635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, ClearPendingWebUIOnCommit) {
13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Visit a WebUI page with bindings.
13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL webui_url(GURL(std::string(kChromeUIScheme) + "://" +
13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      std::string(kChromeUIGpuHost)));
13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), webui_url);
13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  shell()->web_contents()->GetRenderProcessHost()->GetID()));
13705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(
13715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      shell()->web_contents());
13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebUIImpl* webui = web_contents->GetRenderManagerForTesting()->web_ui();
13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(webui);
13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(web_contents->GetRenderManagerForTesting()->pending_web_ui());
13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Navigate to another WebUI URL that reuses the WebUI object.  Make sure we
13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // clear pending_web_ui() when it commits.
13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL webui_url2(webui_url.spec() + "#foo");
13795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NavigateToURL(shell(), webui_url2);
13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(webui, web_contents->GetRenderManagerForTesting()->web_ui());
13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(web_contents->GetRenderManagerForTesting()->pending_web_ui());
13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class RFHMProcessPerTabTest : public RenderFrameHostManagerTest {
1385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
1386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RFHMProcessPerTabTest() {}
1387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    command_line->AppendSwitch(switches::kProcessPerTab);
1390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
1392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Test that we still swap processes for BrowsingInstance changes even in
1394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// --process-per-tab mode.  See http://crbug.com/343017.
1395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Disabled on Android: http://crbug.com/345873.
1396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Crashes under ThreadSanitizer, http://crbug.com/356758.
1397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_ANDROID) || defined(THREAD_SANITIZER)
1398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define MAYBE_BackFromWebUI DISABLED_BackFromWebUI
1399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
1400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define MAYBE_BackFromWebUI BackFromWebUI
1401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
1402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(RFHMProcessPerTabTest, MAYBE_BackFromWebUI) {
1403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
1404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GURL original_url(test_server()->GetURL("files/title2.html"));
1405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NavigateToURL(shell(), original_url);
1406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Visit a WebUI page with bindings.
1408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GURL webui_url(GURL(std::string(kChromeUIScheme) + "://" +
1409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      std::string(kChromeUIGpuHost)));
1410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NavigateToURL(shell(), webui_url);
1411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
1412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  shell()->web_contents()->GetRenderProcessHost()->GetID()));
1413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Go back and ensure we have no WebUI bindings.
1415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TestNavigationObserver back_nav_load_observer(shell()->web_contents());
1416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  shell()->web_contents()->GetController().GoBack();
1417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  back_nav_load_observer.Wait();
1418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(original_url, shell()->web_contents()->GetLastCommittedURL());
1419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
1420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  shell()->web_contents()->GetRenderProcessHost()->GetID()));
1421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
1422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// crbug.com/372360
1424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The test loads url1, opens a link pointing to url2 in a new tab, and
1425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// navigates the new tab to url1.
1426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// The following is needed for the bug to happen:
1427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//  - url1 must require webui bindings;
1428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//  - navigating to url2 in the site instance of url1 should not swap
1429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)//   browsing instances, but should require a new site instance.
1430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, WebUIGetsBindings) {
1431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL url1(std::string(kChromeUIScheme) + "://" +
1432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            std::string(kChromeUIGpuHost));
1433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GURL url2(std::string(kChromeUIScheme) + "://" +
1434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            std::string(kChromeUIAccessibilityHost));
1435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Visit a WebUI page with bindings.
1437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NavigateToURL(shell(), url1);
1438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings(
1439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                  shell()->web_contents()->GetRenderProcessHost()->GetID()));
1440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SiteInstance* site_instance1 = shell()->web_contents()->GetSiteInstance();
1441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Open a new tab. Initially it gets a render view in the original tab's
1443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // current site instance.
1444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestNavigationObserver nav_observer(NULL);
1445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  nav_observer.StartWatchingNewWebContents();
1446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ShellAddedObserver shao;
1447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OpenUrlViaClickTarget(shell()->web_contents(), url2);
1448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  nav_observer.Wait();
1449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Shell* new_shell = shao.GetShell();
1450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebContentsImpl* new_web_contents = static_cast<WebContentsImpl*>(
1451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new_shell->web_contents());
1452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SiteInstance* site_instance2 = new_web_contents->GetSiteInstance();
1453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NE(site_instance2, site_instance1);
1455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(site_instance2->IsRelatedSiteInstance(site_instance1));
1456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderViewHost* initial_rvh = new_web_contents->
1457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetRenderManagerForTesting()->GetSwappedOutRenderViewHost(site_instance1);
1458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(initial_rvh);
1459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The following condition is what was causing the bug.
1460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, initial_rvh->GetEnabledBindings());
1461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Navigate to url1 and check bindings.
1463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NavigateToURL(new_shell, url1);
1464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The navigation should have used the first SiteInstance, otherwise
1465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |initial_rvh| did not have a chance to be used.
1466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(new_web_contents->GetSiteInstance(), site_instance1);
1467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(BINDINGS_POLICY_WEB_UI,
1468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new_web_contents->GetRenderViewHost()->GetEnabledBindings());
1469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1472