Index: chrome/browser/prerender/prerender_browsertest.cc |
=================================================================== |
--- chrome/browser/prerender/prerender_browsertest.cc (revision 98422) |
+++ chrome/browser/prerender/prerender_browsertest.cc (working copy) |
@@ -102,19 +102,21 @@ |
Profile* profile, |
const GURL& url, |
const GURL& referrer, |
- int number_of_loads, |
+ int expected_number_of_loads, |
FinalStatus expected_final_status) |
: PrerenderContents(prerender_manager, prerender_tracker, profile, |
url, referrer, ORIGIN_LINK_REL_PRERENDER, |
PrerenderManager::kNoExperiment), |
number_of_loads_(0), |
- expected_number_of_loads_(number_of_loads), |
+ expected_number_of_loads_(expected_number_of_loads), |
expected_final_status_(expected_final_status), |
new_render_view_host_(NULL), |
was_hidden_(false), |
was_shown_(false), |
should_be_shown_(expected_final_status == FINAL_STATUS_USED), |
quit_message_loop_on_destruction_(true) { |
+ if (expected_number_of_loads == 0) |
+ MessageLoopForUI::current()->Quit(); |
} |
virtual ~TestPrerenderContents() { |
@@ -126,9 +128,8 @@ |
// navigation, so this should be happen for every PrerenderContents for |
// which a RenderViewHost is created, regardless of whether or not it's |
// used. |
- if (new_render_view_host_) { |
+ if (new_render_view_host_) |
EXPECT_TRUE(was_hidden_); |
- } |
// A used PrerenderContents will only be destroyed when we swap out |
// TabContents, at the end of a navigation caused by a call to |
@@ -185,6 +186,8 @@ |
quit_message_loop_on_destruction_ = value; |
} |
+ int number_of_loads() { return number_of_loads_; } |
+ |
private: |
virtual void OnRenderViewHostCreated( |
RenderViewHost* new_render_view_host) OVERRIDE { |
@@ -245,11 +248,8 @@ |
WaitForLoadPrerenderContentsFactory( |
int number_of_loads, |
const std::deque<FinalStatus>& expected_final_status_queue) |
- : number_of_loads_(number_of_loads) { |
- expected_final_status_queue_.resize(expected_final_status_queue.size()); |
- std::copy(expected_final_status_queue.begin(), |
- expected_final_status_queue.end(), |
- expected_final_status_queue_.begin()); |
+ : number_of_loads_(number_of_loads), |
cbentzel
2011/08/29 12:26:18
Nit: should this change to expected_number_of_load
|
+ expected_final_status_queue_(expected_final_status_queue) { |
VLOG(1) << "Factory created with queue length " << |
expected_final_status_queue_.size(); |
} |
@@ -615,7 +615,7 @@ |
ASSERT_TRUE(prerender_contents != NULL); |
EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status()); |
- if (call_javascript_) { |
+ if (call_javascript_ && total_navigations > 0) { |
// Check if page behaves as expected while in prerendered state. |
bool prerender_test_result = false; |
ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
@@ -625,7 +625,7 @@ |
EXPECT_TRUE(prerender_test_result); |
} |
} else { |
- // In the failure case, we should have removed dest_url_ from the |
+ // In the failure case, we should have removed |dest_url_| from the |
// prerender_manager. |
EXPECT_TRUE(prerender_contents == NULL); |
} |
@@ -641,6 +641,18 @@ |
if (disposition == NEW_BACKGROUND_TAB) |
GetPrerenderContents()->set_should_be_shown(false); |
+ // In the case of zero loads, need to wait for the page load to complete |
+ // before running any Javascript. |
+ scoped_ptr<ui_test_utils::WindowedNotificationObserver> page_load_observer; |
+ TabContents* tab_contents = |
+ GetPrerenderContents()->prerender_contents()->tab_contents(); |
+ if (GetPrerenderContents()->number_of_loads() == 0) { |
+ page_load_observer.reset( |
+ new ui_test_utils::WindowedNotificationObserver( |
+ content::NOTIFICATION_LOAD_STOP, |
+ Source<NavigationController>(&tab_contents->controller()))); |
+ } |
+ |
// ui_test_utils::NavigateToURL waits until DidStopLoading is called on |
// the current tab. As that tab is going to end up deleted, and may never |
// finish loading before that happens, exit the message loop on the deletion |
@@ -657,24 +669,9 @@ |
EXPECT_TRUE(GetPrerenderContents() == NULL); |
if (call_javascript_) { |
- // Check if page behaved as expected when actually displayed. |
+ if (page_load_observer.get()) |
+ page_load_observer->Wait(); |
- // Locate the navigated TabContents. |
- TabContents* tab_contents = NULL; |
- switch (disposition) { |
- case CURRENT_TAB: |
- case NEW_FOREGROUND_TAB: |
- tab_contents = browser()->GetSelectedTabContents(); |
- break; |
- case NEW_BACKGROUND_TAB: |
- tab_contents = |
- browser()->GetTabContentsAt(browser()->active_index() + 1); |
- break; |
- default: |
- ASSERT_TRUE(false) << "Unsupported creation disposition"; |
- } |
- ASSERT_TRUE(tab_contents); |
- |
bool display_test_result = false; |
ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
tab_contents->render_view_host(), L"", |
@@ -710,6 +707,14 @@ |
NavigateToDestURL(); |
} |
+// Checks that the visibility API works when the prerender is quickly opened |
+// in a new tab before it stops loading. |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibilityQuickSwitch) { |
+ PrerenderTestURL("files/prerender/prerender_visibility_quick.html", |
+ FINAL_STATUS_USED, 0); |
+ NavigateToDestURL(); |
+} |
+ |
// Checks that the visibility API works when opening a page in a new hidden |
// tab. |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibilityBackgroundTab) { |
@@ -719,6 +724,15 @@ |
NavigateToDestURLWithDisposition(NEW_BACKGROUND_TAB); |
} |
+// Checks that the visibility API works when opening a page in a new hidden |
+// tab, which is switched to before it stops loading. |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
+ PrerenderVisibilityBackgroundTabQuickSwitch) { |
+ PrerenderTestURL("files/prerender/prerender_visibility_hidden_quick.html", |
+ FINAL_STATUS_USED, 0); |
+ NavigateToDestURLWithDisposition(NEW_BACKGROUND_TAB); |
+} |
+ |
// Checks that the visibility API works when opening a page in a new foreground |
// tab. |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderVisibilityForegroundTab) { |
@@ -728,6 +742,15 @@ |
NavigateToDestURLWithDisposition(NEW_FOREGROUND_TAB); |
} |
+// Checks that the visibility API works when the prerender is quickly opened |
+// in a new tab foreground before it stops loading. |
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, |
+ PrerenderVisibilityForegroundTabQuickSwitch) { |
+ PrerenderTestURL("files/prerender/prerender_visibility_quick.html", |
+ FINAL_STATUS_USED, 0); |
+ NavigateToDestURL(); |
+} |
+ |
// Checks that the prerendering of a page is canceled correctly when a |
// Javascript alert is called. |
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderAlertBeforeOnload) { |