diff options
author | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-21 12:43:41 +0000 |
---|---|---|
committer | cbentzel@chromium.org <cbentzel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-21 12:43:41 +0000 |
commit | f9034cf01f5e8ab33c0c03553174da9cde8a80be (patch) | |
tree | ccce9f2307132e674a7d15361611df5615b1e1da /chrome/browser/prerender | |
parent | d1f0351663137617d0f68e03051c6fc26cad5ab0 (diff) | |
download | chromium_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.cc | 23 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_config.cc | 3 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_config.h | 3 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_contents.cc | 14 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_final_status.cc | 1 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_final_status.h | 1 | ||||
-rw-r--r-- | chrome/browser/prerender/prerender_manager.h | 2 |
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); |