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

Unified Diff: chrome/browser/prerender/prerender_browsertest.cc

Issue 6915019: Changes to not use the prerendered contents when window.opener needs to be set. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fix: Possible race condition in browser test. Created 9 years, 7 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/prerender/prerender_contents.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/prerender/prerender_browsertest.cc
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index c333d76cf71a88d9a7a1d60739497ea3762ef629..5ea49289c1f425e1245976a8fe5c71e8d4d9c525 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -53,6 +53,18 @@ std::string CreateServerRedirect(const std::string& dest_url) {
return kServerRedirectBase + dest_url;
}
+// Returns true iff the final status is one in which the prerendered
dominich 2011/05/16 22:21:12 nit: 'if'
+// page should prerender correctly. The page still may not be used.
+bool ShouldRenderPrerenderedPageCorrectly(FinalStatus status) {
+ switch (status) {
+ case FINAL_STATUS_USED:
+ case FINAL_STATUS_WINDOW_OPENER:
+ return true;
+ default:
+ return false;
+ }
+}
+
// PrerenderContents that stops the UI message loop on DidStopLoading().
class TestPrerenderContents : public PrerenderContents {
public:
@@ -96,6 +108,7 @@ class TestPrerenderContents : public PrerenderContents {
// When the PrerenderContents is destroyed, quit the UI message loop.
// This happens on navigation to used prerendered pages, and soon
// after cancellation of unused prerendered pages.
+ MessageLoopForUI::current()->RunAllPending();
MessageLoopForUI::current()->Quit();
}
@@ -113,7 +126,7 @@ class TestPrerenderContents : public PrerenderContents {
virtual void DidStopLoading() OVERRIDE {
PrerenderContents::DidStopLoading();
++number_of_loads_;
- if (expected_final_status_ == FINAL_STATUS_USED &&
+ if (ShouldRenderPrerenderedPageCorrectly(expected_final_status_) &&
number_of_loads_ >= expected_number_of_loads_) {
MessageLoopForUI::current()->Quit();
} else if (expected_final_status_ == FINAL_STATUS_RENDERER_CRASHED) {
@@ -284,6 +297,30 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
NavigateToURLImpl(dest_url_);
}
+ void OpenDestUrlInNewWindowViaJs() const {
+ // Make sure in navigating we have a URL to use in the PrerenderManager.
+ EXPECT_TRUE(prerender_manager()->FindEntry(dest_url_) != NULL);
+
+ bool open_window_result = false;
+ ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
+ browser()->GetSelectedTabContents()->render_view_host(), L"",
+ L"window.domAutomationController.send(JsOpenLinkInNewWindow())",
+ &open_window_result));
+ EXPECT_TRUE(open_window_result);
+ }
+
+ void OpenDestUrlInNewWindowViaClick() const {
+ // Make sure in navigating we have a URL to use in the PrerenderManager.
+ EXPECT_TRUE(prerender_manager()->FindEntry(dest_url_) != NULL);
+
+ bool click_prerendered_link_result = false;
+ ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
+ browser()->GetSelectedTabContents()->render_view_host(), L"",
+ L"window.domAutomationController.send(ClickOpenLinkInNewWindow())",
+ &click_prerendered_link_result));
+ EXPECT_TRUE(click_prerendered_link_result);
+ }
+
// Should be const but test_server()->GetURL(...) is not const.
void NavigateToURL(const std::string& dest_html_file) {
GURL dest_url = test_server()->GetURL(dest_html_file);
@@ -374,26 +411,23 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
static_cast<TestPrerenderContents*>(
prerender_manager()->FindEntry(dest_url_));
- switch (expected_final_status) {
- case FINAL_STATUS_USED: {
- ASSERT_TRUE(prerender_contents != NULL);
-
- if (call_javascript_) {
- // Check if page behaves as expected while in prerendered state.
- bool prerender_test_result = false;
- ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
- prerender_contents->render_view_host_mutable(), L"",
- L"window.domAutomationController.send(DidPrerenderPass())",
- &prerender_test_result));
- EXPECT_TRUE(prerender_test_result);
- }
- break;
+ if (ShouldRenderPrerenderedPageCorrectly(expected_final_status)) {
+ ASSERT_TRUE(prerender_contents != NULL);
+ EXPECT_EQ(FINAL_STATUS_MAX, prerender_contents->final_status());
+
+ if (call_javascript_) {
+ // Check if page behaves as expected while in prerendered state.
+ bool prerender_test_result = false;
+ ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(
+ prerender_contents->render_view_host_mutable(), L"",
+ L"window.domAutomationController.send(DidPrerenderPass())",
+ &prerender_test_result));
+ EXPECT_TRUE(prerender_test_result);
}
- default:
- // In the failure case, we should have removed dest_url_ from the
- // prerender_manager.
- EXPECT_TRUE(prerender_contents == NULL);
- break;
+ } else {
+ // In the failure case, we should have removed dest_url_ from the
+ // prerender_manager.
+ EXPECT_TRUE(prerender_contents == NULL);
}
}
@@ -1074,4 +1108,27 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorIframe) {
NavigateToDestURL();
}
+// Checks that if a page is opened in a new window by javascript the
+// prerendered page is not used.
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
+ PrerenderWindowOpenerJsOpenInNewPageTest) {
+ PrerenderTestURL("files/prerender/prerender_page.html",
+ FINAL_STATUS_WINDOW_OPENER,
+ 1);
+ OpenDestUrlInNewWindowViaJs();
+}
+
+// Checks that if a page is opened due to click on a href with target="_blank"
+// the prerendered page is not used.
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
+ PrerenderWindowOpenerClickOpenInNewPageTest) {
+ PrerenderTestURL("files/prerender/prerender_page.html",
+ FINAL_STATUS_WINDOW_OPENER,
+ 1);
+ OpenDestUrlInNewWindowViaClick();
+}
+
+// TODO(shishir): Add a test for the case when the page having the
+// prerendering link already has an opener set.
+
} // namespace prerender
« no previous file with comments | « no previous file | chrome/browser/prerender/prerender_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698