Index: chrome/browser/prerender/prerender_browsertest.cc |
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc |
index 104dffc6be902a5be48e1d5b32b4b80067efae4b..89f278e42c3cdae34571ba602dea4dbc3d0085ab 100644 |
--- a/chrome/browser/prerender/prerender_browsertest.cc |
+++ b/chrome/browser/prerender/prerender_browsertest.cc |
@@ -19,6 +19,7 @@ |
#include "chrome/browser/favicon/favicon_tab_helper.h" |
#include "chrome/browser/prefs/pref_service.h" |
#include "chrome/browser/prerender/prerender_contents.h" |
+#include "chrome/browser/prerender/prerender_handle.h" |
#include "chrome/browser/prerender/prerender_link_manager.h" |
#include "chrome/browser/prerender/prerender_link_manager_factory.h" |
#include "chrome/browser/prerender/prerender_manager.h" |
@@ -32,6 +33,7 @@ |
#include "chrome/browser/ui/browser_finder.h" |
#include "chrome/browser/ui/browser_tabstrip.h" |
#include "chrome/browser/ui/browser_window.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
#include "chrome/browser/ui/tab_contents/tab_contents.h" |
#include "chrome/common/chrome_notification_types.h" |
#include "chrome/common/chrome_paths.h" |
@@ -46,6 +48,7 @@ |
#include "content/public/browser/render_view_host.h" |
#include "content/public/browser/web_contents.h" |
#include "content/public/common/url_constants.h" |
+#include "content/public/test/test_navigation_observer.h" |
#include "grit/generated_resources.h" |
#include "net/base/mock_host_resolver.h" |
#include "net/url_request/url_request_context.h" |
@@ -113,13 +116,11 @@ bool ShouldRenderPrerenderedPageCorrectly(FinalStatus status) { |
case FINAL_STATUS_USED: |
case FINAL_STATUS_WINDOW_OPENER: |
case FINAL_STATUS_APP_TERMINATING: |
- case FINAL_STATUS_FRAGMENT_MISMATCH: |
case FINAL_STATUS_CACHE_OR_HISTORY_CLEARED: |
// We'll crash the renderer after it's loaded. |
case FINAL_STATUS_RENDERER_CRASHED: |
case FINAL_STATUS_CANCELLED: |
case FINAL_STATUS_DEVTOOLS_ATTACHED: |
- case FINAL_STATUS_SESSION_STORAGE_NAMESPACE_MISMATCH: |
return true; |
default: |
return false; |
@@ -229,12 +230,15 @@ class TestPrerenderContents : public PrerenderContents { |
} |
} |
- virtual void AddPendingPrerender(const GURL& url, |
- const content::Referrer& referrer, |
- const gfx::Size& size) OVERRIDE { |
- PrerenderContents::AddPendingPrerender(url, referrer, size); |
+ virtual void AddPendingPrerender( |
+ base::WeakPtr<PrerenderHandle> weak_prerender_handle, |
+ const GURL& url, |
+ const content::Referrer& referrer, |
+ const gfx::Size& size) OVERRIDE { |
+ PrerenderContents::AddPendingPrerender( |
+ weak_prerender_handle, url, referrer, size); |
if (expected_pending_prerenders_ > 0 && |
- pending_prerender_list()->size() == expected_pending_prerenders_) { |
+ pending_prerenders().size() == expected_pending_prerenders_) { |
MessageLoop::current()->Quit(); |
} |
} |
@@ -260,13 +264,28 @@ class TestPrerenderContents : public PrerenderContents { |
// Waits until the prerender has |expected_pending_prerenders| pending |
// prerenders. |
void WaitForPendingPrerenders(size_t expected_pending_prerenders) { |
- if (pending_prerender_list()->size() < expected_pending_prerenders) { |
+ if (pending_prerenders().size() < expected_pending_prerenders) { |
expected_pending_prerenders_ = expected_pending_prerenders; |
ui_test_utils::RunMessageLoop(); |
expected_pending_prerenders_ = 0; |
} |
- EXPECT_EQ(expected_pending_prerenders, pending_prerender_list()->size()); |
+ EXPECT_EQ(expected_pending_prerenders, pending_prerenders().size()); |
+ } |
+ |
+ bool UrlIsPending(const GURL& url) const { |
+ for (std::vector<PendingPrerenderInfo>::const_iterator |
+ it = pending_prerenders().begin(), |
+ end = pending_prerenders().end(); |
+ it != end; |
+ ++it) { |
+ if (it->url == url && it->weak_prerender_handle) { |
+ EXPECT_TRUE(IsPendingEntry(*it->weak_prerender_handle)); |
+ EXPECT_TRUE(it->weak_prerender_handle->IsPending()); |
+ return true; |
+ } |
+ } |
+ return false; |
} |
// For tests that open the prerender in a new background tab, the RenderView |
@@ -276,6 +295,12 @@ class TestPrerenderContents : public PrerenderContents { |
int number_of_loads() const { return number_of_loads_; } |
+ FinalStatus expected_final_status() const { return expected_final_status_; } |
+ |
+ bool quit_message_loop_on_destruction() const { |
+ return quit_message_loop_on_destruction_; |
+ } |
+ |
private: |
virtual void OnRenderViewHostCreated( |
RenderViewHost* new_render_view_host) OVERRIDE { |
@@ -492,6 +517,15 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
virtual ~PrerenderBrowserTest() {} |
+ content::SessionStorageNamespace* GetSessionStorageNamespace() const { |
+ TabContents* tab_contents = |
+ current_browser()->tab_strip_model()->GetActiveTabContents(); |
+ if (!tab_contents) |
+ return NULL; |
+ return tab_contents->web_contents()->GetRenderViewHost()-> |
+ GetSessionStorageNamespace(); |
+ } |
+ |
virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { |
#if defined(ENABLE_SAFE_BROWSING) |
SafeBrowsingService::RegisterFactory(safe_browsing_factory_.get()); |
@@ -705,17 +739,21 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
} |
bool UrlIsInPrerenderManager(const std::string& html_file) const { |
- GURL dest_url = test_server()->GetURL(html_file); |
- return (GetPrerenderManager()->FindEntry(dest_url) != NULL); |
+ return UrlIsInPrerenderManager(test_server()->GetURL(html_file)); |
} |
- bool UrlIsInPrerenderManager(const GURL& url) { |
- return (GetPrerenderManager()->FindEntry(url) != NULL); |
+ bool UrlIsInPrerenderManager(const GURL& url) const { |
+ return GetPrerenderManager()->FindPrerenderData( |
+ url, GetSessionStorageNamespace()) != NULL; |
} |
- bool UrlIsPendingInPrerenderManager(const std::string& html_file) const { |
+ // This only checks to see if the URL is pending in our TestPrerenderContents. |
+ bool UrlIsPending(const std::string& html_file) const { |
+ TestPrerenderContents* test_prerender_contents = GetPrerenderContents(); |
+ if (!test_prerender_contents) |
+ return false; |
GURL dest_url = test_server()->GetURL(html_file); |
- return GetPrerenderManager()->IsPendingEntry(dest_url); |
+ return test_prerender_contents->UrlIsPending(dest_url); |
} |
void set_use_https_src(bool use_https_src_server) { |
@@ -766,8 +804,11 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
#endif |
TestPrerenderContents* GetPrerenderContents() const { |
+ PrerenderManager::PrerenderData* prerender_data = |
+ GetPrerenderManager()->FindPrerenderData( |
+ dest_url_, GetSessionStorageNamespace()); |
return static_cast<TestPrerenderContents*>( |
- GetPrerenderManager()->FindEntry(dest_url_)); |
+ prerender_data ? prerender_data->contents() : NULL); |
} |
void set_loader_path(const std::string& path) { |
@@ -852,6 +893,15 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
prerender_contents_factory_); |
FinalStatus expected_final_status = expected_final_status_queue.front(); |
+ // We construct launch_nav_observer so that we can be certain our loader |
+ // page has finished loading before continuing. This prevents ambiguous |
+ // NOTIFICATION_LOAD_STOP events from making tests flaky. |
+ WebContents* web_contents = chrome::GetActiveWebContents(current_browser()); |
+ ui_test_utils::WindowedNotificationObserver loader_nav_observer( |
+ content::NOTIFICATION_LOAD_STOP, |
+ content::Source<NavigationController>( |
+ &web_contents->GetController())); |
+ |
// ui_test_utils::NavigateToURL uses its own observer and message loop. |
// Since the test needs to wait until the prerendered page has stopped |
// loading, rather than the page directly navigated to, need to |
@@ -861,6 +911,9 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
false)); |
ui_test_utils::RunMessageLoop(); |
+ // Now that we've run the prerender until it stopped loading, we can now |
+ // also make sure the launcher has finished loading. |
+ loader_nav_observer.Wait(); |
TestPrerenderContents* prerender_contents = GetPrerenderContents(); |
@@ -884,7 +937,8 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
} else { |
// In the failure case, we should have removed |dest_url_| from the |
// prerender_manager. We ignore dummy PrerenderContents (as indicated |
- // by not having started). |
+ // by not having started), and PrerenderContents that are expected to |
+ // be left in the manager until the test finishes. |
EXPECT_TRUE(prerender_contents == NULL || |
!prerender_contents->prerendering_has_started()); |
} |
@@ -951,12 +1005,24 @@ class PrerenderBrowserTest : virtual public InProcessBrowserTest { |
RenderViewHost* render_view_host = |
chrome::GetActiveWebContents(current_browser())->GetRenderViewHost(); |
+ |
render_view_host->ExecuteJavascriptInWebFrame( |
- string16(), |
- ASCIIToUTF16(javascript_function_name)); |
+ string16(), ASCIIToUTF16(javascript_function_name)); |
- // Run message loop until the prerender contents is destroyed. |
- ui_test_utils::RunMessageLoop(); |
+ if (prerender_contents->quit_message_loop_on_destruction()) { |
+ // Run message loop until the prerender contents is destroyed. |
+ ui_test_utils::RunMessageLoop(); |
+ } else { |
+ // We don't expect to pick up a running prerender, so instead |
+ // observe one navigation. |
+ content::TestNavigationObserver observer( |
+ content::NotificationService::AllSources(), NULL, 1); |
+ base::RunLoop run_loop; |
+ observer.WaitForObservation( |
+ base::Bind(&ui_test_utils::RunThisRunLoop, |
+ base::Unretained(&run_loop)), |
+ ui_test_utils::GetQuitTaskForRunLoop(&run_loop)); |
+ } |
} |
WaitForLoadPrerenderContentsFactory* prerender_contents_factory_; |
@@ -1439,14 +1505,14 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoop) { |
// Next url should be in pending list but not an active entry. |
EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); |
- EXPECT_TRUE(UrlIsPendingInPrerenderManager(kHtmlFileB)); |
+ EXPECT_TRUE(UrlIsPending(kHtmlFileB)); |
NavigateToDestURL(); |
// Make sure the PrerenderContents for the next url is now in the manager |
// and not pending. |
EXPECT_TRUE(UrlIsInPrerenderManager(kHtmlFileB)); |
- EXPECT_FALSE(UrlIsPendingInPrerenderManager(kHtmlFileB)); |
+ EXPECT_FALSE(UrlIsPending(kHtmlFileB)); |
} |
// Checks that we don't prerender in an infinite loop and multiple links are |
@@ -1474,8 +1540,8 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoopMultiple) { |
// Next url should be in pending list but not an active entry. |
EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileB)); |
EXPECT_FALSE(UrlIsInPrerenderManager(kHtmlFileC)); |
- EXPECT_TRUE(UrlIsPendingInPrerenderManager(kHtmlFileB)); |
- EXPECT_TRUE(UrlIsPendingInPrerenderManager(kHtmlFileC)); |
+ EXPECT_TRUE(UrlIsPending(kHtmlFileB)); |
+ EXPECT_TRUE(UrlIsPending(kHtmlFileC)); |
NavigateToDestURL(); |
@@ -1486,8 +1552,8 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderInfiniteLoopMultiple) { |
bool url_c_is_active_prerender = UrlIsInPrerenderManager(kHtmlFileC); |
EXPECT_TRUE((url_b_is_active_prerender || url_c_is_active_prerender) && |
!(url_b_is_active_prerender && url_c_is_active_prerender)); |
- EXPECT_FALSE(UrlIsPendingInPrerenderManager(kHtmlFileB)); |
- EXPECT_FALSE(UrlIsPendingInPrerenderManager(kHtmlFileC)); |
+ EXPECT_FALSE(UrlIsPending(kHtmlFileB)); |
+ EXPECT_FALSE(UrlIsPending(kHtmlFileC)); |
} |
// See crbug.com/131836. |
@@ -1640,7 +1706,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderRendererCrash) { |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
DISABLED_PrerenderPageNavigateFragment) { |
PrerenderTestURL("files/prerender/prerender_fragment.html", |
- FINAL_STATUS_FRAGMENT_MISMATCH, |
+ FINAL_STATUS_APP_TERMINATING, |
1); |
NavigateToURL("files/prerender/prerender_fragment.html#fragment"); |
} |
@@ -1651,7 +1717,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
DISABLED_PrerenderFragmentNavigatePage) { |
PrerenderTestURL("files/prerender/prerender_fragment.html#fragment", |
- FINAL_STATUS_FRAGMENT_MISMATCH, |
+ FINAL_STATUS_APP_TERMINATING, |
1); |
NavigateToURL("files/prerender/prerender_fragment.html"); |
} |
@@ -1662,7 +1728,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
DISABLED_PrerenderFragmentNavigateFragment) { |
PrerenderTestURL("files/prerender/prerender_fragment.html#other_fragment", |
- FINAL_STATUS_FRAGMENT_MISMATCH, |
+ FINAL_STATUS_APP_TERMINATING, |
1); |
NavigateToURL("files/prerender/prerender_fragment.html#fragment"); |
} |
@@ -1674,7 +1740,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
DISABLED_PrerenderClientRedirectFromFragment) { |
PrerenderTestURL( |
CreateClientRedirect("files/prerender/prerender_fragment.html#fragment"), |
- FINAL_STATUS_FRAGMENT_MISMATCH, |
+ FINAL_STATUS_APP_TERMINATING, |
2); |
NavigateToURL("files/prerender/prerender_fragment.html"); |
} |
@@ -1686,7 +1752,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
DISABLED_PrerenderClientRedirectToFragment) { |
PrerenderTestURL( |
CreateClientRedirect("files/prerender/prerender_fragment.html"), |
- FINAL_STATUS_FRAGMENT_MISMATCH, |
+ FINAL_STATUS_APP_TERMINATING, |
2); |
NavigateToURL("files/prerender/prerender_fragment.html#fragment"); |
} |
@@ -1848,7 +1914,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderPrint) { |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
PrerenderSameDomainWindowOpenerWindowOpen) { |
PrerenderTestURL("files/prerender/prerender_page.html", |
- FINAL_STATUS_WINDOW_OPENER, |
+ FINAL_STATUS_APP_TERMINATING, |
1); |
OpenDestURLViaWindowOpen(); |
} |
@@ -1858,7 +1924,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
PrerenderSameDomainWindowOpenerClickTarget) { |
PrerenderTestURL("files/prerender/prerender_page.html", |
- FINAL_STATUS_WINDOW_OPENER, |
+ FINAL_STATUS_APP_TERMINATING, |
1); |
OpenDestURLViaClickTarget(); |
} |
@@ -2141,21 +2207,21 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewWindow) { |
PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
- FINAL_STATUS_SESSION_STORAGE_NAMESPACE_MISMATCH, |
+ FINAL_STATUS_APP_TERMINATING, |
1); |
OpenDestURLViaClickNewWindow(); |
} |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewForegroundTab) { |
PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
- FINAL_STATUS_SESSION_STORAGE_NAMESPACE_MISMATCH, |
+ FINAL_STATUS_APP_TERMINATING, |
1); |
OpenDestURLViaClickNewForegroundTab(); |
} |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClickNewBackgroundTab) { |
PrerenderTestURL("files/prerender/prerender_page_with_link.html", |
- FINAL_STATUS_SESSION_STORAGE_NAMESPACE_MISMATCH, |
+ FINAL_STATUS_APP_TERMINATING, |
1); |
OpenDestURLViaClickNewBackgroundTab(); |
} |