Index: content/browser/frame_host/render_frame_host_manager_unittest.cc |
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc |
index b03471edd1eddc8504b2ec7409ed745e296c2258..1404f458f06cca6e2cd7aad245f78b18a010d3cd 100644 |
--- a/content/browser/frame_host/render_frame_host_manager_unittest.cc |
+++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc |
@@ -148,6 +148,29 @@ class RenderViewHostDeletedObserver : public WebContentsObserver { |
DISALLOW_COPY_AND_ASSIGN(RenderViewHostDeletedObserver); |
}; |
+// This observer keeps track of the last created RenderFrameHost to allow tests |
+// to ensure that no RenderFrameHost objects are created when not expected. |
+class RenderFrameHostCreatedObserver : public WebContentsObserver { |
+ public: |
+ RenderFrameHostCreatedObserver(WebContents* web_contents) |
+ : WebContentsObserver(web_contents), |
+ created_(false) { |
+ } |
+ |
+ virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) override { |
+ created_ = true; |
+ } |
+ |
+ bool created() { |
+ return created_; |
+ } |
+ |
+ private: |
+ bool created_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(RenderFrameHostCreatedObserver); |
+}; |
+ |
// This observer keeps track of the last deleted RenderFrameHost to avoid |
// accessing it and causing use-after-free condition. |
class RenderFrameHostDeletedObserver : public WebContentsObserver { |
@@ -178,7 +201,6 @@ class RenderFrameHostDeletedObserver : public WebContentsObserver { |
DISALLOW_COPY_AND_ASSIGN(RenderFrameHostDeletedObserver); |
}; |
- |
// This observer is used to check whether IPC messages are being filtered for |
// swapped out RenderFrameHost objects. It observes the plugin crash and favicon |
// update events, which the FilterMessagesWhileSwappedOut test simulates being |
@@ -567,6 +589,42 @@ TEST_F(RenderFrameHostManagerTest, FilterMessagesWhileSwappedOut) { |
EXPECT_TRUE(ntp_process_host->sink().GetUniqueMessageMatching(IPC_REPLY_ID)); |
} |
+TEST_F(RenderFrameHostManagerTest, DropCreateChildFrameWhileSwappedOut) { |
Charlie Reis
2014/10/15 23:54:18
Can you add a comment here mentioning the duplicat
nasko
2014/10/16 17:08:36
Done.
|
+ const GURL kUrl1("http://foo.com"); |
+ const GURL kUrl2("http://www.google.com/"); |
+ |
+ // Navigate first to one site and then cross-site. |
Charlie Reis
2014/10/15 23:54:18
nit: Drop "and then cross-site" since it's not don
nasko
2014/10/16 17:08:36
Done.
|
+ NavigateActiveAndCommit(kUrl1); |
+ TestRenderFrameHost* initial_rfh = contents()->GetMainFrame(); |
+ |
+ { |
+ RenderFrameHostCreatedObserver observer(contents()); |
+ initial_rfh->OnCreateChildFrame(3, std::string()); |
+ EXPECT_TRUE(observer.created()); |
+ } |
+ // Create one more frame in the same SiteInstance where initial_rfh |
Charlie Reis
2014/10/15 23:54:18
nit: Either add a blank line above this or remove
nasko
2014/10/16 17:08:36
Done.
|
+ // exists so that it doesn't get deleted on navigation to another |
Charlie Reis
2014/10/15 23:54:18
nit: it -> initial_rfh
(It's a little ambiguous a
nasko
2014/10/16 17:08:36
Done.
|
+ // site. |
+ initial_rfh->GetSiteInstance()->increment_active_frame_count(); |
+ |
+ // Navigate to a cross-site URL. |
+ NavigateActiveAndCommit(kUrl2); |
+ EXPECT_TRUE(initial_rfh->is_swapped_out()); |
+ |
+ TestRenderFrameHost* dest_rfh = contents()->GetMainFrame(); |
+ ASSERT_TRUE(dest_rfh); |
+ EXPECT_NE(initial_rfh, dest_rfh); |
+ |
+ { |
+ // Since the old RFH is now swapped out, it shouldn't process any messages |
+ // to create child frames. |
+ RenderFrameHostCreatedObserver observer(contents()); |
+ initial_rfh->OnCreateChildFrame( |
+ initial_rfh->GetProcess()->GetNextRoutingID(), std::string()); |
+ EXPECT_FALSE(observer.created()); |
+ } |
+} |
+ |
TEST_F(RenderFrameHostManagerTest, WhiteListSwapCompositorFrame) { |
TestRenderFrameHost* swapped_out_rfh = CreateSwappedOutRenderFrameHost(); |
TestRenderWidgetHostView* swapped_out_rwhv = |