Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3250)

Unified Diff: chrome/browser/prerender/prerender_tracker.cc

Issue 6966017: Remove a chrome dependency by removing Prerender from ResourceDispatcherHost. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698