| Index: chrome/browser/prerender/prerender_tracker.cc
|
| diff --git a/chrome/browser/prerender/prerender_tracker.cc b/chrome/browser/prerender/prerender_tracker.cc
|
| index c82acd339abb56742fb77c8bdfc4d9682b7dc20b..403b1bbb120033b00142635b211b4610c7899ff5 100644
|
| --- a/chrome/browser/prerender/prerender_tracker.cc
|
| +++ b/chrome/browser/prerender/prerender_tracker.cc
|
| @@ -3,9 +3,13 @@
|
| // found in the LICENSE file.
|
|
|
| #include "base/logging.h"
|
| +#include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/prerender/prerender_manager.h"
|
| #include "chrome/browser/prerender/prerender_tracker.h"
|
| #include "content/browser/browser_thread.h"
|
| +#include "content/browser/resource_context.h"
|
| +#include "content/common/resource_messages.h"
|
| +#include "net/base/load_flags.h"
|
|
|
| namespace prerender {
|
|
|
| @@ -28,19 +32,19 @@ void DestroyPreloadForRenderView(
|
|
|
| } // namespace
|
|
|
| -struct RenderViewInfo {
|
| - explicit RenderViewInfo(PrerenderManager* prerender_manager)
|
| +PrerenderTracker::RenderViewInfo::RenderViewInfo(
|
| + PrerenderManager* prerender_manager)
|
| : final_status(FINAL_STATUS_MAX),
|
| prerender_manager(prerender_manager->AsWeakPtr()) {
|
| - }
|
| +}
|
|
|
| - FinalStatus final_status;
|
| - base::WeakPtr<PrerenderManager> prerender_manager;
|
| -};
|
| +PrerenderTracker::RenderViewInfo::~RenderViewInfo() {
|
| +}
|
|
|
| -// static
|
| -PrerenderTracker* PrerenderTracker::GetInstance() {
|
| - return Singleton<PrerenderTracker>::get();
|
| +PrerenderTracker::PrerenderTracker() {
|
| +}
|
| +
|
| +PrerenderTracker::~PrerenderTracker() {
|
| }
|
|
|
| bool PrerenderTracker::TryUse(int child_id, int route_id) {
|
| @@ -74,15 +78,6 @@ bool PrerenderTracker::TryCancelOnIOThread(
|
| return TryCancel(child_id, route_id, final_status);
|
| }
|
|
|
| -bool PrerenderTracker::IsPrerenderingOnIOThread(int child_id,
|
| - int route_id) const {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| -
|
| - ChildRouteIdPair child_route_id_pair(child_id, route_id);
|
| - return possibly_prerendering_io_thread_set_.end() !=
|
| - possibly_prerendering_io_thread_set_.find(child_route_id_pair);
|
| -}
|
| -
|
| bool PrerenderTracker::GetFinalStatus(int child_id, int route_id,
|
| FinalStatus* final_status) const {
|
| ChildRouteIdPair child_route_id_pair(child_id, route_id);
|
| @@ -134,12 +129,6 @@ void PrerenderTracker::OnPrerenderingFinished(int child_id, int route_id) {
|
| DCHECK_EQ(1u, num_erased);
|
| }
|
|
|
| -PrerenderTracker::PrerenderTracker() {
|
| -}
|
| -
|
| -PrerenderTracker::~PrerenderTracker() {
|
| -}
|
| -
|
| FinalStatus PrerenderTracker::SetFinalStatus(int child_id, int route_id,
|
| FinalStatus final_status) {
|
| DCHECK(final_status >= FINAL_STATUS_USED && final_status < FINAL_STATUS_MAX);
|
| @@ -169,6 +158,62 @@ FinalStatus PrerenderTracker::SetFinalStatus(int child_id, int route_id,
|
| return final_status_it->second.final_status;
|
| }
|
|
|
| +bool PrerenderTracker::ShouldBeginRequest(
|
| + int child_id, int route_id,
|
| + const ResourceHostMsg_Request& request_data,
|
| + const content::ResourceContext& resource_context,
|
| + const GURL& referrer) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + bool is_prerendering = IsPrerenderingOnIOThread(child_id, route_id);
|
| +
|
| + // Handle a PREFETCH resource type.
|
| + if (request_data.resource_type == ResourceType::PREFETCH) {
|
| + // All PREFETCH requests should be GETs, but be defensive about it.
|
| + if (request_data.method != "GET")
|
| + return false;
|
| +
|
| + // If prefetch is disabled, kill the request.
|
| + if (!ResourceDispatcherHost::is_prefetch_enabled())
|
| + return false;
|
| +
|
| + // If prerendering is enabled, trigger a prerender for the URL and abort the
|
| + // request to prevent double-gets.
|
| + if (PrerenderManager::IsPrerenderingPossible()) {
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + NewRunnableFunction(HandlePrefetchTag,
|
| + resource_context.prerender_manager(),
|
| + child_id,
|
| + route_id,
|
| + request_data.url,
|
| + referrer,
|
| + is_prerendering));
|
| + return false;
|
| + }
|
| + }
|
| +
|
| + // Abort any prerenders that spawn requests that use invalid HTTP methods.
|
| + if (is_prerendering &&
|
| + !PrerenderManager::IsValidHttpMethod(request_data.method)) {
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + NewRunnableFunction(
|
| + DestroyPreloadForRenderView,
|
| + resource_context.prerender_manager(),
|
| + child_id,
|
| + route_id,
|
| + FINAL_STATUS_INVALID_HTTP_METHOD));
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void PrerenderTracker::MutateLoadFlags(int child_id, int route_id,
|
| + int* load_flags) {
|
| + DCHECK(load_flags);
|
| + if (IsPrerenderingOnIOThread(child_id, route_id))
|
| + *load_flags |= net::LOAD_PRERENDER;
|
| +}
|
| +
|
| void PrerenderTracker::AddPrerenderOnIOThread(
|
| const ChildRouteIdPair& child_route_id_pair) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| @@ -187,16 +232,27 @@ void PrerenderTracker::RemovePrerenderOnIOThread(
|
| possibly_prerendering_io_thread_set_.erase(child_route_id_pair);
|
| }
|
|
|
| +bool PrerenderTracker::IsPrerenderingOnIOThread(int child_id,
|
| + int route_id) const {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| +
|
| + ChildRouteIdPair child_route_id_pair(child_id, route_id);
|
| + return possibly_prerendering_io_thread_set_.end() !=
|
| + possibly_prerendering_io_thread_set_.find(child_route_id_pair);
|
| +}
|
| +
|
| // static
|
| void PrerenderTracker::AddPrerenderOnIOThreadTask(
|
| const ChildRouteIdPair& child_route_id_pair) {
|
| - GetInstance()->AddPrerenderOnIOThread(child_route_id_pair);
|
| + g_browser_process->prerender_tracker()->AddPrerenderOnIOThread(
|
| + child_route_id_pair);
|
| }
|
|
|
| // static
|
| void PrerenderTracker::RemovePrerenderOnIOThreadTask(
|
| const ChildRouteIdPair& child_route_id_pair) {
|
| - GetInstance()->RemovePrerenderOnIOThread(child_route_id_pair);
|
| + g_browser_process->prerender_tracker()->RemovePrerenderOnIOThread(
|
| + child_route_id_pair);
|
| }
|
|
|
| } // namespace prerender
|
|
|