| 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..fe466abf3b048ecf82665b5a6248767157184212 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 AreExtraHeadersCompatibleWithPrerenderedContents(
|
| + 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;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| } // namespace
|
|
|
| class PrerenderManager::OnCloseWebContentsDeleter
|
| @@ -298,8 +323,12 @@ 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 ||
|
| + !AreExtraHeadersCompatibleWithPrerenderedContents(params->extra_headers))
|
| return false;
|
|
|
| DeleteOldEntries();
|
|
|