Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: content/browser/loader/resource_loader.cc

Issue 2321543002: Merge CrossSiteResourceHandler and NavigationResourceThrottle (Closed)
Patch Set: Fixed test compilation error Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/loader/resource_loader.h" 5 #include "content/browser/loader/resource_loader.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/location.h" 10 #include "base/location.h"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "base/profiler/scoped_tracker.h" 12 #include "base/profiler/scoped_tracker.h"
13 #include "base/single_thread_task_runner.h" 13 #include "base/single_thread_task_runner.h"
14 #include "base/threading/thread_task_runner_handle.h" 14 #include "base/threading/thread_task_runner_handle.h"
15 #include "base/time/time.h" 15 #include "base/time/time.h"
16 #include "base/trace_event/trace_event.h" 16 #include "base/trace_event/trace_event.h"
17 #include "content/browser/appcache/appcache_interceptor.h" 17 #include "content/browser/appcache/appcache_interceptor.h"
18 #include "content/browser/child_process_security_policy_impl.h" 18 #include "content/browser/child_process_security_policy_impl.h"
19 #include "content/browser/loader/cross_site_resource_handler.h"
20 #include "content/browser/loader/detachable_resource_handler.h" 19 #include "content/browser/loader/detachable_resource_handler.h"
21 #include "content/browser/loader/resource_loader_delegate.h" 20 #include "content/browser/loader/resource_loader_delegate.h"
22 #include "content/browser/loader/resource_request_info_impl.h" 21 #include "content/browser/loader/resource_request_info_impl.h"
23 #include "content/browser/service_worker/service_worker_request_handler.h" 22 #include "content/browser/service_worker/service_worker_request_handler.h"
24 #include "content/browser/service_worker/service_worker_response_info.h" 23 #include "content/browser/service_worker/service_worker_response_info.h"
25 #include "content/browser/ssl/ssl_client_auth_handler.h" 24 #include "content/browser/ssl/ssl_client_auth_handler.h"
26 #include "content/browser/ssl/ssl_manager.h" 25 #include "content/browser/ssl/ssl_manager.h"
27 #include "content/browser/ssl/ssl_policy.h" 26 #include "content/browser/ssl/ssl_policy.h"
28 #include "content/common/security_style_util.h" 27 #include "content/common/security_style_util.h"
29 #include "content/common/ssl_status_serialization.h" 28 #include "content/common/ssl_status_serialization.h"
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 CancelRequest(false); 215 CancelRequest(false);
217 } 216 }
218 217
219 void ResourceLoader::CancelWithError(int error_code) { 218 void ResourceLoader::CancelWithError(int error_code) {
220 TRACE_EVENT_WITH_FLOW0("loading", "ResourceLoader::CancelWithError", this, 219 TRACE_EVENT_WITH_FLOW0("loading", "ResourceLoader::CancelWithError", this,
221 TRACE_EVENT_FLAG_FLOW_IN); 220 TRACE_EVENT_FLAG_FLOW_IN);
222 CancelRequestInternal(error_code, false); 221 CancelRequestInternal(error_code, false);
223 } 222 }
224 223
225 void ResourceLoader::MarkAsTransferring( 224 void ResourceLoader::MarkAsTransferring(
226 const scoped_refptr<ResourceResponse>& response) { 225 const base::Closure& on_transfer_complete_callback) {
227 CHECK(IsResourceTypeFrame(GetRequestInfo()->GetResourceType())) 226 CHECK(IsResourceTypeFrame(GetRequestInfo()->GetResourceType()))
228 << "Can only transfer for navigations"; 227 << "Can only transfer for navigations";
228 DCHECK(response_.get());
229 is_transferring_ = true; 229 is_transferring_ = true;
230 transferring_response_ = response; 230 on_transfer_complete_ = on_transfer_complete_callback;
231 231
232 int child_id = GetRequestInfo()->GetChildID(); 232 int child_id = GetRequestInfo()->GetChildID();
233 AppCacheInterceptor::PrepareForCrossSiteTransfer(request(), child_id); 233 AppCacheInterceptor::PrepareForCrossSiteTransfer(request(), child_id);
234 ServiceWorkerRequestHandler* handler = 234 ServiceWorkerRequestHandler* handler =
235 ServiceWorkerRequestHandler::GetHandler(request()); 235 ServiceWorkerRequestHandler::GetHandler(request());
236 if (handler) 236 if (handler)
237 handler->PrepareForCrossSiteTransfer(child_id); 237 handler->PrepareForCrossSiteTransfer(child_id);
238 } 238 }
239 239
240 void ResourceLoader::CompleteTransfer() { 240 void ResourceLoader::CompleteTransfer() {
241 // Although CrossSiteResourceHandler defers at OnResponseStarted 241 // Although NavigationResourceThrottle defers at WillProcessResponse
242 // (DEFERRED_READ), it may be seeing a replay of events via 242 // (DEFERRED_READ), it may be seeing a replay of events via
243 // MimeTypeResourceHandler, and so the request itself is actually deferred 243 // MimeTypeResourceHandler, and so the request itself is actually deferred at
244 // at a later read stage. 244 // a later read stage.
245 DCHECK(DEFERRED_READ == deferred_stage_ || 245 DCHECK(DEFERRED_READ == deferred_stage_ ||
246 DEFERRED_RESPONSE_COMPLETE == deferred_stage_); 246 DEFERRED_RESPONSE_COMPLETE == deferred_stage_);
247 DCHECK(is_transferring_); 247 DCHECK(is_transferring_);
248 DCHECK(transferring_response_); 248 DCHECK(response_);
249 DCHECK(!on_transfer_complete_.is_null());
249 250
250 // In some cases, a process transfer doesn't really happen and the 251 // In some cases, a process transfer doesn't really happen and the
251 // request is resumed in the original process. Real transfers to a new process 252 // request is resumed in the original process. Real transfers to a new process
252 // are completed via ResourceDispatcherHostImpl::UpdateRequestForTransfer. 253 // are completed via ResourceDispatcherHostImpl::UpdateRequestForTransfer.
253 int child_id = GetRequestInfo()->GetChildID(); 254 int child_id = GetRequestInfo()->GetChildID();
254 AppCacheInterceptor::MaybeCompleteCrossSiteTransferInOldProcess( 255 AppCacheInterceptor::MaybeCompleteCrossSiteTransferInOldProcess(
255 request(), child_id); 256 request(), child_id);
256 ServiceWorkerRequestHandler* handler = 257 ServiceWorkerRequestHandler* handler =
257 ServiceWorkerRequestHandler::GetHandler(request()); 258 ServiceWorkerRequestHandler::GetHandler(request());
258 if (handler) 259 if (handler)
259 handler->MaybeCompleteCrossSiteTransferInOldProcess(child_id); 260 handler->MaybeCompleteCrossSiteTransferInOldProcess(child_id);
260 261
261 is_transferring_ = false; 262 is_transferring_ = false;
262 transferring_response_ = nullptr; 263 on_transfer_complete_.Run();
263 GetRequestInfo()->cross_site_handler()->ResumeResponse(); 264 on_transfer_complete_.Reset();
264 } 265 }
265 266
266 ResourceRequestInfoImpl* ResourceLoader::GetRequestInfo() { 267 ResourceRequestInfoImpl* ResourceLoader::GetRequestInfo() {
267 return ResourceRequestInfoImpl::ForRequest(request_.get()); 268 return ResourceRequestInfoImpl::ForRequest(request_.get());
268 } 269 }
269 270
270 void ResourceLoader::ClearLoginDelegate() { 271 void ResourceLoader::ClearLoginDelegate() {
271 login_delegate_ = NULL; 272 login_delegate_ = NULL;
272 } 273 }
273 274
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 // notification from the request, so we have to signal ourselves to finish 556 // notification from the request, so we have to signal ourselves to finish
556 // this request. 557 // this request.
557 base::ThreadTaskRunnerHandle::Get()->PostTask( 558 base::ThreadTaskRunnerHandle::Get()->PostTask(
558 FROM_HERE, base::Bind(&ResourceLoader::ResponseCompleted, 559 FROM_HERE, base::Bind(&ResourceLoader::ResponseCompleted,
559 weak_ptr_factory_.GetWeakPtr())); 560 weak_ptr_factory_.GetWeakPtr()));
560 } 561 }
561 } 562 }
562 563
563 void ResourceLoader::CompleteResponseStarted() { 564 void ResourceLoader::CompleteResponseStarted() {
564 ResourceRequestInfoImpl* info = GetRequestInfo(); 565 ResourceRequestInfoImpl* info = GetRequestInfo();
565 scoped_refptr<ResourceResponse> response = new ResourceResponse(); 566 response_ = new ResourceResponse();
566 PopulateResourceResponse(info, request_.get(), cert_store_, response.get()); 567 PopulateResourceResponse(info, request_.get(), cert_store_, response_.get());
567 568
568 delegate_->DidReceiveResponse(this); 569 delegate_->DidReceiveResponse(this);
569 570
570 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. 571 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed.
571 tracked_objects::ScopedTracker tracking_profile( 572 tracked_objects::ScopedTracker tracking_profile(
572 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseStarted()")); 573 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseStarted()"));
573 574
574 bool defer = false; 575 bool defer = false;
575 if (!handler_->OnResponseStarted(response.get(), &defer)) { 576 if (!handler_->OnResponseStarted(response_.get(), &defer)) {
576 Cancel(); 577 Cancel();
577 } else if (defer) { 578 } else if (defer) {
578 read_deferral_start_time_ = base::TimeTicks::Now(); 579 read_deferral_start_time_ = base::TimeTicks::Now();
579 deferred_stage_ = DEFERRED_READ; // Read first chunk when resumed. 580 deferred_stage_ = DEFERRED_READ; // Read first chunk when resumed.
580 } 581 }
581 } 582 }
582 583
583 void ResourceLoader::StartReading(bool is_continuation) { 584 void ResourceLoader::StartReading(bool is_continuation) {
584 int bytes_read = 0; 585 int bytes_read = 0;
585 ReadMore(&bytes_read); 586 ReadMore(&bytes_read);
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 } 755 }
755 756
756 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", status, STATUS_MAX); 757 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", status, STATUS_MAX);
757 } else if (request_->response_info().unused_since_prefetch) { 758 } else if (request_->response_info().unused_since_prefetch) {
758 TimeDelta total_time = base::TimeTicks::Now() - request_->creation_time(); 759 TimeDelta total_time = base::TimeTicks::Now() - request_->creation_time();
759 UMA_HISTOGRAM_TIMES("Net.Prefetch.TimeSpentOnPrefetchHit", total_time); 760 UMA_HISTOGRAM_TIMES("Net.Prefetch.TimeSpentOnPrefetchHit", total_time);
760 } 761 }
761 } 762 }
762 763
763 } // namespace content 764 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698