summaryrefslogtreecommitdiffstats
path: root/chrome/browser/prerender
diff options
context:
space:
mode:
authorcbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-21 12:43:41 +0000
committercbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-21 12:43:41 +0000
commitf9034cf01f5e8ab33c0c03553174da9cde8a80be (patch)
treeccce9f2307132e674a7d15361611df5615b1e1da /chrome/browser/prerender
parentd1f0351663137617d0f68e03051c6fc26cad5ab0 (diff)
downloadchromium_src-f9034cf01f5e8ab33c0c03553174da9cde8a80be.zip
chromium_src-f9034cf01f5e8ab33c0c03553174da9cde8a80be.tar.gz
chromium_src-f9034cf01f5e8ab33c0c03553174da9cde8a80be.tar.bz2
Allow prerendering of https pages.
This is specified as an optional configuration parameter. However, it's intended to remain true for some time. The main change which was required was cancellation of the prerender page when there is an SSL Certificate issue on the top-level page. BUG=88555 TEST=Go to prerender-test.appspot.com and prerender an https url, such as https://mail.google.com, observe that the prerender does not cancel. Also, do this for a site which redirects to https, such as http://mail.yahoo.com. Finally, browser tests and unit tests. Review URL: http://codereview.chromium.org/7313006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@93376 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prerender')
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc23
-rw-r--r--chrome/browser/prerender/prerender_config.cc3
-rw-r--r--chrome/browser/prerender/prerender_config.h3
-rw-r--r--chrome/browser/prerender/prerender_contents.cc14
-rw-r--r--chrome/browser/prerender/prerender_final_status.cc1
-rw-r--r--chrome/browser/prerender/prerender_final_status.h1
-rw-r--r--chrome/browser/prerender/prerender_manager.h2
7 files changed, 29 insertions, 18 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 2823240..103d4ed 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -566,9 +566,7 @@ class PrerenderBrowserTest : public InProcessBrowserTest {
ASSERT_TRUE(prerender_manager());
prerender_manager()->mutable_config().rate_limit_enabled = false;
-
- // This is needed to exit the event loop once the prerendered page has
- // stopped loading or was cancelled.
+ prerender_manager()->mutable_config().https_allowed = true;
ASSERT_TRUE(prerender_contents_factory_ == NULL);
prerender_contents_factory_ =
new WaitForLoadPrerenderContentsFactory(total_navigations,
@@ -789,8 +787,9 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderHttps) {
ASSERT_TRUE(https_server.Start());
GURL https_url = https_server.GetURL("files/prerender/prerender_page.html");
PrerenderTestURL(https_url,
- FINAL_STATUS_HTTPS,
+ FINAL_STATUS_USED,
1);
+ NavigateToDestURL();
}
// Checks that client-issued redirects to an https page will cancel prerenders.
@@ -800,8 +799,9 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderClientRedirectToHttps) {
ASSERT_TRUE(https_server.Start());
GURL https_url = https_server.GetURL("files/prerender/prerender_page.html");
PrerenderTestURL(CreateClientRedirect(https_url.spec()),
- FINAL_STATUS_HTTPS,
- 1);
+ FINAL_STATUS_USED,
+ 2);
+ NavigateToDestURL();
}
// Checks that client-issued redirects within an iframe in a prerendered
@@ -879,8 +879,9 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest,
ASSERT_TRUE(https_server.Start());
GURL https_url = https_server.GetURL("files/prerender/prerender_page.html");
PrerenderTestURL(CreateServerRedirect(https_url.spec()),
- FINAL_STATUS_HTTPS,
+ FINAL_STATUS_USED,
1);
+ NavigateToDestURL();
}
// Checks that server-issued redirects within an iframe in a prerendered
@@ -1294,9 +1295,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderXhrDelete) {
1);
}
-// Checks that a top-level page which would trigger an SSL error is simply
-// canceled. Note that this happens before checking the cert, since an https
-// URL should not be sent out.
+// Checks that a top-level page which would trigger an SSL error is canceled.
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorTopLevel) {
net::TestServer::HTTPSOptions https_options;
https_options.server_certificate =
@@ -1306,7 +1305,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLErrorTopLevel) {
ASSERT_TRUE(https_server.Start());
GURL https_url = https_server.GetURL("files/prerender/prerender_page.html");
PrerenderTestURL(https_url,
- FINAL_STATUS_HTTPS,
+ FINAL_STATUS_SSL_ERROR,
1);
}
@@ -1396,7 +1395,7 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, PrerenderSSLClientCertTopLevel) {
FilePath(FILE_PATH_LITERAL("chrome/test/data")));
ASSERT_TRUE(https_server.Start());
GURL https_url = https_server.GetURL("files/prerender/prerender_page.html");
- PrerenderTestURL(https_url, FINAL_STATUS_HTTPS, 1);
+ PrerenderTestURL(https_url, FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED, 1);
}
// Checks that an SSL Client Certificate request that originates from a
diff --git a/chrome/browser/prerender/prerender_config.cc b/chrome/browser/prerender/prerender_config.cc
index e0a15a5..768ed94 100644
--- a/chrome/browser/prerender/prerender_config.cc
+++ b/chrome/browser/prerender/prerender_config.cc
@@ -9,7 +9,8 @@ namespace prerender {
Config::Config() : max_bytes(100 * 1024 * 1024),
max_elements(1),
rate_limit_enabled(true),
- max_age(base::TimeDelta::FromSeconds(30)) {
+ max_age(base::TimeDelta::FromSeconds(30)),
+ https_allowed(true) {
}
} // namespace prerender
diff --git a/chrome/browser/prerender/prerender_config.h b/chrome/browser/prerender/prerender_config.h
index d3ea812..a9ca690 100644
--- a/chrome/browser/prerender/prerender_config.h
+++ b/chrome/browser/prerender/prerender_config.h
@@ -24,6 +24,9 @@ struct Config {
// Maximum age for a prerendered page until it is removed.
base::TimeDelta max_age;
+
+ // Is https allowed?
+ bool https_allowed;
};
} // namespace prerender
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index 9d48377..1709e72 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.cc
@@ -438,17 +438,21 @@ void PrerenderContents::OnUpdateFaviconURL(
}
bool PrerenderContents::AddAliasURL(const GURL& url) {
- if (!url.SchemeIs(chrome::kHttpScheme)) {
- if (url.SchemeIs(chrome::kHttpsScheme))
- Destroy(FINAL_STATUS_HTTPS);
- else
- Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME);
+ const bool http = url.SchemeIs(chrome::kHttpScheme);
+ const bool https = url.SchemeIs(chrome::kHttpsScheme);
+ if (!(http || https)) {
+ Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME);
+ return false;
+ }
+ if (https && !prerender_manager_->config().https_allowed) {
+ Destroy(FINAL_STATUS_HTTPS);
return false;
}
if (prerender_manager_->HasRecentlyBeenNavigatedTo(url)) {
Destroy(FINAL_STATUS_RECENTLY_VISITED);
return false;
}
+
alias_urls_.push_back(url);
prerender_tracker_->AddPrerenderURLOnUIThread(url);
return true;
diff --git a/chrome/browser/prerender/prerender_final_status.cc b/chrome/browser/prerender/prerender_final_status.cc
index 2200e1f..e3fa134 100644
--- a/chrome/browser/prerender/prerender_final_status.cc
+++ b/chrome/browser/prerender/prerender_final_status.cc
@@ -44,6 +44,7 @@ const char* kFinalStatusNames[] = {
"SSL Client Certificate Requested",
"Cache or History Cleared",
"Cancelled",
+ "SSL Error",
"Max",
};
COMPILE_ASSERT(arraysize(kFinalStatusNames) == FINAL_STATUS_MAX + 1,
diff --git a/chrome/browser/prerender/prerender_final_status.h b/chrome/browser/prerender/prerender_final_status.h
index 5a430d0..e43462b 100644
--- a/chrome/browser/prerender/prerender_final_status.h
+++ b/chrome/browser/prerender/prerender_final_status.h
@@ -45,6 +45,7 @@ enum FinalStatus {
FINAL_STATUS_SSL_CLIENT_CERTIFICATE_REQUESTED = 30,
FINAL_STATUS_CACHE_OR_HISTORY_CLEARED = 31,
FINAL_STATUS_CANCELLED = 32,
+ FINAL_STATUS_SSL_ERROR = 33,
FINAL_STATUS_MAX,
};
diff --git a/chrome/browser/prerender/prerender_manager.h b/chrome/browser/prerender/prerender_manager.h
index 9075243..41ab4c8 100644
--- a/chrome/browser/prerender/prerender_manager.h
+++ b/chrome/browser/prerender/prerender_manager.h
@@ -195,6 +195,8 @@ class PrerenderManager : public base::SupportsWeakPtr<PrerenderManager>,
const Config& config() const { return config_; }
Config& mutable_config() { return config_; }
+ PrerenderTracker* prerender_tracker() { return prerender_tracker_; }
+
protected:
// Test that needs needs access to internal functions.
FRIEND_TEST_ALL_PREFIXES(PrerenderManagerTest, ExpireTest);