| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/prerender/prerender_resource_throttle.h" | 5 #include "chrome/browser/prerender/prerender_resource_throttle.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 #include "chrome/browser/prerender/prerender_final_status.h" | 8 #include "chrome/browser/prerender/prerender_final_status.h" |
| 9 #include "chrome/browser/prerender/prerender_manager.h" | 9 #include "chrome/browser/prerender/prerender_manager.h" |
| 10 #include "chrome/browser/prerender/prerender_util.h" | 10 #include "chrome/browser/prerender/prerender_util.h" |
| 11 #include "content/public/browser/browser_thread.h" | 11 #include "content/public/browser/browser_thread.h" |
| 12 #include "content/public/browser/render_frame_host.h" | 12 #include "content/public/browser/render_frame_host.h" |
| 13 #include "content/public/browser/resource_controller.h" | 13 #include "content/public/browser/resource_controller.h" |
| 14 #include "content/public/browser/resource_request_info.h" | 14 #include "content/public/browser/resource_request_info.h" |
| 15 #include "content/public/browser/web_contents.h" | 15 #include "content/public/browser/web_contents.h" |
| 16 #include "net/http/http_response_headers.h" |
| 16 #include "net/url_request/redirect_info.h" | 17 #include "net/url_request/redirect_info.h" |
| 17 #include "net/url_request/url_request.h" | 18 #include "net/url_request/url_request.h" |
| 18 | 19 |
| 19 using content::ResourceType; | 20 using content::ResourceType; |
| 20 | 21 |
| 21 namespace prerender { | 22 namespace prerender { |
| 22 | 23 |
| 23 namespace { | 24 namespace { |
| 24 static const char kFollowOnlyWhenPrerenderShown[] = | 25 static const char kFollowOnlyWhenPrerenderShown[] = |
| 25 "follow-only-when-prerender-shown"; | 26 "follow-only-when-prerender-shown"; |
| 26 | 27 |
| 27 PrerenderContents* g_prerender_contents_for_testing; | 28 PrerenderContents* g_prerender_contents_for_testing; |
| 28 } | 29 } // namespace |
| 29 | 30 |
| 30 void PrerenderResourceThrottle::OverridePrerenderContentsForTesting( | 31 void PrerenderResourceThrottle::OverridePrerenderContentsForTesting( |
| 31 PrerenderContents* contents) { | 32 PrerenderContents* contents) { |
| 32 g_prerender_contents_for_testing = contents; | 33 g_prerender_contents_for_testing = contents; |
| 33 } | 34 } |
| 34 | 35 |
| 35 PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request) | 36 PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request) |
| 36 : request_(request) { | 37 : request_(request) { |
| 37 } | 38 } |
| 38 | 39 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 60 | 61 |
| 61 content::BrowserThread::PostTask( | 62 content::BrowserThread::PostTask( |
| 62 content::BrowserThread::UI, | 63 content::BrowserThread::UI, |
| 63 FROM_HERE, | 64 FROM_HERE, |
| 64 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI, | 65 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI, |
| 65 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(), | 66 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(), |
| 66 info->GetChildID(), info->GetRenderFrameID(), | 67 info->GetChildID(), info->GetRenderFrameID(), |
| 67 redirect_info.new_url)); | 68 redirect_info.new_url)); |
| 68 } | 69 } |
| 69 | 70 |
| 71 void PrerenderResourceThrottle::WillProcessResponse(bool* defer) { |
| 72 const content::ResourceRequestInfo* info = |
| 73 content::ResourceRequestInfo::ForRequest(request_); |
| 74 if (!info) |
| 75 return; |
| 76 |
| 77 bool is_no_store = false; |
| 78 const net::HttpResponseInfo& response_info = request_->response_info(); |
| 79 if (response_info.headers.get()) { |
| 80 is_no_store = |
| 81 response_info.headers->HasHeaderValue("cache-control", "no-store"); |
| 82 } |
| 83 |
| 84 content::BrowserThread::PostTask( |
| 85 content::BrowserThread::UI, FROM_HERE, |
| 86 base::Bind(&PrerenderResourceThrottle::WillProcessResponseOnUI, |
| 87 content::IsResourceTypeFrame(info->GetResourceType()), |
| 88 is_no_store, info->GetChildID(), info->GetRenderFrameID())); |
| 89 } |
| 90 |
| 70 const char* PrerenderResourceThrottle::GetNameForLogging() const { | 91 const char* PrerenderResourceThrottle::GetNameForLogging() const { |
| 71 return "PrerenderResourceThrottle"; | 92 return "PrerenderResourceThrottle"; |
| 72 } | 93 } |
| 73 | 94 |
| 74 void PrerenderResourceThrottle::Resume() { | 95 void PrerenderResourceThrottle::Resume() { |
| 75 controller()->Resume(); | 96 controller()->Resume(); |
| 76 } | 97 } |
| 77 | 98 |
| 78 void PrerenderResourceThrottle::Cancel() { | 99 void PrerenderResourceThrottle::Cancel() { |
| 79 controller()->Cancel(); | 100 controller()->Cancel(); |
| 80 } | 101 } |
| 81 | 102 |
| 103 // static |
| 82 void PrerenderResourceThrottle::WillStartRequestOnUI( | 104 void PrerenderResourceThrottle::WillStartRequestOnUI( |
| 83 const base::WeakPtr<PrerenderResourceThrottle>& throttle, | 105 const base::WeakPtr<PrerenderResourceThrottle>& throttle, |
| 84 const std::string& method, | 106 const std::string& method, |
| 85 ResourceType resource_type, | 107 ResourceType resource_type, |
| 86 int render_process_id, | 108 int render_process_id, |
| 87 int render_frame_id, | 109 int render_frame_id, |
| 88 const GURL& url) { | 110 const GURL& url) { |
| 89 bool cancel = false; | 111 bool cancel = false; |
| 90 PrerenderContents* prerender_contents = | 112 PrerenderContents* prerender_contents = |
| 91 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id); | 113 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 109 } | 131 } |
| 110 } | 132 } |
| 111 | 133 |
| 112 content::BrowserThread::PostTask( | 134 content::BrowserThread::PostTask( |
| 113 content::BrowserThread::IO, | 135 content::BrowserThread::IO, |
| 114 FROM_HERE, | 136 FROM_HERE, |
| 115 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel : | 137 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel : |
| 116 &PrerenderResourceThrottle::Resume, throttle)); | 138 &PrerenderResourceThrottle::Resume, throttle)); |
| 117 } | 139 } |
| 118 | 140 |
| 141 // static |
| 119 void PrerenderResourceThrottle::WillRedirectRequestOnUI( | 142 void PrerenderResourceThrottle::WillRedirectRequestOnUI( |
| 120 const base::WeakPtr<PrerenderResourceThrottle>& throttle, | 143 const base::WeakPtr<PrerenderResourceThrottle>& throttle, |
| 121 const std::string& follow_only_when_prerender_shown_header, | 144 const std::string& follow_only_when_prerender_shown_header, |
| 122 ResourceType resource_type, | 145 ResourceType resource_type, |
| 123 bool async, | 146 bool async, |
| 124 int render_process_id, | 147 int render_process_id, |
| 125 int render_frame_id, | 148 int render_frame_id, |
| 126 const GURL& new_url) { | 149 const GURL& new_url) { |
| 127 bool cancel = false; | 150 bool cancel = false; |
| 128 PrerenderContents* prerender_contents = | 151 PrerenderContents* prerender_contents = |
| (...skipping 21 matching lines...) Expand all Loading... |
| 150 } | 173 } |
| 151 } | 174 } |
| 152 | 175 |
| 153 content::BrowserThread::PostTask( | 176 content::BrowserThread::PostTask( |
| 154 content::BrowserThread::IO, | 177 content::BrowserThread::IO, |
| 155 FROM_HERE, | 178 FROM_HERE, |
| 156 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel : | 179 base::Bind(cancel ? &PrerenderResourceThrottle::Cancel : |
| 157 &PrerenderResourceThrottle::Resume, throttle)); | 180 &PrerenderResourceThrottle::Resume, throttle)); |
| 158 } | 181 } |
| 159 | 182 |
| 183 // static |
| 184 void PrerenderResourceThrottle::WillProcessResponseOnUI(bool is_main_resource, |
| 185 bool is_no_store, |
| 186 int render_process_id, |
| 187 int render_frame_id) { |
| 188 PrerenderContents* prerender_contents = |
| 189 PrerenderContentsFromRenderFrame(render_process_id, render_frame_id); |
| 190 if (!prerender_contents) |
| 191 return; |
| 192 |
| 193 if (prerender_contents->prerender_mode() != PREFETCH_ONLY) |
| 194 return; |
| 195 |
| 196 prerender_contents->prerender_manager()->RecordResourcePrefetch( |
| 197 prerender_contents->origin(), is_main_resource, is_no_store); |
| 198 } |
| 199 |
| 200 // static |
| 160 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromRenderFrame( | 201 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromRenderFrame( |
| 161 int render_process_id, int render_frame_id) { | 202 int render_process_id, int render_frame_id) { |
| 162 if (g_prerender_contents_for_testing) | 203 if (g_prerender_contents_for_testing) |
| 163 return g_prerender_contents_for_testing; | 204 return g_prerender_contents_for_testing; |
| 164 content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( | 205 content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( |
| 165 render_process_id, render_frame_id); | 206 render_process_id, render_frame_id); |
| 166 content::WebContents* web_contents = | 207 content::WebContents* web_contents = |
| 167 content::WebContents::FromRenderFrameHost(rfh); | 208 content::WebContents::FromRenderFrameHost(rfh); |
| 168 return PrerenderContents::FromWebContents(web_contents); | 209 return PrerenderContents::FromWebContents(web_contents); |
| 169 } | 210 } |
| 170 | 211 |
| 171 } // namespace prerender | 212 } // namespace prerender |
| OLD | NEW |