Index: content/browser/frame_host/render_frame_host_manager_browsertest.cc |
diff --git a/content/browser/frame_host/render_frame_host_manager_browsertest.cc b/content/browser/frame_host/render_frame_host_manager_browsertest.cc |
index aec9dac07487b881587c7c7623cf0a40b5503dfd..571bae37271970b2f11e20093d2270e91300ae47 100644 |
--- a/content/browser/frame_host/render_frame_host_manager_browsertest.cc |
+++ b/content/browser/frame_host/render_frame_host_manager_browsertest.cc |
@@ -1806,4 +1806,70 @@ IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, |
EXPECT_FALSE(RenderViewHost::FromID(initial_process_id, initial_rvh_id)); |
} |
+// This class ensures that all RenderFrameCreated callbacks have processes with |
+// IPC channels. |
+class RenderFrameCreatedHasConnectionObserver : public WebContentsObserver { |
+ public: |
+ explicit RenderFrameCreatedHasConnectionObserver(WebContents* web_contents) |
+ : WebContentsObserver(web_contents) {} |
+ ~RenderFrameCreatedHasConnectionObserver() override {} |
+ |
+ private: |
+ // WebContentsObserver implementation: |
+ void RenderFrameCreated(RenderFrameHost* render_frame_host) override { |
+ EXPECT_TRUE(render_frame_host->GetProcess()->HasConnection()); |
+ EXPECT_TRUE(static_cast<RenderFrameHostImpl*>(render_frame_host) |
+ ->IsRenderFrameLive()); |
ncarter (slow)
2015/06/04 18:20:46
Rather than opening up WebContentsObserver so that
|
+ } |
+}; |
+ |
+// This class installs the RenderFrameCreatedHasConnectionObserver when the |
+// new WebContents is created. |
+class InstallRFCObserver : public WebContentsAddedObserver { |
+ public: |
+ InstallRFCObserver() : rfco_(nullptr) {} |
+ ~InstallRFCObserver() override { delete rfco_; } |
+ |
+ private: |
+ void WebContentsCreated(WebContents* web_contents) override { |
+ rfco_ = new RenderFrameCreatedHasConnectionObserver(web_contents); |
+ |
+ WebContentsAddedObserver::WebContentsCreated(web_contents); |
+ } |
+ |
+ RenderFrameCreatedHasConnectionObserver* rfco_; |
+}; |
+ |
+// Following a cross-site link with rel=noreferrer and target=_blank should |
+// fire RenderFrameCreated only after the process is created. |
+IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, |
+ RenderFrameCreatedWithRelNoreferrerAndTargetBlank) { |
+ StartServer(); |
+ |
+ // Load a page with links that open in a new window. |
+ std::string replacement_path; |
+ ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( |
+ "files/click-noreferrer-links.html", |
+ foo_host_port_, |
+ &replacement_path)); |
+ NavigateToURL(shell(), test_server()->GetURL(replacement_path)); |
+ |
+ // Test clicking a rel=noreferrer + target=blank link. |
+ InstallRFCObserver web_contents_observer; |
+ bool success = false; |
+ EXPECT_TRUE(ExecuteScriptAndExtractBool( |
+ shell()->web_contents(), |
+ "window.domAutomationController.send(clickNoRefTargetBlankLink());", |
+ &success)); |
+ EXPECT_TRUE(success); |
+ |
+ // Wait for the WebContents to be created. |
+ WebContentsImpl* new_web_contents = |
+ static_cast<WebContentsImpl*>(web_contents_observer.GetWebContents()); |
+ |
+ // Wait for the cross-site transition in the new tab to finish. |
+ WaitForLoadStop(new_web_contents); |
+ EXPECT_EQ("/files/title2.html", new_web_contents->GetVisibleURL().path()); |
+} |
+ |
} // namespace content |