OLD | NEW |
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 "chrome/browser/profiles/profile_impl_io_data.h" | 5 #include "chrome/browser/profiles/profile_impl_io_data.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 #include "content/public/browser/storage_partition.h" | 53 #include "content/public/browser/storage_partition.h" |
54 #include "extensions/browser/extension_protocols.h" | 54 #include "extensions/browser/extension_protocols.h" |
55 #include "extensions/common/constants.h" | 55 #include "extensions/common/constants.h" |
56 #include "net/base/cache_type.h" | 56 #include "net/base/cache_type.h" |
57 #include "net/base/sdch_manager.h" | 57 #include "net/base/sdch_manager.h" |
58 #include "net/ftp/ftp_network_layer.h" | 58 #include "net/ftp/ftp_network_layer.h" |
59 #include "net/http/http_cache.h" | 59 #include "net/http/http_cache.h" |
60 #include "net/http/http_server_properties_manager.h" | 60 #include "net/http/http_server_properties_manager.h" |
61 #include "net/sdch/sdch_owner.h" | 61 #include "net/sdch/sdch_owner.h" |
62 #include "net/ssl/channel_id_service.h" | 62 #include "net/ssl/channel_id_service.h" |
| 63 #include "net/url_request/url_request_context_builder.h" |
| 64 #include "net/url_request/url_request_context_storage.h" |
63 #include "net/url_request/url_request_intercepting_job_factory.h" | 65 #include "net/url_request/url_request_intercepting_job_factory.h" |
64 #include "net/url_request/url_request_job_factory_impl.h" | 66 #include "net/url_request/url_request_job_factory_impl.h" |
65 #include "storage/browser/quota/special_storage_policy.h" | 67 #include "storage/browser/quota/special_storage_policy.h" |
66 | 68 |
67 namespace { | 69 namespace { |
68 | 70 |
69 net::BackendType ChooseCacheBackendType() { | 71 net::BackendType ChooseCacheBackendType() { |
70 #if defined(OS_ANDROID) | 72 #if defined(OS_ANDROID) |
71 return net::CACHE_BACKEND_SIMPLE; | 73 return net::CACHE_BACKEND_SIMPLE; |
72 #else | 74 #else |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 DestroyResourceContext(); | 441 DestroyResourceContext(); |
440 | 442 |
441 if (media_request_context_) | 443 if (media_request_context_) |
442 media_request_context_->AssertNoURLRequests(); | 444 media_request_context_->AssertNoURLRequests(); |
443 } | 445 } |
444 | 446 |
445 void ProfileImplIOData::InitializeInternal( | 447 void ProfileImplIOData::InitializeInternal( |
446 scoped_ptr<ChromeNetworkDelegate> chrome_network_delegate, | 448 scoped_ptr<ChromeNetworkDelegate> chrome_network_delegate, |
447 ProfileParams* profile_params, | 449 ProfileParams* profile_params, |
448 content::ProtocolHandlerMap* protocol_handlers, | 450 content::ProtocolHandlerMap* protocol_handlers, |
449 content::URLRequestInterceptorScopedVector request_interceptors) const { | 451 content::URLRequestInterceptorScopedVector request_interceptors, |
| 452 net::URLRequestContextBuilder* context_builder) const { |
450 // Set up a persistent store for use by the network stack on the IO thread. | 453 // Set up a persistent store for use by the network stack on the IO thread. |
451 base::FilePath network_json_store_filepath( | 454 base::FilePath network_json_store_filepath( |
452 profile_path_.Append(chrome::kNetworkPersistentStateFilename)); | 455 profile_path_.Append(chrome::kNetworkPersistentStateFilename)); |
453 network_json_store_ = new JsonPrefStore( | 456 network_json_store_ = new JsonPrefStore( |
454 network_json_store_filepath, | 457 network_json_store_filepath, |
455 JsonPrefStore::GetTaskRunnerForFile(network_json_store_filepath, | 458 JsonPrefStore::GetTaskRunnerForFile(network_json_store_filepath, |
456 BrowserThread::GetBlockingPool()), | 459 BrowserThread::GetBlockingPool()), |
457 scoped_ptr<PrefFilter>()); | 460 scoped_ptr<PrefFilter>()); |
458 network_json_store_->ReadPrefsAsync(nullptr); | 461 network_json_store_->ReadPrefsAsync(nullptr); |
459 | 462 |
460 net::URLRequestContext* main_context = main_request_context(); | |
461 | |
462 IOThread* const io_thread = profile_params->io_thread; | 463 IOThread* const io_thread = profile_params->io_thread; |
463 IOThread::Globals* const io_thread_globals = io_thread->globals(); | 464 IOThread::Globals* const io_thread_globals = io_thread->globals(); |
464 | 465 |
465 chrome_network_delegate->set_predictor(predictor_.get()); | 466 ApplyProfileParamsToContext(context_builder); |
466 | |
467 if (domain_reliability_monitor_) { | |
468 domain_reliability::DomainReliabilityMonitor* monitor = | |
469 domain_reliability_monitor_.get(); | |
470 monitor->InitURLRequestContext(main_context); | |
471 monitor->AddBakedInConfigs(); | |
472 monitor->SetDiscardUploads(!GetMetricsEnabledStateOnIOThread()); | |
473 chrome_network_delegate->set_domain_reliability_monitor(monitor); | |
474 } | |
475 | |
476 ApplyProfileParamsToContext(main_context); | |
477 | 467 |
478 if (http_server_properties_manager_) | 468 if (http_server_properties_manager_) |
479 http_server_properties_manager_->InitializeOnNetworkThread(); | 469 http_server_properties_manager_->InitializeOnNetworkThread(); |
480 | 470 |
481 main_context->set_transport_security_state(transport_security_state()); | 471 context_builder->set_net_log_unowned(io_thread->net_log()); |
482 | 472 |
483 main_context->set_net_log(io_thread->net_log()); | 473 // The context receives a WeakPtr to the server properties. |
| 474 // TODO(wjmaclean): presumably this value gets copied to other contexts ... |
| 475 // it would be nice to avoid this. |
| 476 context_builder->set_http_server_properties(http_server_properties()); |
484 | 477 |
485 network_delegate_ = data_reduction_proxy_io_data()->CreateNetworkDelegate( | 478 context_builder->set_host_resolver_unowned( |
486 chrome_network_delegate.Pass(), true).Pass(); | |
487 | |
488 main_context->set_network_delegate(network_delegate_.get()); | |
489 | |
490 main_context->set_http_server_properties(http_server_properties()); | |
491 | |
492 main_context->set_host_resolver( | |
493 io_thread_globals->host_resolver.get()); | 479 io_thread_globals->host_resolver.get()); |
494 main_context->set_cert_transparency_verifier( | 480 context_builder->set_cert_transparency_verifier_unowned( |
495 io_thread_globals->cert_transparency_verifier.get()); | 481 io_thread_globals->cert_transparency_verifier.get()); |
496 main_context->set_http_auth_handler_factory( | 482 context_builder->set_http_auth_handler_factory_unowned( |
497 io_thread_globals->http_auth_handler_factory.get()); | 483 io_thread_globals->http_auth_handler_factory.get()); |
498 | 484 |
499 main_context->set_fraudulent_certificate_reporter( | 485 // TODO(wjmaclean): proxy_service() is currently built with all sorts of stuff |
500 fraudulent_certificate_reporter()); | 486 // from io_globals, so we'll treat it as an unowned pointer for now. |
501 | 487 context_builder->set_proxy_service_unowned(proxy_service()); |
502 main_context->set_proxy_service(proxy_service()); | |
503 | 488 |
504 scoped_refptr<net::CookieStore> cookie_store = NULL; | 489 scoped_refptr<net::CookieStore> cookie_store = NULL; |
505 net::ChannelIDService* channel_id_service = NULL; | 490 net::ChannelIDService* channel_id_service = NULL; |
506 | 491 |
507 // Set up cookie store. | 492 // Set up cookie store. |
508 if (!cookie_store.get()) { | 493 if (!cookie_store.get()) { |
509 DCHECK(!lazy_params_->cookie_path.empty()); | 494 DCHECK(!lazy_params_->cookie_path.empty()); |
510 | 495 |
511 content::CookieStoreConfig cookie_config( | 496 content::CookieStoreConfig cookie_config( |
512 lazy_params_->cookie_path, | 497 lazy_params_->cookie_path, |
513 lazy_params_->session_cookie_mode, | 498 lazy_params_->session_cookie_mode, |
514 lazy_params_->special_storage_policy.get(), | 499 lazy_params_->special_storage_policy.get(), |
515 profile_params->cookie_monster_delegate.get()); | 500 profile_params->cookie_monster_delegate.get()); |
516 cookie_config.crypto_delegate = | 501 cookie_config.crypto_delegate = |
517 chrome_browser_net::GetCookieCryptoDelegate(); | 502 chrome_browser_net::GetCookieCryptoDelegate(); |
518 cookie_store = content::CreateCookieStore(cookie_config); | 503 cookie_store = content::CreateCookieStore(cookie_config); |
519 } | 504 } |
520 | 505 |
521 main_context->set_cookie_store(cookie_store.get()); | |
522 | |
523 // Set up server bound cert service. | 506 // Set up server bound cert service. |
524 if (!channel_id_service) { | 507 if (!channel_id_service) { |
525 DCHECK(!lazy_params_->channel_id_path.empty()); | 508 DCHECK(!lazy_params_->channel_id_path.empty()); |
526 | 509 |
527 scoped_refptr<QuotaPolicyChannelIDStore> channel_id_db = | 510 scoped_refptr<QuotaPolicyChannelIDStore> channel_id_db = |
528 new QuotaPolicyChannelIDStore( | 511 new QuotaPolicyChannelIDStore( |
529 lazy_params_->channel_id_path, | 512 lazy_params_->channel_id_path, |
530 BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( | 513 BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( |
531 BrowserThread::GetBlockingPool()->GetSequenceToken()), | 514 BrowserThread::GetBlockingPool()->GetSequenceToken()), |
532 lazy_params_->special_storage_policy.get()); | 515 lazy_params_->special_storage_policy.get()); |
533 channel_id_service = new net::ChannelIDService( | 516 channel_id_service = new net::ChannelIDService( |
534 new net::DefaultChannelIDStore(channel_id_db.get()), | 517 new net::DefaultChannelIDStore(channel_id_db.get()), |
535 base::WorkerPool::GetTaskRunner(true)); | 518 base::WorkerPool::GetTaskRunner(true)); |
536 } | 519 } |
537 | 520 |
538 set_channel_id_service(channel_id_service); | 521 context_builder->SetCookieAndChannelIdStores( |
539 main_context->set_channel_id_service(channel_id_service); | 522 cookie_store.get(), make_scoped_ptr(channel_id_service)); |
540 | 523 |
541 scoped_ptr<net::HttpCache> main_cache; | |
542 { | 524 { |
543 // TODO(ttuttle): Remove ScopedTracker below once crbug.com/436671 is fixed. | 525 // TODO(ttuttle): Remove ScopedTracker below once crbug.com/436671 is fixed. |
544 tracked_objects::ScopedTracker tracking_profile( | 526 tracked_objects::ScopedTracker tracking_profile( |
545 FROM_HERE_WITH_EXPLICIT_FUNCTION("436671 HttpCache construction")); | 527 FROM_HERE_WITH_EXPLICIT_FUNCTION("436671 HttpCache construction")); |
546 net::HttpCache::DefaultBackend* main_backend = | 528 net::HttpCache::DefaultBackend* main_backend = |
547 new net::HttpCache::DefaultBackend( | 529 new net::HttpCache::DefaultBackend( |
548 net::DISK_CACHE, | 530 net::DISK_CACHE, |
549 ChooseCacheBackendType(), | 531 ChooseCacheBackendType(), |
550 lazy_params_->cache_path, | 532 lazy_params_->cache_path, |
551 lazy_params_->cache_max_size, | 533 lazy_params_->cache_max_size, |
552 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); | 534 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); |
553 main_cache = CreateMainHttpFactory(profile_params, main_backend); | 535 context_builder->set_http_transaction_factory_factory( |
| 536 new ProfileIOData::HttpTransactionFactoryDelegate(this, profile_params, |
| 537 main_backend)); |
554 } | 538 } |
555 | 539 |
556 main_http_factory_.reset(main_cache.release()); | |
557 main_context->set_http_transaction_factory(main_http_factory_.get()); | |
558 | |
559 #if !defined(DISABLE_FTP_SUPPORT) | 540 #if !defined(DISABLE_FTP_SUPPORT) |
| 541 // The host_resolver used here should be the same one used for the main |
| 542 // URLResourceContext. |
560 ftp_factory_.reset( | 543 ftp_factory_.reset( |
561 new net::FtpNetworkLayer(io_thread_globals->host_resolver.get())); | 544 new net::FtpNetworkLayer(io_thread_globals->host_resolver.get())); |
562 #endif // !defined(DISABLE_FTP_SUPPORT) | 545 #endif // !defined(DISABLE_FTP_SUPPORT) |
563 | 546 |
| 547 chrome_network_delegate->set_predictor(predictor_.get()); |
| 548 |
564 scoped_ptr<net::URLRequestJobFactoryImpl> main_job_factory( | 549 scoped_ptr<net::URLRequestJobFactoryImpl> main_job_factory( |
565 new net::URLRequestJobFactoryImpl()); | 550 new net::URLRequestJobFactoryImpl()); |
566 InstallProtocolHandlers(main_job_factory.get(), protocol_handlers); | 551 InstallProtocolHandlers(main_job_factory.get(), protocol_handlers); |
567 | 552 |
568 // The data reduction proxy interceptor should be as close to the network | 553 // The data reduction proxy interceptor should be as close to the network |
569 // as possible. | 554 // as possible. |
570 request_interceptors.insert( | 555 request_interceptors.insert( |
571 request_interceptors.begin(), | 556 request_interceptors.begin(), |
572 data_reduction_proxy_io_data()->CreateInterceptor().release()); | 557 data_reduction_proxy_io_data()->CreateInterceptor().release()); |
573 main_job_factory_ = SetUpJobFactoryDefaults( | 558 scoped_ptr<net::NetworkDelegate> network_delegate = |
| 559 data_reduction_proxy_io_data()->CreateNetworkDelegate( |
| 560 chrome_network_delegate.Pass(), true); |
| 561 |
| 562 context_builder->set_job_factory(SetUpJobFactoryDefaults( |
574 main_job_factory.Pass(), | 563 main_job_factory.Pass(), |
575 request_interceptors.Pass(), | 564 request_interceptors.Pass(), |
576 profile_params->protocol_handler_interceptor.Pass(), | 565 profile_params->protocol_handler_interceptor.Pass(), |
577 main_context->network_delegate(), | 566 network_delegate.get(), |
578 ftp_factory_.get()); | 567 ftp_factory_.get()).Pass()); |
579 main_context->set_job_factory(main_job_factory_.get()); | 568 // TODO(wjmaclean): make this Pass(), not release(). |
580 main_context->set_network_quality_estimator( | 569 context_builder->set_network_delegate(network_delegate.release()); |
| 570 context_builder->set_network_quality_estimator_unowned( |
581 io_thread_globals->network_quality_estimator.get()); | 571 io_thread_globals->network_quality_estimator.get()); |
582 | 572 |
583 #if defined(ENABLE_EXTENSIONS) | 573 #if defined(ENABLE_EXTENSIONS) |
| 574 // This call initializes the extensions URLRequestContext *independently* of |
| 575 // the, as-yet unbuilt, main URLRequestContext. If that ever changes, then |
| 576 // this should not be called in this function. |
584 InitializeExtensionsRequestContext(profile_params); | 577 InitializeExtensionsRequestContext(profile_params); |
585 #endif | 578 #endif |
586 | 579 |
587 // Setup SDCH for this profile. | 580 // Start setup of SDCH for this profile. |
588 sdch_manager_.reset(new net::SdchManager); | 581 context_builder->set_sdch_manager(new net::SdchManager); |
589 sdch_policy_.reset(new net::SdchOwner(sdch_manager_.get(), main_context)); | 582 } |
590 main_context->set_sdch_manager(sdch_manager_.get()); | 583 |
| 584 void ProfileImplIOData::InitPostContextSetup( |
| 585 ChromeNetworkDelegate* chrome_network_delegate) const { |
| 586 net::URLRequestContext* main_context = main_request_context(); |
| 587 |
| 588 if (domain_reliability_monitor_) { |
| 589 domain_reliability::DomainReliabilityMonitor* monitor = |
| 590 domain_reliability_monitor_.get(); |
| 591 monitor->InitURLRequestContext(main_context); |
| 592 monitor->AddBakedInConfigs(); |
| 593 monitor->SetDiscardUploads(!GetMetricsEnabledStateOnIOThread()); |
| 594 chrome_network_delegate->set_domain_reliability_monitor(monitor); |
| 595 } |
| 596 |
| 597 // Finish setup of SDCH for this profile. |
| 598 sdch_policy_.reset( |
| 599 new net::SdchOwner(main_context->sdch_manager(), main_context)); |
591 if (ShouldUseSdchPersistence()) { | 600 if (ShouldUseSdchPersistence()) { |
592 sdch_policy_->EnablePersistentStorage(network_json_store_.get()); | 601 sdch_policy_->EnablePersistentStorage(network_json_store_.get()); |
593 } | 602 } |
594 | 603 |
595 // Create a media request context based on the main context, but using a | 604 // Create a media request context based on the main context, but using a |
596 // media cache. It shares the same job factory as the main context. | 605 // media cache. It shares the same job factory as the main context. |
597 StoragePartitionDescriptor details(profile_path_, false); | 606 StoragePartitionDescriptor details(profile_path_, false); |
598 media_request_context_.reset(InitializeMediaRequestContext(main_context, | 607 media_request_context_.reset(InitializeMediaRequestContext(main_context, |
599 details)); | 608 details)); |
600 | 609 |
| 610 // lazy_params_ are last used in InitializeMediaRequestContext(). |
601 lazy_params_.reset(); | 611 lazy_params_.reset(); |
602 } | 612 } |
603 | 613 |
604 void ProfileImplIOData:: | 614 void ProfileImplIOData:: |
605 InitializeExtensionsRequestContext(ProfileParams* profile_params) const { | 615 InitializeExtensionsRequestContext(ProfileParams* profile_params) const { |
606 net::URLRequestContext* extensions_context = extensions_request_context(); | 616 net::URLRequestContext* extensions_context = extensions_request_context(); |
607 IOThread* const io_thread = profile_params->io_thread; | 617 IOThread* const io_thread = profile_params->io_thread; |
608 ApplyProfileParamsToContext(extensions_context); | 618 ApplyProfileParamsToContext(extensions_context); |
609 | 619 |
610 extensions_context->set_transport_security_state(transport_security_state()); | 620 extensions_context->set_transport_security_state(transport_security_state()); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 if (partition_descriptor.in_memory) { | 676 if (partition_descriptor.in_memory) { |
667 app_backend = net::HttpCache::DefaultBackend::InMemory(0); | 677 app_backend = net::HttpCache::DefaultBackend::InMemory(0); |
668 } else { | 678 } else { |
669 app_backend = new net::HttpCache::DefaultBackend( | 679 app_backend = new net::HttpCache::DefaultBackend( |
670 net::DISK_CACHE, | 680 net::DISK_CACHE, |
671 ChooseCacheBackendType(), | 681 ChooseCacheBackendType(), |
672 cache_path, | 682 cache_path, |
673 app_cache_max_size_, | 683 app_cache_max_size_, |
674 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); | 684 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); |
675 } | 685 } |
| 686 DCHECK(main_context->storage()); |
676 net::HttpNetworkSession* main_network_session = | 687 net::HttpNetworkSession* main_network_session = |
677 main_http_factory_->GetSession(); | 688 main_context->storage()->http_transaction_factory()->GetSession(); |
678 scoped_ptr<net::HttpCache> app_http_cache = | 689 scoped_ptr<net::HttpCache> app_http_cache = |
679 CreateHttpFactory(main_network_session, app_backend); | 690 CreateHttpFactory(main_network_session, app_backend); |
680 | 691 |
681 scoped_refptr<net::CookieStore> cookie_store = NULL; | 692 scoped_refptr<net::CookieStore> cookie_store = NULL; |
682 if (partition_descriptor.in_memory) { | 693 if (partition_descriptor.in_memory) { |
683 cookie_store = content::CreateCookieStore(content::CookieStoreConfig()); | 694 cookie_store = content::CreateCookieStore(content::CookieStoreConfig()); |
684 } | 695 } |
685 | 696 |
686 // Use an app-specific cookie store. | 697 // Use an app-specific cookie store. |
687 if (!cookie_store.get()) { | 698 if (!cookie_store.get()) { |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
749 } | 760 } |
750 | 761 |
751 // Use a separate HTTP disk cache for isolated apps. | 762 // Use a separate HTTP disk cache for isolated apps. |
752 net::HttpCache::BackendFactory* media_backend = | 763 net::HttpCache::BackendFactory* media_backend = |
753 new net::HttpCache::DefaultBackend( | 764 new net::HttpCache::DefaultBackend( |
754 net::MEDIA_CACHE, | 765 net::MEDIA_CACHE, |
755 ChooseCacheBackendType(), | 766 ChooseCacheBackendType(), |
756 cache_path, | 767 cache_path, |
757 cache_max_size, | 768 cache_max_size, |
758 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); | 769 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::CACHE)); |
| 770 DCHECK(original_context->storage()); |
759 net::HttpNetworkSession* main_network_session = | 771 net::HttpNetworkSession* main_network_session = |
760 main_http_factory_->GetSession(); | 772 original_context->storage()->http_transaction_factory()->GetSession(); |
761 scoped_ptr<net::HttpCache> media_http_cache = | 773 scoped_ptr<net::HttpCache> media_http_cache = |
762 CreateHttpFactory(main_network_session, media_backend); | 774 CreateHttpFactory(main_network_session, media_backend); |
763 | 775 |
764 // Transfer ownership of the cache to MediaRequestContext. | 776 // Transfer ownership of the cache to MediaRequestContext. |
765 context->SetHttpTransactionFactory(media_http_cache.Pass()); | 777 context->SetHttpTransactionFactory(media_http_cache.Pass()); |
766 | 778 |
767 // Note that we do not create a new URLRequestJobFactory because | 779 // Note that we do not create a new URLRequestJobFactory because |
768 // the media context should behave exactly like its parent context | 780 // the media context should behave exactly like its parent context |
769 // in all respects except for cache behavior on media subresources. | 781 // in all respects except for cache behavior on media subresources. |
770 // The CopyFrom() step above means that our media context will use | 782 // The CopyFrom() step above means that our media context will use |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
813 const base::Closure& completion) { | 825 const base::Closure& completion) { |
814 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 826 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
815 DCHECK(initialized()); | 827 DCHECK(initialized()); |
816 | 828 |
817 DCHECK(transport_security_state()); | 829 DCHECK(transport_security_state()); |
818 // Completes synchronously. | 830 // Completes synchronously. |
819 transport_security_state()->DeleteAllDynamicDataSince(time); | 831 transport_security_state()->DeleteAllDynamicDataSince(time); |
820 DCHECK(http_server_properties_manager_); | 832 DCHECK(http_server_properties_manager_); |
821 http_server_properties_manager_->Clear(completion); | 833 http_server_properties_manager_->Clear(completion); |
822 } | 834 } |
OLD | NEW |