Chromium Code Reviews| 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..1451a606dea57c656934feec8c41dfa9f522f821 100644 |
| --- a/chrome/browser/prerender/prerender_tracker.cc |
| +++ b/chrome/browser/prerender/prerender_tracker.cc |
| @@ -3,9 +3,14 @@ |
| // 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 "chrome/browser/ui/browser.h" |
|
mmenke
2011/05/23 21:58:41
Is this needed?
dominich
2011/05/23 22:22:55
Done.
|
| #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 +33,10 @@ 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; |
| -}; |
| - |
| -// static |
| -PrerenderTracker* PrerenderTracker::GetInstance() { |
| - return Singleton<PrerenderTracker>::get(); |
| } |
| bool PrerenderTracker::TryUse(int child_id, int route_id) { |
| @@ -134,12 +130,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 +159,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)); |
| @@ -190,13 +236,15 @@ void PrerenderTracker::RemovePrerenderOnIOThread( |
| // 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 |