| 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 "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/numerics/safe_conversions.h" | 9 #include "base/numerics/safe_conversions.h" |
| 10 #include "build/build_config.h" | 10 #include "build/build_config.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 } | 83 } |
| 84 | 84 |
| 85 PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request) | 85 PrerenderResourceThrottle::PrerenderResourceThrottle(net::URLRequest* request) |
| 86 : request_(request), | 86 : request_(request), |
| 87 load_flags_(net::LOAD_NORMAL), | 87 load_flags_(net::LOAD_NORMAL), |
| 88 prerender_throttle_info_(new PrerenderThrottleInfo()) {} | 88 prerender_throttle_info_(new PrerenderThrottleInfo()) {} |
| 89 | 89 |
| 90 PrerenderResourceThrottle::~PrerenderResourceThrottle() {} | 90 PrerenderResourceThrottle::~PrerenderResourceThrottle() {} |
| 91 | 91 |
| 92 void PrerenderResourceThrottle::WillStartRequest(bool* defer) { | 92 void PrerenderResourceThrottle::WillStartRequest(bool* defer) { |
| 93 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 93 const content::ResourceRequestInfo* info = | 94 const content::ResourceRequestInfo* info = |
| 94 content::ResourceRequestInfo::ForRequest(request_); | 95 content::ResourceRequestInfo::ForRequest(request_); |
| 95 *defer = true; | 96 *defer = true; |
| 96 BrowserThread::PostTask( | 97 BrowserThread::PostTask( |
| 97 BrowserThread::UI, FROM_HERE, | 98 BrowserThread::UI, FROM_HERE, |
| 98 base::Bind(&PrerenderResourceThrottle::WillStartRequestOnUI, AsWeakPtr(), | 99 base::Bind(&PrerenderResourceThrottle::WillStartRequestOnUI, AsWeakPtr(), |
| 99 request_->method(), info->GetResourceType(), request_->url(), | 100 request_->method(), info->GetResourceType(), request_->url(), |
| 100 info->GetWebContentsGetterForRequest(), | 101 info->GetWebContentsGetterForRequest(), |
| 101 prerender_throttle_info_)); | 102 prerender_throttle_info_)); |
| 102 } | 103 } |
| 103 | 104 |
| 104 void PrerenderResourceThrottle::WillRedirectRequest( | 105 void PrerenderResourceThrottle::WillRedirectRequest( |
| 105 const net::RedirectInfo& redirect_info, | 106 const net::RedirectInfo& redirect_info, |
| 106 bool* defer) { | 107 bool* defer) { |
| 108 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 107 const content::ResourceRequestInfo* info = | 109 const content::ResourceRequestInfo* info = |
| 108 content::ResourceRequestInfo::ForRequest(request_); | 110 content::ResourceRequestInfo::ForRequest(request_); |
| 109 *defer = true; | 111 *defer = true; |
| 110 std::string header; | 112 std::string header; |
| 111 request_->GetResponseHeaderByName(kFollowOnlyWhenPrerenderShown, &header); | 113 request_->GetResponseHeaderByName(kFollowOnlyWhenPrerenderShown, &header); |
| 112 | 114 |
| 113 BrowserThread::PostTask( | 115 BrowserThread::PostTask( |
| 114 BrowserThread::UI, FROM_HERE, | 116 BrowserThread::UI, FROM_HERE, |
| 115 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI, | 117 base::Bind(&PrerenderResourceThrottle::WillRedirectRequestOnUI, |
| 116 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(), | 118 AsWeakPtr(), header, info->GetResourceType(), info->IsAsync(), |
| 117 IsNoStoreResponse(*request_), redirect_info.new_url, | 119 IsNoStoreResponse(*request_), redirect_info.new_url, |
| 118 info->GetWebContentsGetterForRequest())); | 120 info->GetWebContentsGetterForRequest())); |
| 119 } | 121 } |
| 120 | 122 |
| 121 void PrerenderResourceThrottle::WillProcessResponse(bool* defer) { | 123 void PrerenderResourceThrottle::WillProcessResponse(bool* defer) { |
| 124 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 122 const content::ResourceRequestInfo* info = | 125 const content::ResourceRequestInfo* info = |
| 123 content::ResourceRequestInfo::ForRequest(request_); | 126 content::ResourceRequestInfo::ForRequest(request_); |
| 124 if (!info) | 127 if (!info) |
| 125 return; | 128 return; |
| 126 | 129 |
| 127 DCHECK_GT(request_->url_chain().size(), 0u); | 130 DCHECK_GT(request_->url_chain().size(), 0u); |
| 128 int redirect_count = | 131 int redirect_count = |
| 129 base::saturated_cast<int>(request_->url_chain().size()) - 1; | 132 base::saturated_cast<int>(request_->url_chain().size()) - 1; |
| 130 | 133 |
| 131 BrowserThread::PostTask( | 134 BrowserThread::PostTask( |
| 132 BrowserThread::UI, FROM_HERE, | 135 BrowserThread::UI, FROM_HERE, |
| 133 base::Bind(&PrerenderResourceThrottle::WillProcessResponseOnUI, | 136 base::Bind(&PrerenderResourceThrottle::WillProcessResponseOnUI, |
| 134 content::IsResourceTypeFrame(info->GetResourceType()), | 137 content::IsResourceTypeFrame(info->GetResourceType()), |
| 135 IsNoStoreResponse(*request_), redirect_count, | 138 IsNoStoreResponse(*request_), redirect_count, |
| 136 prerender_throttle_info_)); | 139 prerender_throttle_info_)); |
| 137 } | 140 } |
| 138 | 141 |
| 139 const char* PrerenderResourceThrottle::GetNameForLogging() const { | 142 const char* PrerenderResourceThrottle::GetNameForLogging() const { |
| 140 return "PrerenderResourceThrottle"; | 143 return "PrerenderResourceThrottle"; |
| 141 } | 144 } |
| 142 | 145 |
| 143 void PrerenderResourceThrottle::ResumeHandler() { | 146 void PrerenderResourceThrottle::ResumeHandler() { |
| 147 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 144 request_->SetLoadFlags(request_->load_flags() | load_flags_); | 148 request_->SetLoadFlags(request_->load_flags() | load_flags_); |
| 145 Resume(); | 149 Resume(); |
| 146 } | 150 } |
| 147 | 151 |
| 148 // static | 152 // static |
| 149 void PrerenderResourceThrottle::WillStartRequestOnUI( | 153 void PrerenderResourceThrottle::WillStartRequestOnUI( |
| 150 const base::WeakPtr<PrerenderResourceThrottle>& throttle, | 154 const base::WeakPtr<PrerenderResourceThrottle>& throttle, |
| 151 const std::string& method, | 155 const std::string& method, |
| 152 ResourceType resource_type, | 156 ResourceType resource_type, |
| 153 const GURL& url, | 157 const GURL& url, |
| 154 const ResourceRequestInfo::WebContentsGetter& web_contents_getter, | 158 const ResourceRequestInfo::WebContentsGetter& web_contents_getter, |
| 155 scoped_refptr<PrerenderThrottleInfo> prerender_throttle_info) { | 159 scoped_refptr<PrerenderThrottleInfo> prerender_throttle_info) { |
| 160 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 156 bool cancel = false; | 161 bool cancel = false; |
| 157 PrerenderContents* prerender_contents = | 162 PrerenderContents* prerender_contents = |
| 158 PrerenderContentsFromGetter(web_contents_getter); | 163 PrerenderContentsFromGetter(web_contents_getter); |
| 159 if (prerender_contents) { | 164 if (prerender_contents) { |
| 160 DCHECK(prerender_throttle_info); | 165 DCHECK(prerender_throttle_info); |
| 161 prerender_throttle_info->Set(prerender_contents->prerender_mode(), | 166 prerender_throttle_info->Set(prerender_contents->prerender_mode(), |
| 162 prerender_contents->origin(), | 167 prerender_contents->origin(), |
| 163 prerender_contents->prerender_manager()); | 168 prerender_contents->prerender_manager()); |
| 164 BrowserThread::PostTask( | 169 BrowserThread::PostTask( |
| 165 BrowserThread::IO, FROM_HERE, | 170 BrowserThread::IO, FROM_HERE, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 | 211 |
| 207 // static | 212 // static |
| 208 void PrerenderResourceThrottle::WillRedirectRequestOnUI( | 213 void PrerenderResourceThrottle::WillRedirectRequestOnUI( |
| 209 const base::WeakPtr<PrerenderResourceThrottle>& throttle, | 214 const base::WeakPtr<PrerenderResourceThrottle>& throttle, |
| 210 const std::string& follow_only_when_prerender_shown_header, | 215 const std::string& follow_only_when_prerender_shown_header, |
| 211 ResourceType resource_type, | 216 ResourceType resource_type, |
| 212 bool async, | 217 bool async, |
| 213 bool is_no_store, | 218 bool is_no_store, |
| 214 const GURL& new_url, | 219 const GURL& new_url, |
| 215 const ResourceRequestInfo::WebContentsGetter& web_contents_getter) { | 220 const ResourceRequestInfo::WebContentsGetter& web_contents_getter) { |
| 221 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 216 bool cancel = false; | 222 bool cancel = false; |
| 217 PrerenderContents* prerender_contents = | 223 PrerenderContents* prerender_contents = |
| 218 PrerenderContentsFromGetter(web_contents_getter); | 224 PrerenderContentsFromGetter(web_contents_getter); |
| 219 if (prerender_contents) { | 225 if (prerender_contents) { |
| 220 prerender_contents->prerender_manager()->RecordPrefetchResponseReceived( | 226 prerender_contents->prerender_manager()->RecordPrefetchResponseReceived( |
| 221 prerender_contents->origin(), | 227 prerender_contents->origin(), |
| 222 content::IsResourceTypeFrame(resource_type), true /* is_redirect */, | 228 content::IsResourceTypeFrame(resource_type), true /* is_redirect */, |
| 223 is_no_store); | 229 is_no_store); |
| 224 // Abort any prerenders with requests which redirect to invalid schemes. | 230 // Abort any prerenders with requests which redirect to invalid schemes. |
| 225 if (!PrerenderManager::DoesURLHaveValidScheme(new_url)) { | 231 if (!PrerenderManager::DoesURLHaveValidScheme(new_url)) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 249 : &PrerenderResourceThrottle::ResumeHandler, | 255 : &PrerenderResourceThrottle::ResumeHandler, |
| 250 throttle)); | 256 throttle)); |
| 251 } | 257 } |
| 252 | 258 |
| 253 // static | 259 // static |
| 254 void PrerenderResourceThrottle::WillProcessResponseOnUI( | 260 void PrerenderResourceThrottle::WillProcessResponseOnUI( |
| 255 bool is_main_resource, | 261 bool is_main_resource, |
| 256 bool is_no_store, | 262 bool is_no_store, |
| 257 int redirect_count, | 263 int redirect_count, |
| 258 scoped_refptr<PrerenderThrottleInfo> prerender_throttle_info) { | 264 scoped_refptr<PrerenderThrottleInfo> prerender_throttle_info) { |
| 265 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 259 DCHECK(prerender_throttle_info); | 266 DCHECK(prerender_throttle_info); |
| 260 if (!prerender_throttle_info->manager()) | 267 if (!prerender_throttle_info->manager()) |
| 261 return; | 268 return; |
| 262 | 269 |
| 263 if (prerender_throttle_info->mode() != PREFETCH_ONLY) | 270 if (prerender_throttle_info->mode() != PREFETCH_ONLY) |
| 264 return; | 271 return; |
| 265 | 272 |
| 266 prerender_throttle_info->manager()->RecordPrefetchResponseReceived( | 273 prerender_throttle_info->manager()->RecordPrefetchResponseReceived( |
| 267 prerender_throttle_info->origin(), is_main_resource, | 274 prerender_throttle_info->origin(), is_main_resource, |
| 268 false /* is_redirect */, is_no_store); | 275 false /* is_redirect */, is_no_store); |
| 269 prerender_throttle_info->manager()->RecordPrefetchRedirectCount( | 276 prerender_throttle_info->manager()->RecordPrefetchRedirectCount( |
| 270 prerender_throttle_info->origin(), is_main_resource, redirect_count); | 277 prerender_throttle_info->origin(), is_main_resource, redirect_count); |
| 271 } | 278 } |
| 272 | 279 |
| 273 // static | 280 // static |
| 274 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromGetter( | 281 PrerenderContents* PrerenderResourceThrottle::PrerenderContentsFromGetter( |
| 275 const ResourceRequestInfo::WebContentsGetter& web_contents_getter) { | 282 const ResourceRequestInfo::WebContentsGetter& web_contents_getter) { |
| 283 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 276 if (g_prerender_contents_for_testing) | 284 if (g_prerender_contents_for_testing) |
| 277 return g_prerender_contents_for_testing; | 285 return g_prerender_contents_for_testing; |
| 278 return PrerenderContents::FromWebContents(web_contents_getter.Run()); | 286 return PrerenderContents::FromWebContents(web_contents_getter.Run()); |
| 279 } | 287 } |
| 280 | 288 |
| 281 void PrerenderResourceThrottle::SetPrerenderMode(PrerenderMode mode) { | 289 void PrerenderResourceThrottle::SetPrerenderMode(PrerenderMode mode) { |
| 290 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 282 load_flags_ = (mode == PREFETCH_ONLY) ? net::LOAD_PREFETCH : net::LOAD_NORMAL; | 291 load_flags_ = (mode == PREFETCH_ONLY) ? net::LOAD_PREFETCH : net::LOAD_NORMAL; |
| 283 } | 292 } |
| 284 | 293 |
| 285 } // namespace prerender | 294 } // namespace prerender |
| OLD | NEW |