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

Unified Diff: content/browser/site_per_process_browsertest.cc

Issue 2332073002: Adds a test that verifies that navigating in the unload handler while (Closed)
Patch Set: remove TODO Created 4 years, 3 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
« no previous file with comments | « no previous file | content/renderer/render_frame_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 ea4bb0da5c3fc3c61f87442773244420a49bf876..9f6363a2a82fe708ff92079c0c4935832adcf8f5 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -7920,4 +7920,68 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
EXPECT_TRUE(ExecuteScript(popup_shell->web_contents(), "true"));
}
+// Tests that trying to navigate in the unload handler doesn't crash the
+// browser.
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, NavigateInUnloadHandler) {
+ GURL main_url(embedded_test_server()->GetURL(
+ "a.com", "/cross_site_iframe_factory.html?a(b(b))"));
+ NavigateToURL(shell(), main_url);
+
+ FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+ ->GetFrameTree()
+ ->root();
+
+ EXPECT_EQ(
+ " Site A ------------ proxies for B\n"
+ " +--Site B ------- proxies for A\n"
+ " +--Site B -- proxies for A\n"
+ "Where A = http://a.com/\n"
+ " B = http://b.com/",
+ DepictFrameTree(root));
+
+ int child_count = 0;
+ EXPECT_TRUE(ExecuteScriptAndExtractInt(
+ root->child_at(0)->current_frame_host(),
+ "window.domAutomationController.send(frames.length);", &child_count));
+ EXPECT_EQ(1, child_count);
+
+ // Add an unload handler to B's subframe.
+ EXPECT_TRUE(
+ ExecuteScript(root->child_at(0)->child_at(0)->current_frame_host(),
+ "window.onunload=function(e){\n"
+ " window.location = '#navigate';\n"
+ "};\n"));
+
+ // Navigate B's subframe to a cross-site C.
+ std::string script =
+ std::string("window.document.getElementById('child-0').src = \"") +
+ embedded_test_server()
+ ->GetURL("c.com", "/cross_site_iframe_factory.html")
+ .spec() +
+ "\"";
+ EXPECT_TRUE(
+ ExecuteScript(root->child_at(0)->current_frame_host(), script.c_str()));
+
+ // Wait until B's subframe RenderFrameHost is destroyed.
+ RenderFrameDeletedObserver deleted_observer(
+ root->child_at(0)->child_at(0)->current_frame_host());
+ deleted_observer.WaitUntilDeleted();
+
+ // Check that C's subframe is alive and the navigation in the unload handler
+ // was ignored.
+ EXPECT_TRUE(ExecuteScriptAndExtractInt(
+ root->child_at(0)->child_at(0)->current_frame_host(),
+ "window.domAutomationController.send(frames.length);", &child_count));
+ EXPECT_EQ(0, child_count);
+
+ EXPECT_EQ(
+ " Site A ------------ proxies for B C\n"
+ " +--Site B ------- proxies for A C\n"
+ " +--Site C -- proxies for A B\n"
+ "Where A = http://a.com/\n"
+ " B = http://b.com/\n"
+ " C = http://c.com/",
+ DepictFrameTree(root));
+}
+
} // namespace content
« no previous file with comments | « no previous file | content/renderer/render_frame_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698