OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_observer.
h" | 5 #include "chrome/browser/renderer_host/chrome_resource_dispatcher_host_observer.
h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "chrome/browser/prerender/prerender_manager.h" | 8 #include "chrome/browser/prerender/prerender_manager.h" |
9 #include "chrome/browser/prerender/prerender_tracker.h" | 9 #include "chrome/browser/prerender/prerender_tracker.h" |
10 #include "content/browser/browser_thread.h" | 10 #include "content/browser/browser_thread.h" |
11 #include "content/browser/resource_context.h" | 11 #include "content/browser/resource_context.h" |
12 #include "content/common/resource_messages.h" | 12 #include "content/common/resource_messages.h" |
13 #include "net/base/load_flags.h" | 13 #include "net/base/load_flags.h" |
14 | 14 |
15 ChromeResourceDispatcherHostObserver::ChromeResourceDispatcherHostObserver( | 15 ChromeResourceDispatcherHostObserver::ChromeResourceDispatcherHostObserver( |
16 prerender::PrerenderTracker* prerender_tracker) | 16 prerender::PrerenderTracker* prerender_tracker) |
17 : prerender_tracker_(prerender_tracker) { | 17 : prerender_tracker_(prerender_tracker) { |
18 } | 18 } |
19 | 19 |
20 ChromeResourceDispatcherHostObserver::~ChromeResourceDispatcherHostObserver() { | 20 ChromeResourceDispatcherHostObserver::~ChromeResourceDispatcherHostObserver() { |
21 } | 21 } |
22 | 22 |
23 bool ChromeResourceDispatcherHostObserver::ShouldBeginRequest( | 23 bool ChromeResourceDispatcherHostObserver::ShouldBeginRequest( |
24 int child_id, int route_id, | 24 int child_id, int route_id, |
25 const ResourceHostMsg_Request& request_data, | 25 const ResourceHostMsg_Request& request_data, |
26 const content::ResourceContext& resource_context, | 26 const content::ResourceContext& resource_context, |
27 const GURL& referrer) { | 27 const GURL& referrer) { |
28 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 28 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
29 bool is_prerendering = prerender_tracker_->IsPrerenderingOnIOThread( | |
30 child_id, route_id); | |
31 | 29 |
32 // Handle a PREFETCH resource type. If prefetch is disabled, squelch the | 30 // Handle a PREFETCH resource type. If prefetch is disabled, squelch the |
33 // request. Otherwise, do a normal request to warm the cache. | 31 // request. Otherwise, do a normal request to warm the cache. |
34 if (request_data.resource_type == ResourceType::PREFETCH) { | 32 if (request_data.resource_type == ResourceType::PREFETCH) { |
35 // All PREFETCH requests should be GETs, but be defensive about it. | 33 // All PREFETCH requests should be GETs, but be defensive about it. |
36 if (request_data.method != "GET") | 34 if (request_data.method != "GET") |
37 return false; | 35 return false; |
38 | 36 |
39 // If prefetch is disabled, kill the request. | 37 // If prefetch is disabled, kill the request. |
40 if (!ResourceDispatcherHost::is_prefetch_enabled()) | 38 if (!ResourceDispatcherHost::is_prefetch_enabled()) |
41 return false; | 39 return false; |
42 } | 40 } |
43 | 41 |
44 // Handle a PRERENDER motivated request. Very similar to rel=prefetch, these | 42 // Handle a PRERENDER motivated request. Very similar to rel=prefetch, these |
45 // rel=prerender requests instead launch an early render of the entire page. | 43 // rel=prerender requests instead launch an early render of the entire page. |
46 if (request_data.resource_type == ResourceType::PRERENDER) { | 44 if (request_data.resource_type == ResourceType::PRERENDER) { |
47 if (prerender::PrerenderManager::IsPrerenderingPossible()) { | 45 if (prerender::PrerenderManager::IsPrerenderingPossible()) { |
48 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 46 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
49 NewRunnableFunction(prerender::HandleTag, | 47 NewRunnableFunction(prerender::HandleTag, |
50 resource_context.prerender_manager(), | 48 resource_context.prerender_manager(), |
51 child_id, | 49 child_id, |
52 route_id, | 50 route_id, |
53 request_data.url, | 51 request_data.url, |
54 referrer, | 52 referrer)); |
55 is_prerendering)); | |
56 } | 53 } |
57 // Prerendering or not, this request should be aborted. | 54 // Prerendering or not, this request should be aborted. |
58 return false; | 55 return false; |
59 } | 56 } |
60 | 57 |
61 // Abort any prerenders that spawn requests that use invalid HTTP methods. | 58 // Abort any prerenders that spawn requests that use invalid HTTP methods. |
62 if (is_prerendering && | 59 if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id) && |
63 !prerender::PrerenderManager::IsValidHttpMethod(request_data.method)) { | 60 !prerender::PrerenderManager::IsValidHttpMethod(request_data.method)) { |
64 prerender_tracker_->TryCancelOnIOThread( | 61 prerender_tracker_->TryCancelOnIOThread( |
65 child_id, route_id, | 62 child_id, route_id, |
66 prerender::FINAL_STATUS_INVALID_HTTP_METHOD); | 63 prerender::FINAL_STATUS_INVALID_HTTP_METHOD); |
67 return false; | 64 return false; |
68 } | 65 } |
69 | 66 |
70 return true; | 67 return true; |
71 } | 68 } |
72 | 69 |
73 void ChromeResourceDispatcherHostObserver::MutateLoadFlags(int child_id, | 70 void ChromeResourceDispatcherHostObserver::MutateLoadFlags(int child_id, |
74 int route_id, | 71 int route_id, |
75 int* load_flags) { | 72 int* load_flags) { |
76 DCHECK(load_flags); | 73 DCHECK(load_flags); |
77 if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) | 74 if (prerender_tracker_->IsPrerenderingOnIOThread(child_id, route_id)) |
78 *load_flags |= net::LOAD_PRERENDERING; | 75 *load_flags |= net::LOAD_PRERENDERING; |
79 } | 76 } |
OLD | NEW |