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

Side by Side Diff: content/child/web_url_loader_impl.cc

Issue 1366883002: [Reland] Post loading tasks on the appropriate WebFrameScheduler's queue (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added a clone method to WebTaskRunner which lets us solve the lifetime issue. Created 5 years, 2 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/child/web_url_loader_impl.h" 5 #include "content/child/web_url_loader_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/files/file_path.h" 12 #include "base/files/file_path.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_ptr.h"
15 #include "base/single_thread_task_runner.h" 15 #include "base/single_thread_task_runner.h"
16 #include "base/strings/string_util.h" 16 #include "base/strings/string_util.h"
17 #include "base/time/time.h" 17 #include "base/time/time.h"
18 #include "components/mime_util/mime_util.h" 18 #include "components/mime_util/mime_util.h"
19 #include "components/scheduler/child/web_task_runner_impl.h"
19 #include "content/child/child_thread_impl.h" 20 #include "content/child/child_thread_impl.h"
20 #include "content/child/ftp_directory_listing_response_delegate.h" 21 #include "content/child/ftp_directory_listing_response_delegate.h"
21 #include "content/child/multipart_response_delegate.h" 22 #include "content/child/multipart_response_delegate.h"
22 #include "content/child/request_extra_data.h" 23 #include "content/child/request_extra_data.h"
23 #include "content/child/request_info.h" 24 #include "content/child/request_info.h"
24 #include "content/child/resource_dispatcher.h" 25 #include "content/child/resource_dispatcher.h"
25 #include "content/child/shared_memory_data_consumer_handle.h" 26 #include "content/child/shared_memory_data_consumer_handle.h"
26 #include "content/child/sync_load_response.h" 27 #include "content/child/sync_load_response.h"
27 #include "content/child/web_url_request_util.h" 28 #include "content/child/web_url_request_util.h"
28 #include "content/child/weburlresponse_extradata_impl.h" 29 #include "content/child/weburlresponse_extradata_impl.h"
29 #include "content/common/resource_messages.h" 30 #include "content/common/resource_messages.h"
30 #include "content/common/resource_request_body.h" 31 #include "content/common/resource_request_body.h"
31 #include "content/common/service_worker/service_worker_types.h" 32 #include "content/common/service_worker/service_worker_types.h"
32 #include "content/common/ssl_status_serialization.h" 33 #include "content/common/ssl_status_serialization.h"
33 #include "content/public/child/fixed_received_data.h" 34 #include "content/public/child/fixed_received_data.h"
34 #include "content/public/child/request_peer.h" 35 #include "content/public/child/request_peer.h"
35 #include "content/public/common/content_switches.h" 36 #include "content/public/common/content_switches.h"
36 #include "net/base/data_url.h" 37 #include "net/base/data_url.h"
37 #include "net/base/filename_util.h" 38 #include "net/base/filename_util.h"
38 #include "net/base/net_errors.h" 39 #include "net/base/net_errors.h"
39 #include "net/http/http_response_headers.h" 40 #include "net/http/http_response_headers.h"
40 #include "net/http/http_util.h" 41 #include "net/http/http_util.h"
41 #include "net/ssl/ssl_cipher_suite_names.h" 42 #include "net/ssl/ssl_cipher_suite_names.h"
42 #include "net/ssl/ssl_connection_status_flags.h" 43 #include "net/ssl/ssl_connection_status_flags.h"
43 #include "net/url_request/url_request_data_job.h" 44 #include "net/url_request/url_request_data_job.h"
44 #include "third_party/WebKit/public/platform/WebHTTPLoadInfo.h" 45 #include "third_party/WebKit/public/platform/WebHTTPLoadInfo.h"
46 #include "third_party/WebKit/public/platform/WebTraceLocation.h"
45 #include "third_party/WebKit/public/platform/WebURL.h" 47 #include "third_party/WebKit/public/platform/WebURL.h"
46 #include "third_party/WebKit/public/platform/WebURLError.h" 48 #include "third_party/WebKit/public/platform/WebURLError.h"
47 #include "third_party/WebKit/public/platform/WebURLLoadTiming.h" 49 #include "third_party/WebKit/public/platform/WebURLLoadTiming.h"
48 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h" 50 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h"
49 #include "third_party/WebKit/public/platform/WebURLRequest.h" 51 #include "third_party/WebKit/public/platform/WebURLRequest.h"
50 #include "third_party/WebKit/public/platform/WebURLResponse.h" 52 #include "third_party/WebKit/public/platform/WebURLResponse.h"
51 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" 53 #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
52 54
53 using base::Time; 55 using base::Time;
54 using base::TimeTicks; 56 using base::TimeTicks;
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 // WebURLLoaderImpl::Context -------------------------------------------------- 249 // WebURLLoaderImpl::Context --------------------------------------------------
248 250
249 // This inner class exists since the WebURLLoader may be deleted while inside a 251 // This inner class exists since the WebURLLoader may be deleted while inside a
250 // call to WebURLLoaderClient. Refcounting is to keep the context from being 252 // call to WebURLLoaderClient. Refcounting is to keep the context from being
251 // deleted if it may have work to do after calling into the client. 253 // deleted if it may have work to do after calling into the client.
252 class WebURLLoaderImpl::Context : public base::RefCounted<Context>, 254 class WebURLLoaderImpl::Context : public base::RefCounted<Context>,
253 public RequestPeer { 255 public RequestPeer {
254 public: 256 public:
255 Context(WebURLLoaderImpl* loader, 257 Context(WebURLLoaderImpl* loader,
256 ResourceDispatcher* resource_dispatcher, 258 ResourceDispatcher* resource_dispatcher,
257 scoped_refptr<base::SingleThreadTaskRunner> task_runner); 259 blink::WebTaskRunner* task_runner);
Sami 2015/09/29 11:22:46 scoped_ptr here too?
alex clarke (OOO till 29th) 2015/09/29 16:10:36 Done.
258 260
259 WebURLLoaderClient* client() const { return client_; } 261 WebURLLoaderClient* client() const { return client_; }
260 void set_client(WebURLLoaderClient* client) { client_ = client; } 262 void set_client(WebURLLoaderClient* client) { client_ = client; }
261 263
262 void Cancel(); 264 void Cancel();
263 void SetDefersLoading(bool value); 265 void SetDefersLoading(bool value);
264 void DidChangePriority(WebURLRequest::Priority new_priority, 266 void DidChangePriority(WebURLRequest::Priority new_priority,
265 int intra_priority_value); 267 int intra_priority_value);
266 bool AttachThreadedDataReceiver( 268 bool AttachThreadedDataReceiver(
267 blink::WebThreadedDataReceiver* threaded_data_receiver); 269 blink::WebThreadedDataReceiver* threaded_data_receiver);
268 void Start(const WebURLRequest& request, 270 void Start(const WebURLRequest& request,
269 SyncLoadResponse* sync_load_response); 271 SyncLoadResponse* sync_load_response);
272 // Takes owbership of |task_runner|.
273 void SetWebTaskRunner(blink::WebTaskRunner* task_runner);
Sami 2015/09/29 11:22:46 Could this be a scoped_ptr? This would mean the ca
alex clarke (OOO till 29th) 2015/09/29 16:10:36 Done, but It already did call clone.
270 274
271 // RequestPeer methods: 275 // RequestPeer methods:
272 void OnUploadProgress(uint64 position, uint64 size) override; 276 void OnUploadProgress(uint64 position, uint64 size) override;
273 bool OnReceivedRedirect(const net::RedirectInfo& redirect_info, 277 bool OnReceivedRedirect(const net::RedirectInfo& redirect_info,
274 const ResourceResponseInfo& info) override; 278 const ResourceResponseInfo& info) override;
275 void OnReceivedResponse(const ResourceResponseInfo& info) override; 279 void OnReceivedResponse(const ResourceResponseInfo& info) override;
276 void OnDownloadedData(int len, int encoded_data_length) override; 280 void OnDownloadedData(int len, int encoded_data_length) override;
277 void OnReceivedData(scoped_ptr<ReceivedData> data) override; 281 void OnReceivedData(scoped_ptr<ReceivedData> data) override;
278 void OnReceivedCachedMetadata(const char* data, int len) override; 282 void OnReceivedCachedMetadata(const char* data, int len) override;
279 void OnCompletedRequest(int error_code, 283 void OnCompletedRequest(int error_code,
280 bool was_ignored_by_handler, 284 bool was_ignored_by_handler,
281 bool stale_copy_in_cache, 285 bool stale_copy_in_cache,
282 const std::string& security_info, 286 const std::string& security_info,
283 const base::TimeTicks& completion_time, 287 const base::TimeTicks& completion_time,
284 int64 total_transfer_size) override; 288 int64 total_transfer_size) override;
285 void OnReceivedCompletedResponse(const ResourceResponseInfo& info, 289 void OnReceivedCompletedResponse(const ResourceResponseInfo& info,
286 scoped_ptr<ReceivedData> data, 290 scoped_ptr<ReceivedData> data,
287 int error_code, 291 int error_code,
288 bool was_ignored_by_handler, 292 bool was_ignored_by_handler,
289 bool stale_copy_in_cache, 293 bool stale_copy_in_cache,
290 const std::string& security_info, 294 const std::string& security_info,
291 const base::TimeTicks& completion_time, 295 const base::TimeTicks& completion_time,
292 int64 total_transfer_size) override; 296 int64 total_transfer_size) override;
293 297
294 private: 298 private:
295 friend class base::RefCounted<Context>; 299 friend class base::RefCounted<Context>;
296 ~Context() override; 300 ~Context() override;
297 301
302 class HandleDataURLTask : public blink::WebTaskRunner::Task {
303 public:
304 explicit HandleDataURLTask(Context* context) : context_(context) {}
305
306 void run() override {
307 context_->HandleDataURL();
308 }
309
310 private:
311 scoped_refptr<Context> context_;
312 };
313
298 // Called when the body data stream is detached from the reader side. 314 // Called when the body data stream is detached from the reader side.
299 void CancelBodyStreaming(); 315 void CancelBodyStreaming();
300 // We can optimize the handling of data URLs in most cases. 316 // We can optimize the handling of data URLs in most cases.
301 bool CanHandleDataURLRequestLocally() const; 317 bool CanHandleDataURLRequestLocally() const;
302 void HandleDataURL(); 318 void HandleDataURL();
303 319
304 WebURLLoaderImpl* loader_; 320 WebURLLoaderImpl* loader_;
305 WebURLRequest request_; 321 WebURLRequest request_;
306 WebURLLoaderClient* client_; 322 WebURLLoaderClient* client_;
307 ResourceDispatcher* resource_dispatcher_; 323 ResourceDispatcher* resource_dispatcher_;
308 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 324 scoped_ptr<blink::WebTaskRunner> web_task_runner_;
309 WebReferrerPolicy referrer_policy_; 325 WebReferrerPolicy referrer_policy_;
310 scoped_ptr<FtpDirectoryListingResponseDelegate> ftp_listing_delegate_; 326 scoped_ptr<FtpDirectoryListingResponseDelegate> ftp_listing_delegate_;
311 scoped_ptr<MultipartResponseDelegate> multipart_delegate_; 327 scoped_ptr<MultipartResponseDelegate> multipart_delegate_;
312 scoped_ptr<StreamOverrideParameters> stream_override_; 328 scoped_ptr<StreamOverrideParameters> stream_override_;
313 scoped_ptr<SharedMemoryDataConsumerHandle::Writer> body_stream_writer_; 329 scoped_ptr<SharedMemoryDataConsumerHandle::Writer> body_stream_writer_;
314 enum DeferState {NOT_DEFERRING, SHOULD_DEFER, DEFERRED_DATA}; 330 enum DeferState {NOT_DEFERRING, SHOULD_DEFER, DEFERRED_DATA};
315 DeferState defers_loading_; 331 DeferState defers_loading_;
316 int request_id_; 332 int request_id_;
317 }; 333 };
318 334
319 WebURLLoaderImpl::Context::Context( 335 WebURLLoaderImpl::Context::Context(
320 WebURLLoaderImpl* loader, 336 WebURLLoaderImpl* loader,
321 ResourceDispatcher* resource_dispatcher, 337 ResourceDispatcher* resource_dispatcher,
322 scoped_refptr<base::SingleThreadTaskRunner> task_runner) 338 blink::WebTaskRunner* web_task_runner)
323 : loader_(loader), 339 : loader_(loader),
324 client_(NULL), 340 client_(NULL),
325 resource_dispatcher_(resource_dispatcher), 341 resource_dispatcher_(resource_dispatcher),
326 task_runner_(task_runner), 342 web_task_runner_(web_task_runner),
327 referrer_policy_(blink::WebReferrerPolicyDefault), 343 referrer_policy_(blink::WebReferrerPolicyDefault),
328 defers_loading_(NOT_DEFERRING), 344 defers_loading_(NOT_DEFERRING),
329 request_id_(-1) { 345 request_id_(-1) {
330 } 346 }
331 347
332 void WebURLLoaderImpl::Context::Cancel() { 348 void WebURLLoaderImpl::Context::Cancel() {
333 if (resource_dispatcher_ && // NULL in unittest. 349 if (resource_dispatcher_ && // NULL in unittest.
334 request_id_ != -1) { 350 request_id_ != -1) {
335 resource_dispatcher_->Cancel(request_id_); 351 resource_dispatcher_->Cancel(request_id_);
336 request_id_ = -1; 352 request_id_ = -1;
(...skipping 15 matching lines...) Expand all
352 loader_ = NULL; 368 loader_ = NULL;
353 } 369 }
354 370
355 void WebURLLoaderImpl::Context::SetDefersLoading(bool value) { 371 void WebURLLoaderImpl::Context::SetDefersLoading(bool value) {
356 if (request_id_ != -1) 372 if (request_id_ != -1)
357 resource_dispatcher_->SetDefersLoading(request_id_, value); 373 resource_dispatcher_->SetDefersLoading(request_id_, value);
358 if (value && defers_loading_ == NOT_DEFERRING) { 374 if (value && defers_loading_ == NOT_DEFERRING) {
359 defers_loading_ = SHOULD_DEFER; 375 defers_loading_ = SHOULD_DEFER;
360 } else if (!value && defers_loading_ != NOT_DEFERRING) { 376 } else if (!value && defers_loading_ != NOT_DEFERRING) {
361 if (defers_loading_ == DEFERRED_DATA) { 377 if (defers_loading_ == DEFERRED_DATA) {
362 task_runner_->PostTask(FROM_HERE, 378 web_task_runner_->postTask(
363 base::Bind(&Context::HandleDataURL, this)); 379 ::blink::WebTraceLocation(__FUNCTION__, __FILE__),
Sami 2015/09/29 11:22:46 Ditto about FROM_HERE
alex clarke (OOO till 29th) 2015/09/29 16:10:36 Done.
380 new HandleDataURLTask(this));
364 } 381 }
365 defers_loading_ = NOT_DEFERRING; 382 defers_loading_ = NOT_DEFERRING;
366 } 383 }
367 } 384 }
368 385
369 void WebURLLoaderImpl::Context::DidChangePriority( 386 void WebURLLoaderImpl::Context::DidChangePriority(
370 WebURLRequest::Priority new_priority, int intra_priority_value) { 387 WebURLRequest::Priority new_priority, int intra_priority_value) {
371 if (request_id_ != -1) { 388 if (request_id_ != -1) {
372 resource_dispatcher_->DidChangePriority( 389 resource_dispatcher_->DidChangePriority(
373 request_id_, 390 request_id_,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 } 428 }
412 429
413 if (CanHandleDataURLRequestLocally()) { 430 if (CanHandleDataURLRequestLocally()) {
414 if (sync_load_response) { 431 if (sync_load_response) {
415 // This is a sync load. Do the work now. 432 // This is a sync load. Do the work now.
416 sync_load_response->url = url; 433 sync_load_response->url = url;
417 sync_load_response->error_code = 434 sync_load_response->error_code =
418 GetInfoFromDataURL(sync_load_response->url, sync_load_response, 435 GetInfoFromDataURL(sync_load_response->url, sync_load_response,
419 &sync_load_response->data); 436 &sync_load_response->data);
420 } else { 437 } else {
421 task_runner_->PostTask(FROM_HERE, 438 web_task_runner_->postTask(
422 base::Bind(&Context::HandleDataURL, this)); 439 ::blink::WebTraceLocation(__FUNCTION__, __FILE__),
Sami 2015/09/29 11:22:47 Ditto.
alex clarke (OOO till 29th) 2015/09/29 16:10:36 Done.
440 new HandleDataURLTask(this));
423 } 441 }
424 return; 442 return;
425 } 443 }
426 444
427 // PlzNavigate: outside of tests, the only navigation requests going through 445 // PlzNavigate: outside of tests, the only navigation requests going through
428 // the WebURLLoader are the ones created by CommitNavigation. Several browser 446 // the WebURLLoader are the ones created by CommitNavigation. Several browser
429 // tests load HTML directly through a data url which will be handled by the 447 // tests load HTML directly through a data url which will be handled by the
430 // block above. 448 // block above.
431 DCHECK_IMPLIES(base::CommandLine::ForCurrentProcess()->HasSwitch( 449 DCHECK_IMPLIES(base::CommandLine::ForCurrentProcess()->HasSwitch(
432 switches::kEnableBrowserSideNavigation), 450 switches::kEnableBrowserSideNavigation),
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 request_info.fetch_credentials_mode = 493 request_info.fetch_credentials_mode =
476 GetFetchCredentialsModeForWebURLRequest(request); 494 GetFetchCredentialsModeForWebURLRequest(request);
477 request_info.fetch_redirect_mode = 495 request_info.fetch_redirect_mode =
478 GetFetchRedirectModeForWebURLRequest(request); 496 GetFetchRedirectModeForWebURLRequest(request);
479 request_info.fetch_request_context_type = 497 request_info.fetch_request_context_type =
480 GetRequestContextTypeForWebURLRequest(request); 498 GetRequestContextTypeForWebURLRequest(request);
481 request_info.fetch_frame_type = 499 request_info.fetch_frame_type =
482 GetRequestContextFrameTypeForWebURLRequest(request); 500 GetRequestContextFrameTypeForWebURLRequest(request);
483 request_info.extra_data = request.extraData(); 501 request_info.extra_data = request.extraData();
484 request_info.report_raw_headers = request.reportRawHeaders(); 502 request_info.report_raw_headers = request.reportRawHeaders();
503 request_info.loading_web_task_runner = web_task_runner_.get();
Sami 2015/09/29 11:22:46 nit: s/get/Pass/
alex clarke (OOO till 29th) 2015/09/29 16:10:36 Needs to be a clone().
485 504
486 scoped_refptr<ResourceRequestBody> request_body = 505 scoped_refptr<ResourceRequestBody> request_body =
487 GetRequestBodyForWebURLRequest(request).get(); 506 GetRequestBodyForWebURLRequest(request).get();
488 507
489 if (sync_load_response) { 508 if (sync_load_response) {
490 resource_dispatcher_->StartSync( 509 resource_dispatcher_->StartSync(
491 request_info, request_body.get(), sync_load_response); 510 request_info, request_body.get(), sync_load_response);
492 return; 511 return;
493 } 512 }
494 513
495 request_id_ = resource_dispatcher_->StartAsync( 514 request_id_ = resource_dispatcher_->StartAsync(
496 request_info, request_body.get(), this); 515 request_info, request_body.get(), this);
497 } 516 }
498 517
518 void WebURLLoaderImpl::Context::SetWebTaskRunner(
519 blink::WebTaskRunner* web_task_runner) {
520 web_task_runner_.reset(web_task_runner);
521 }
522
499 void WebURLLoaderImpl::Context::OnUploadProgress(uint64 position, uint64 size) { 523 void WebURLLoaderImpl::Context::OnUploadProgress(uint64 position, uint64 size) {
500 if (client_) 524 if (client_)
501 client_->didSendData(loader_, position, size); 525 client_->didSendData(loader_, position, size);
502 } 526 }
503 527
504 bool WebURLLoaderImpl::Context::OnReceivedRedirect( 528 bool WebURLLoaderImpl::Context::OnReceivedRedirect(
505 const net::RedirectInfo& redirect_info, 529 const net::RedirectInfo& redirect_info,
506 const ResourceResponseInfo& info) { 530 const ResourceResponseInfo& info) {
507 if (!client_) 531 if (!client_)
508 return false; 532 return false;
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 } 858 }
835 859
836 OnCompletedRequest(error_code, false, false, info.security_info, 860 OnCompletedRequest(error_code, false, false, info.security_info,
837 base::TimeTicks::Now(), 0); 861 base::TimeTicks::Now(), 0);
838 } 862 }
839 863
840 // WebURLLoaderImpl ----------------------------------------------------------- 864 // WebURLLoaderImpl -----------------------------------------------------------
841 865
842 WebURLLoaderImpl::WebURLLoaderImpl( 866 WebURLLoaderImpl::WebURLLoaderImpl(
843 ResourceDispatcher* resource_dispatcher, 867 ResourceDispatcher* resource_dispatcher,
844 scoped_refptr<base::SingleThreadTaskRunner> task_runner) 868 blink::WebTaskRunner* web_task_runner)
845 : context_(new Context(this, resource_dispatcher, task_runner)) { 869 : context_(new Context(this, resource_dispatcher, web_task_runner)) {
846 } 870 }
847 871
848 WebURLLoaderImpl::~WebURLLoaderImpl() { 872 WebURLLoaderImpl::~WebURLLoaderImpl() {
849 cancel(); 873 cancel();
850 } 874 }
851 875
852 void WebURLLoaderImpl::PopulateURLResponse(const GURL& url, 876 void WebURLLoaderImpl::PopulateURLResponse(const GURL& url,
853 const ResourceResponseInfo& info, 877 const ResourceResponseInfo& info,
854 WebURLResponse* response, 878 WebURLResponse* response,
855 bool report_security_info) { 879 bool report_security_info) {
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority, 1076 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority,
1053 int intra_priority_value) { 1077 int intra_priority_value) {
1054 context_->DidChangePriority(new_priority, intra_priority_value); 1078 context_->DidChangePriority(new_priority, intra_priority_value);
1055 } 1079 }
1056 1080
1057 bool WebURLLoaderImpl::attachThreadedDataReceiver( 1081 bool WebURLLoaderImpl::attachThreadedDataReceiver(
1058 blink::WebThreadedDataReceiver* threaded_data_receiver) { 1082 blink::WebThreadedDataReceiver* threaded_data_receiver) {
1059 return context_->AttachThreadedDataReceiver(threaded_data_receiver); 1083 return context_->AttachThreadedDataReceiver(threaded_data_receiver);
1060 } 1084 }
1061 1085
1086 void WebURLLoaderImpl::setLoadingTaskRunner(
1087 blink::WebTaskRunner* loading_task_runner) {
1088 // There's no guarantee on the lifetime of |loading_task_runner| so we take a
1089 // copy.
1090 context_->SetWebTaskRunner(loading_task_runner->clone());
1091 }
1092
1062 } // namespace content 1093 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698