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 |