| Index: chrome/browser/renderer_host/resource_dispatcher_host_observer.cc
|
| diff --git a/chrome/browser/renderer_host/resource_dispatcher_host_observer.cc b/chrome/browser/renderer_host/resource_dispatcher_host_observer.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..92113092f4ce46e48dce37cd76bc7a6436bda199
|
| --- /dev/null
|
| +++ b/chrome/browser/renderer_host/resource_dispatcher_host_observer.cc
|
| @@ -0,0 +1,80 @@
|
| +// 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"
|
| +#include "chrome/browser/prerender/prerender_manager.h"
|
| +#include "chrome/browser/prerender/prerender_tracker.h"
|
| +#include "chrome/browser/renderer_host/resource_dispatcher_host_observer.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"
|
| +
|
| +ResourceDispatcherHostObserver::ResourceDispatcherHostObserver() {
|
| +}
|
| +
|
| +ResourceDispatcherHostObserver::~ResourceDispatcherHostObserver() {
|
| +}
|
| +
|
| +bool ResourceDispatcherHostObserver::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 =
|
| + g_browser_process->prerender_tracker()->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 (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,
|
| + NewRunnableFunction(
|
| + prerender::DestroyPreloadForRenderView,
|
| + resource_context.prerender_manager(),
|
| + child_id,
|
| + route_id,
|
| + prerender::FINAL_STATUS_INVALID_HTTP_METHOD));
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void ResourceDispatcherHostObserver::MutateLoadFlags(int child_id,
|
| + int route_id,
|
| + int* load_flags) {
|
| + DCHECK(load_flags);
|
| + if (g_browser_process->prerender_tracker()->IsPrerenderingOnIOThread(
|
| + child_id, route_id)) {
|
| + *load_flags |= net::LOAD_PRERENDER;
|
| + }
|
| +}
|
|
|