Chromium Code Reviews| Index: chrome/browser/prerender/prerender_manager.cc |
| diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc |
| index e4dfb19c7cef312817c55b56b2e27c23a1debc43..24b5b9a045eed4c9983fe2bc2c8361f3ce68919b 100644 |
| --- a/chrome/browser/prerender/prerender_manager.cc |
| +++ b/chrome/browser/prerender/prerender_manager.cc |
| @@ -21,6 +21,7 @@ |
| #include "base/metrics/field_trial.h" |
| #include "base/metrics/histogram_macros.h" |
| #include "base/single_thread_task_runner.h" |
| +#include "base/strings/string_util.h" |
| #include "base/sys_info.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "base/time/time.h" |
| @@ -60,6 +61,7 @@ |
| #include "content/public/browser/web_contents_delegate.h" |
| #include "content/public/common/url_constants.h" |
| #include "extensions/common/constants.h" |
| +#include "net/http/http_request_headers.h" |
| #include "ui/gfx/geometry/rect.h" |
| using content::BrowserThread; |
| @@ -78,6 +80,29 @@ const int kPeriodicCleanupIntervalMs = 1000; |
| // Length of prerender history, for display in chrome://net-internals |
| const int kHistoryLength = 100; |
| +// Check if |extra_headers| requested via chrome::NavigateParams::extra_headers |
| +// are the same as what the HTTP server saw when serving prerendered contents. |
| +// PrerenderContents::StartPrerendering doesn't specify any extra headers when |
| +// calling content::NavigationController::LoadURLWithParams, but in reality |
| +// Blink will always add an Upgrade-Insecure-Requests http request header, so |
| +// that HTTP request for prerendered contents always includes this header. |
| +// Because of this, it is okay to show prerendered contents even if |
| +// |extra_headers| contains "Upgrade-Insecure-Requests" header. |
| +bool AreExtraHeadersCompatibleWithPrerenderContents( |
| + const std::string& extra_headers) { |
| + net::HttpRequestHeaders parsed_headers; |
| + parsed_headers.AddHeadersFromString(extra_headers); |
| + |
| + net::HttpRequestHeaders::Iterator it(parsed_headers); |
| + while (it.GetNext()) { |
| + if (!base::EqualsCaseInsensitiveASCII(it.name(), |
| + "upgrade-insecure-requests")) |
| + return false; |
|
mmenke
2016/10/11 20:46:33
add braces.
Łukasz Anforowicz
2016/10/11 21:33:43
Not applicable after applying your other suggestio
|
| + } |
|
mmenke
2016/10/11 20:46:33
optional: Could just do:
extra_headers.RemoveHea
Łukasz Anforowicz
2016/10/11 21:33:43
Good point. Done.
|
| + |
| + return true; |
| +} |
| + |
| } // namespace |
| class PrerenderManager::OnCloseWebContentsDeleter |
| @@ -298,9 +323,14 @@ bool PrerenderManager::MaybeUsePrerenderedPage(const GURL& url, |
| WebContents* web_contents = params->target_contents; |
| DCHECK(!IsWebContentsPrerendering(web_contents, nullptr)); |
| - // Don't prerender if the navigation involves some special parameters. |
| - if (params->uses_post || !params->extra_headers.empty()) |
| + // Don't prerender if the navigation involves some special parameters that |
| + // are different from what was used by PrerenderContents::StartPrerendering |
| + // (which always uses GET method and doesn't specify any extra headers when |
| + // calling content::NavigationController::LoadURLWithParams). |
| + if (params->uses_post || |
| + !AreExtraHeadersCompatibleWithPrerenderContents(params->extra_headers)) { |
| return false; |
| + } |
| DeleteOldEntries(); |
| to_delete_prerenders_.clear(); |