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

Unified Diff: content/browser/site_per_process_browsertest.cc

Issue 1074843002: Fix RenderFrameProxyHost leak. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lucasfix
Patch Set: Self-review fixes. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/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

Powered by Google App Engine
This is Rietveld 408576698