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

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: fix unit_tests build 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..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

Powered by Google App Engine
This is Rietveld 408576698