Chromium Code Reviews| Index: chrome/browser/renderer_host/chrome_resource_dispatcher_host_observer.cc |
| diff --git a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_observer.cc b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_observer.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..d5e385e07ee1187e3ddc7ccd14cdaa651005b11a |
| --- /dev/null |
| +++ b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_observer.cc |
| @@ -0,0 +1,79 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "base/logging.h" |
| +#include "chrome/browser/browser_process.h" |
|
mmenke
2011/05/24 17:56:22
Is this needed?
dominich
2011/05/24 18:01:47
Done.
|
| +#include "chrome/browser/prerender/prerender_manager.h" |
| +#include "chrome/browser/prerender/prerender_tracker.h" |
| +#include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_observer.h" |
|
cbentzel
2011/05/24 17:13:54
I think this is supposed to come before the other
dominich
2011/05/24 18:01:47
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" |
| + |
| +ChromeResourceDispatcherHostObserver::ChromeResourceDispatcherHostObserver( |
| + prerender::PrerenderTracker* prerender_tracker) |
| + : prerender_tracker_(prerender_tracker) { |
| +} |
| + |
| +ChromeResourceDispatcherHostObserver::~ChromeResourceDispatcherHostObserver() { |
| +} |
| + |
| +bool ChromeResourceDispatcherHostObserver::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 = prerender_tracker_->IsPrerenderingOnIOThread( |
| + child_id, route_id); |
| + |
| + // Handle a PREFETCH resource type. |
| + if (request_data.resource_type == ResourceType::PREFETCH) { |
|
cbentzel
2011/05/24 17:13:54
Depending on when Gavin's prerender change goes in
|
| + // 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 (prerender::PrerenderManager::IsPrerenderingPossible()) { |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + NewRunnableFunction(prerender::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 && |
| + !prerender::PrerenderManager::IsValidHttpMethod(request_data.method)) { |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
|
cbentzel
2011/05/24 17:13:54
This should be using prerender_tracker->TryCancelO
dominich
2011/05/24 18:01:47
Done.
|
| + NewRunnableFunction( |
| + prerender::DestroyPreloadForRenderView, |
| + resource_context.prerender_manager(), |
| + child_id, |
| + route_id, |
| + prerender::FINAL_STATUS_INVALID_HTTP_METHOD)); |
| + return false; |
| + } |
| + |
| + return true; |
| +} |
| + |
| +void ChromeResourceDispatcherHostObserver::MutateLoadFlags(int child_id, |
| + int route_id, |
| + int* load_flags) { |
| + DCHECK(load_flags); |
| + if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) |
| + *load_flags |= net::LOAD_PRERENDER; |
| +} |