Index: content/browser/site_per_process_browsertest.cc |
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc |
index 95687bf54b71351f844dad87d81d7736ccb5d8fb..15bd99883a0f44a89a916708ca04142ece54b91e 100644 |
--- a/content/browser/site_per_process_browsertest.cc |
+++ b/content/browser/site_per_process_browsertest.cc |
@@ -4,6 +4,9 @@ |
#include "content/browser/site_per_process_browsertest.h" |
+#include <algorithm> |
+#include <vector> |
+ |
#include "base/command_line.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -166,6 +169,23 @@ void RenderFrameHostCreatedObserver::RenderFrameCreated( |
SitePerProcessBrowserTest::SitePerProcessBrowserTest() { |
}; |
+// static |
+std::string SitePerProcessBrowserTest::DumpProxyHostSiteInstances( |
+ FrameTreeNode* node) { |
+ std::vector<std::string> sites; |
+ for (auto& entry_pair : node->render_manager()->proxy_hosts_) { |
+ sites.push_back(entry_pair.second->GetSiteInstance()->GetSiteURL().spec()); |
+ } |
+ std::sort(sites.begin(), sites.end()); |
+ std::string result; |
+ for (auto& site : sites) { |
+ if (!result.empty()) |
+ result.append("\n"); |
+ result.append(site); |
+ } |
+ return result; |
+} |
+ |
void SitePerProcessBrowserTest::StartFrameAtDataURL() { |
std::string data_url_script = |
"var iframes = document.getElementById('test');iframes.src=" |
@@ -1906,4 +1926,38 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, SubframePostMessage) { |
EXPECT_EQ(2, subframe2_received_messages); |
} |
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, RFPHDestruction) { |
+ GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); |
+ NavigateToURL(shell(), main_url); |
+ |
+ // It is safe to obtain the root frame tree node here, as it doesn't change. |
+ FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) |
+ ->GetFrameTree() |
+ ->root(); |
+ |
+ TestNavigationObserver observer(shell()->web_contents()); |
+ |
+ // Load cross-site page into iframe. |
+ FrameTreeNode* child = root->child_at(0); |
+ GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html"); |
+ NavigateFrameToURL(root->child_at(0), url); |
+ EXPECT_TRUE(observer.last_navigation_succeeded()); |
+ EXPECT_EQ(url, observer.last_navigation_url()); |
+ EXPECT_EQ("http://foo.com/", DumpProxyHostSiteInstances(root)); |
+ |
+ // Load another cross-site page. |
+ url = embedded_test_server()->GetURL("bar.com", "/title3.html"); |
+ NavigateIframeToURL(shell()->web_contents(), "test", url); |
+ EXPECT_TRUE(observer.last_navigation_succeeded()); |
+ EXPECT_EQ(url, observer.last_navigation_url()); |
+ EXPECT_EQ("http://bar.com/", DumpProxyHostSiteInstances(root)); |
+ |
+ // Navigate back to the parent's origin. |
+ url = embedded_test_server()->GetURL("/title1.html"); |
+ NavigateFrameToURL(child, url); |
+ EXPECT_EQ(url, observer.last_navigation_url()); |
+ EXPECT_TRUE(observer.last_navigation_succeeded()); |
+ EXPECT_EQ("", DumpProxyHostSiteInstances(root)); |
+} |
+ |
} // namespace content |