| Index: content/browser/web_contents/web_contents_impl_unittest.cc
|
| diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
|
| index ab40bcd466f7431fb7b60094387f79825a8ff74e..7bab786386eddf52cb88c6226136ca105d20f4c1 100644
|
| --- a/content/browser/web_contents/web_contents_impl_unittest.cc
|
| +++ b/content/browser/web_contents/web_contents_impl_unittest.cc
|
| @@ -489,6 +489,7 @@ TEST_F(WebContentsImplTest, CrossSiteBoundaries) {
|
| // Keep the number of active frames in orig_rfh's SiteInstance non-zero so
|
| // that orig_rfh doesn't get deleted when it gets swapped out.
|
| orig_rfh->GetSiteInstance()->increment_active_frame_count();
|
| + orig_rfh->SendBeforeUnloadHandlersPresent(true);
|
|
|
| EXPECT_FALSE(contents()->cross_navigation_pending());
|
| EXPECT_EQ(orig_rfh->GetRenderViewHost(), contents()->GetRenderViewHost());
|
| @@ -528,6 +529,7 @@ TEST_F(WebContentsImplTest, CrossSiteBoundaries) {
|
| // non-zero so that orig_rfh doesn't get deleted when it gets
|
| // swapped out.
|
| pending_rfh->GetSiteInstance()->increment_active_frame_count();
|
| + pending_rfh->SendBeforeUnloadHandlersPresent(true);
|
|
|
| EXPECT_FALSE(contents()->cross_navigation_pending());
|
| EXPECT_EQ(pending_rfh, contents()->GetMainFrame());
|
| @@ -731,6 +733,7 @@ TEST_F(WebContentsImplTest, NavigateFromSitelessUrl) {
|
| // non-zero so that orig_rfh doesn't get deleted when it gets
|
| // swapped out.
|
| orig_rfh->GetSiteInstance()->increment_active_frame_count();
|
| + orig_rfh->SendBeforeUnloadHandlersPresent(true);
|
|
|
| EXPECT_EQ(orig_instance, contents()->GetSiteInstance());
|
| EXPECT_TRUE(
|
| @@ -955,9 +958,9 @@ TEST_F(WebContentsImplTest, CrossSiteComparesAgainstCurrentPage) {
|
| }
|
|
|
| // Test that the onbeforeunload and onunload handlers run when navigating
|
| -// across site boundaries.
|
| +// across site boundaries if needed.
|
| TEST_F(WebContentsImplTest, CrossSiteUnloadHandlers) {
|
| - TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
|
| + TestRenderFrameHost* rfh1 = contents()->GetMainFrame();
|
| SiteInstance* instance1 = contents()->GetSiteInstance();
|
|
|
| // Navigate to URL. First URL should use first RenderViewHost.
|
| @@ -965,42 +968,61 @@ TEST_F(WebContentsImplTest, CrossSiteUnloadHandlers) {
|
| controller().LoadURL(
|
| url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
|
| contents()->GetMainFrame()->PrepareForCommit(url);
|
| - contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
|
| + contents()->TestDidNavigate(rfh1, 1, url, ui::PAGE_TRANSITION_TYPED);
|
| EXPECT_FALSE(contents()->cross_navigation_pending());
|
| - EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
|
| + EXPECT_EQ(rfh1, contents()->GetMainFrame());
|
| + rfh1->SendBeforeUnloadHandlersPresent(true);
|
|
|
| // Navigate to new site, but simulate an onbeforeunload denial.
|
| const GURL url2("http://www.yahoo.com");
|
| controller().LoadURL(
|
| url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
|
| - EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK());
|
| + EXPECT_TRUE(rfh1->IsWaitingForBeforeUnloadACK());
|
| base::TimeTicks now = base::TimeTicks::Now();
|
| - orig_rfh->OnMessageReceived(
|
| + rfh1->OnMessageReceived(
|
| FrameHostMsg_BeforeUnload_ACK(0, false, now, now));
|
| - EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK());
|
| + EXPECT_FALSE(rfh1->IsWaitingForBeforeUnloadACK());
|
| EXPECT_FALSE(contents()->cross_navigation_pending());
|
| - EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
|
| + EXPECT_EQ(rfh1, contents()->GetMainFrame());
|
|
|
| // Navigate again, but simulate an onbeforeunload approval.
|
| controller().LoadURL(
|
| url2, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
|
| - EXPECT_TRUE(orig_rfh->IsWaitingForBeforeUnloadACK());
|
| + EXPECT_TRUE(rfh1->IsWaitingForBeforeUnloadACK());
|
| now = base::TimeTicks::Now();
|
| - orig_rfh->PrepareForCommit(url2);
|
| - EXPECT_FALSE(orig_rfh->IsWaitingForBeforeUnloadACK());
|
| + rfh1->PrepareForCommit(url2);
|
| + EXPECT_FALSE(rfh1->IsWaitingForBeforeUnloadACK());
|
| EXPECT_TRUE(contents()->cross_navigation_pending());
|
| - TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame();
|
| -
|
| - // We won't hear DidNavigate until the onunload handler has finished running.
|
| + TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame();
|
|
|
| // DidNavigate from the pending page.
|
| contents()->TestDidNavigate(
|
| - pending_rfh, 1, url2, ui::PAGE_TRANSITION_TYPED);
|
| + rfh2, 1, url2, ui::PAGE_TRANSITION_TYPED);
|
| SiteInstance* instance2 = contents()->GetSiteInstance();
|
| EXPECT_FALSE(contents()->cross_navigation_pending());
|
| - EXPECT_EQ(pending_rfh, contents()->GetMainFrame());
|
| + EXPECT_EQ(rfh2, contents()->GetMainFrame());
|
| EXPECT_NE(instance1, instance2);
|
| EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
|
| +
|
| + // Now navigate to a new site. There are no beforeUnload handlers, so we
|
| + // should not be waiting for a BeforeUnloadACK.
|
| + const GURL url3("http://www.chromium.org");
|
| + rfh2->GetSiteInstance()->increment_active_frame_count();
|
| + controller().LoadURL(
|
| + url3, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
|
| + EXPECT_FALSE(rfh2->IsWaitingForBeforeUnloadACK());
|
| + rfh2->PrepareForCommit(url3);
|
| + EXPECT_TRUE(contents()->cross_navigation_pending());
|
| + TestRenderFrameHost* rfh3 = contents()->GetPendingMainFrame();
|
| +
|
| + // DidNavigate from the pending page.
|
| + contents()->TestDidNavigate(
|
| + rfh3, 1, url3, ui::PAGE_TRANSITION_TYPED);
|
| + SiteInstance* instance3 = contents()->GetSiteInstance();
|
| + EXPECT_FALSE(contents()->cross_navigation_pending());
|
| + EXPECT_EQ(rfh3, contents()->GetMainFrame());
|
| + EXPECT_NE(instance2, instance3);
|
| + EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
|
| }
|
|
|
| // Test that during a slow cross-site navigation, the original renderer can
|
| @@ -1018,6 +1040,7 @@ TEST_F(WebContentsImplTest, CrossSiteNavigationPreempted) {
|
| contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
|
| EXPECT_FALSE(contents()->cross_navigation_pending());
|
| EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
|
| + orig_rfh->SendBeforeUnloadHandlersPresent(true);
|
|
|
| // Navigate to new site, simulating an onbeforeunload approval.
|
| const GURL url2("http://www.yahoo.com");
|
| @@ -1057,6 +1080,7 @@ TEST_F(WebContentsImplTest, CrossSiteNavigationBackPreempted) {
|
| NavigationEntryImpl::FromNavigationEntry(entry1)->site_instance());
|
| EXPECT_TRUE(ntp_rfh->GetRenderViewHost()->GetEnabledBindings() &
|
| BINDINGS_POLICY_WEB_UI);
|
| + ntp_rfh->SendBeforeUnloadHandlersPresent(true);
|
|
|
| // Navigate to new site.
|
| const GURL url2("http://www.google.com");
|
| @@ -1104,6 +1128,7 @@ TEST_F(WebContentsImplTest, CrossSiteNavigationBackPreempted) {
|
| EXPECT_EQ(url3, entry3->GetURL());
|
| EXPECT_EQ(instance3,
|
| NavigationEntryImpl::FromNavigationEntry(entry3)->site_instance());
|
| + google_rfh->SendBeforeUnloadHandlersPresent(true);
|
|
|
| // Go back within the site.
|
| controller().GoBack();
|
| @@ -1155,6 +1180,7 @@ TEST_F(WebContentsImplTest, CrossSiteNavigationNotPreemptedByFrame) {
|
| contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
|
| EXPECT_FALSE(contents()->cross_navigation_pending());
|
| EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
|
| + orig_rfh->SendBeforeUnloadHandlersPresent(true);
|
|
|
| // Start navigating to new site.
|
| const GURL url2("http://www.yahoo.com");
|
| @@ -1185,6 +1211,7 @@ TEST_F(WebContentsImplTest, CrossSiteNotPreemptedDuringBeforeUnload) {
|
| controller().LoadURL(
|
| url, Referrer(), ui::PAGE_TRANSITION_TYPED, std::string());
|
| TestRenderFrameHost* orig_rfh = contents()->GetMainFrame();
|
| + orig_rfh->SendBeforeUnloadHandlersPresent(true);
|
| EXPECT_FALSE(contents()->cross_navigation_pending());
|
|
|
| // Navigate to new site, with the beforeunload request in flight.
|
| @@ -1223,6 +1250,7 @@ TEST_F(WebContentsImplTest, CrossSiteNavigationCanceled) {
|
| contents()->TestDidNavigate(orig_rfh, 1, url, ui::PAGE_TRANSITION_TYPED);
|
| EXPECT_FALSE(contents()->cross_navigation_pending());
|
| EXPECT_EQ(orig_rfh, contents()->GetMainFrame());
|
| + orig_rfh->SendBeforeUnloadHandlersPresent(true);
|
|
|
| // Navigate to new site, simulating an onbeforeunload approval.
|
| const GURL url2("http://www.yahoo.com");
|
|
|