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

Side by Side Diff: content/browser/frame_host/render_frame_host_manager_unittest.cc

Issue 799593004: Don't crash while detaching a pending child frame under --site-per-process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Self-review fixes Created 6 years 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/command_line.h" 5 #include "base/command_line.h"
6 #include "base/files/file_path.h" 6 #include "base/files/file_path.h"
7 #include "base/strings/utf_string_conversions.h" 7 #include "base/strings/utf_string_conversions.h"
8 #include "base/test/histogram_tester.h" 8 #include "base/test/histogram_tester.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "content/browser/frame_host/cross_site_transferring_request.h" 10 #include "content/browser/frame_host/cross_site_transferring_request.h"
(...skipping 1776 matching lines...) Expand 10 before | Expand all | Expand 10 after
1787 // Start another cross-site navigation. 1787 // Start another cross-site navigation.
1788 controller().LoadURL( 1788 controller().LoadURL(
1789 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 1789 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1790 { 1790 {
1791 pending_rfh = contents()->GetFrameTree()->root()->render_manager() 1791 pending_rfh = contents()->GetFrameTree()->root()->render_manager()
1792 ->pending_frame_host(); 1792 ->pending_frame_host();
1793 RenderFrameHostDeletedObserver rfh_deleted_observer(pending_rfh); 1793 RenderFrameHostDeletedObserver rfh_deleted_observer(pending_rfh);
1794 1794
1795 // Increment the number of active frames in the new SiteInstance, which will 1795 // Increment the number of active frames in the new SiteInstance, which will
1796 // cause the pending RFH to be swapped out instead of deleted. 1796 // cause the pending RFH to be swapped out instead of deleted.
1797 pending_rfh->GetSiteInstance()->increment_active_frame_count(); 1797 pending_rfh->GetSiteInstance()->increment_active_frame_count();
1798 1798
1799 contents()->GetMainFrame()->OnMessageReceived( 1799 contents()->GetMainFrame()->OnMessageReceived(
1800 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); 1800 FrameHostMsg_BeforeUnload_ACK(0, false, now, now));
1801 EXPECT_FALSE(contents()->cross_navigation_pending()); 1801 EXPECT_FALSE(contents()->cross_navigation_pending());
1802 EXPECT_FALSE(rfh_deleted_observer.deleted()); 1802 EXPECT_FALSE(rfh_deleted_observer.deleted());
1803 } 1803 }
1804 } 1804 }
1805 1805
1806 // Test that a pending RenderFrameHost in a non-root frame tree node is properly
1807 // deleted when the node is detached.
nasko 2014/12/11 23:49:54 nit: Add a link to the bug it is testing for.
ncarter (slow) 2014/12/12 20:21:06 Done.
1808 TEST_F(RenderFrameHostManagerTest, DetachPendingChild) {
1809 CommandLine::ForCurrentProcess()->AppendSwitch(switches::kSitePerProcess);
1810
1811 const GURL kUrl1("http://www.google.com/");
nasko 2014/12/11 23:49:54 nit: Google?! Why not chromium.org : )))
ncarter (slow) 2014/12/12 20:21:06 These URLs are just copied from the test above.
1812 const GURL kUrl2("http://webkit.org/");
1813
1814 RenderFrameHostImpl* host = NULL;
1815
1816 contents()->NavigateAndCommit(kUrl1);
1817 contents()->GetMainFrame()->OnCreateChildFrame(
1818 contents()->GetMainFrame()->GetProcess()->GetNextRoutingID(),
1819 std::string("frame_name"));
1820 RenderFrameHostManager* manager =
1821 contents()->GetFrameTree()->root()->child_at(0)->render_manager();
1822
1823 // 1) The first navigation. --------------------------
1824 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1,
1825 Referrer(), base::string16() /* title */,
1826 ui::PAGE_TRANSITION_TYPED,
1827 false /* is_renderer_init */);
1828 host = manager->Navigate(entry1);
1829
1830 // The RenderFrameHost created in Init will be reused.
1831 EXPECT_TRUE(host == manager->current_frame_host());
1832 EXPECT_FALSE(manager->pending_frame_host());
1833
1834 // Commit.
1835 manager->DidNavigateFrame(host);
1836 // Commit to SiteInstance should be delayed until RenderView commit.
nasko 2014/12/11 23:49:54 RenderFrame instead of RenderView?
ncarter (slow) 2014/12/12 20:21:06 Fixed here (and in the other places in this file,
nasko 2014/12/12 21:54:49 Acknowledged.
1837 EXPECT_TRUE(host == manager->current_frame_host());
1838 ASSERT_TRUE(host);
1839 EXPECT_TRUE(host->GetSiteInstance()->HasSite());
1840
1841 // 2) Cross-site navigate to next site. --------------
1842 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2,
1843 Referrer(kUrl1, blink::WebReferrerPolicyDefault),
1844 base::string16() /* title */,
1845 ui::PAGE_TRANSITION_LINK,
1846 false /* is_renderer_init */);
1847 host = manager->Navigate(entry2);
1848
1849 // A new RenderFrameHost should be created.
1850 EXPECT_TRUE(manager->pending_frame_host());
1851 ASSERT_EQ(host, manager->pending_frame_host());
1852 ASSERT_NE(manager->current_frame_host(), manager->pending_frame_host());
1853 EXPECT_FALSE(contents()->cross_navigation_pending())
1854 << "There should be no top-level pending navigation.";
1855
1856 RenderFrameHostDeletedObserver delete_watcher(manager->pending_frame_host());
1857 EXPECT_FALSE(delete_watcher.deleted());
1858
1859 // Extend the lifetime of the child frame's SiteInstance, pretending
1860 // that there is another reference to it.
1861 scoped_refptr<SiteInstanceImpl> site_instance =
1862 manager->pending_frame_host()->GetSiteInstance();
1863 EXPECT_TRUE(site_instance->HasSite());
1864 EXPECT_NE(site_instance, contents()->GetSiteInstance());
1865 EXPECT_EQ(1, site_instance->active_frame_count());
1866 site_instance->increment_active_frame_count();
1867 EXPECT_EQ(2, site_instance->active_frame_count());
1868
1869 // Now detach the child FrameTreeNode. This should kill the pending host.
1870 manager->current_frame_host()->OnMessageReceived(FrameHostMsg_Detach(0));
nasko 2014/12/11 23:49:54 Let's be more correct - s/0/current_frame_host()->
ncarter (slow) 2014/12/12 20:21:06 Done.
1871
1872 EXPECT_TRUE(delete_watcher.deleted());
1873
1874 EXPECT_EQ(1, site_instance->active_frame_count());
1875 site_instance->decrement_active_frame_count();
1876
1877 #if 0
1878 // TODO(nick): Currently a proxy to the removed frame lingers in the parent.
1879 // Enable this assert below once the proxies to the subframe are correctly
1880 // cleaned up after detach.
1881 ASSERT_TRUE(site_instance->HasOneRef())
1882 << "This SiteInstance should be destroyable now.";
1883 #endif
1884 }
1885
1806 } // namespace content 1886 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698