Commit edc1d156 authored by Mark Pilgrim's avatar Mark Pilgrim Committed by Commit Bot

Migrate Rappor::LogUploader to SimpleURLLoader

Bug: 773295
Cq-Include-Trybots: luci.chromium.try:ios-simulator-full-configs;master.tryserver.chromium.mac:ios-simulator-cronet
Change-Id: I556353286e4ec97544aa9e51d77e102bf78d59ae
Reviewed-on: https://chromium-review.googlesource.com/1054478
Commit-Queue: Mark Pilgrim <pilgrim@chromium.org>
Reviewed-by: default avatarRohit Rao <rohitrao@chromium.org>
Reviewed-by: default avatarSylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarSteven Holte <holte@chromium.org>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#560684}
parent 67614c49
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "chrome/browser/metrics/chrome_metrics_service_client.h" #include "chrome/browser/metrics/chrome_metrics_service_client.h"
#include "chrome/browser/metrics/variations/chrome_variations_service_client.h" #include "chrome/browser/metrics/variations/chrome_variations_service_client.h"
#include "chrome/browser/metrics/variations/ui_string_overrider_factory.h" #include "chrome/browser/metrics/variations/ui_string_overrider_factory.h"
#include "chrome/browser/net/system_network_context_manager.h"
#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_otr_state.h" #include "chrome/browser/ui/browser_otr_state.h"
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
...@@ -27,6 +28,7 @@ ...@@ -27,6 +28,7 @@
#include "components/variations/variations_associated_data.h" #include "components/variations/variations_associated_data.h"
#include "components/version_info/version_info.h" #include "components/version_info/version_info.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
#include "chrome/browser/ui/android/tab_model/tab_model.h" #include "chrome/browser/ui/android/tab_model/tab_model.h"
...@@ -252,9 +254,10 @@ ChromeMetricsServicesManagerClient::CreateEntropyProvider() { ...@@ -252,9 +254,10 @@ ChromeMetricsServicesManagerClient::CreateEntropyProvider() {
return GetMetricsStateManager()->CreateDefaultEntropyProvider(); return GetMetricsStateManager()->CreateDefaultEntropyProvider();
} }
net::URLRequestContextGetter* scoped_refptr<network::SharedURLLoaderFactory>
ChromeMetricsServicesManagerClient::GetURLRequestContext() { ChromeMetricsServicesManagerClient::GetURLLoaderFactory() {
return g_browser_process->system_request_context(); return g_browser_process->system_network_context_manager()
->GetSharedURLLoaderFactory();
} }
bool ChromeMetricsServicesManagerClient::IsMetricsReportingEnabled() { bool ChromeMetricsServicesManagerClient::IsMetricsReportingEnabled() {
......
...@@ -79,7 +79,7 @@ class ChromeMetricsServicesManagerClient ...@@ -79,7 +79,7 @@ class ChromeMetricsServicesManagerClient
override; override;
std::unique_ptr<const base::FieldTrial::EntropyProvider> std::unique_ptr<const base::FieldTrial::EntropyProvider>
CreateEntropyProvider() override; CreateEntropyProvider() override;
net::URLRequestContextGetter* GetURLRequestContext() override; scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override;
bool IsMetricsReportingEnabled() override; bool IsMetricsReportingEnabled() override;
bool IsMetricsConsentGiven() override; bool IsMetricsConsentGiven() override;
......
...@@ -17,5 +17,6 @@ static_library("metrics_services_manager") { ...@@ -17,5 +17,6 @@ static_library("metrics_services_manager") {
"//components/ukm", "//components/ukm",
"//components/variations", "//components/variations",
"//components/variations/service", "//components/variations/service",
"//services/network/public/cpp:cpp",
] ]
} }
...@@ -5,4 +5,5 @@ include_rules = [ ...@@ -5,4 +5,5 @@ include_rules = [
"+components/rappor", "+components/rappor",
"+components/ukm", "+components/ukm",
"+components/variations", "+components/variations",
"+services/network",
] ]
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "components/rappor/rappor_service_impl.h" #include "components/rappor/rappor_service_impl.h"
#include "components/ukm/ukm_service.h" #include "components/ukm/ukm_service.h"
#include "components/variations/service/variations_service.h" #include "components/variations/service/variations_service.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
namespace metrics_services_manager { namespace metrics_services_manager {
...@@ -44,7 +45,7 @@ rappor::RapporServiceImpl* MetricsServicesManager::GetRapporServiceImpl() { ...@@ -44,7 +45,7 @@ rappor::RapporServiceImpl* MetricsServicesManager::GetRapporServiceImpl() {
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
if (!rappor_service_) { if (!rappor_service_) {
rappor_service_ = client_->CreateRapporServiceImpl(); rappor_service_ = client_->CreateRapporServiceImpl();
rappor_service_->Initialize(client_->GetURLRequestContext()); rappor_service_->Initialize(client_->GetURLLoaderFactory());
} }
return rappor_service_.get(); return rappor_service_.get();
} }
......
...@@ -14,8 +14,8 @@ namespace metrics { ...@@ -14,8 +14,8 @@ namespace metrics {
class MetricsServiceClient; class MetricsServiceClient;
} }
namespace net { namespace network {
class URLRequestContextGetter; class SharedURLLoaderFactory;
} }
namespace rappor { namespace rappor {
...@@ -44,9 +44,9 @@ class MetricsServicesManagerClient { ...@@ -44,9 +44,9 @@ class MetricsServicesManagerClient {
virtual std::unique_ptr<const base::FieldTrial::EntropyProvider> virtual std::unique_ptr<const base::FieldTrial::EntropyProvider>
CreateEntropyProvider() = 0; CreateEntropyProvider() = 0;
// Returns the URL request context in which the metrics services should // Returns the URL loader factory which the metrics services should use.
// operate. virtual scoped_refptr<network::SharedURLLoaderFactory>
virtual net::URLRequestContextGetter* GetURLRequestContext() = 0; GetURLLoaderFactory() = 0;
// Returns whether metrics reporting is enabled. // Returns whether metrics reporting is enabled.
virtual bool IsMetricsReportingEnabled() = 0; virtual bool IsMetricsReportingEnabled() = 0;
......
...@@ -43,6 +43,7 @@ static_library("rappor") { ...@@ -43,6 +43,7 @@ static_library("rappor") {
"//components/variations", "//components/variations",
"//crypto", "//crypto",
"//net", "//net",
"//services/network/public/cpp:cpp",
"//third_party/smhasher:cityhash", "//third_party/smhasher:cityhash",
] ]
} }
...@@ -104,6 +105,8 @@ source_set("unit_tests") { ...@@ -104,6 +105,8 @@ source_set("unit_tests") {
"//components/metrics", "//components/metrics",
"//components/prefs:test_support", "//components/prefs:test_support",
"//net:test_support", "//net:test_support",
"//services/network:test_support",
"//services/network/public/cpp:cpp",
"//testing/gtest", "//testing/gtest",
"//url", "//url",
] ]
......
...@@ -6,5 +6,6 @@ include_rules = [ ...@@ -6,5 +6,6 @@ include_rules = [
"+crypto", "+crypto",
"+mojo/public/cpp", "+mojo/public/cpp",
"+net", "+net",
"+services/network",
"+third_party/smhasher", "+third_party/smhasher",
] ]
...@@ -14,7 +14,9 @@ ...@@ -14,7 +14,9 @@
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/traffic_annotation/network_traffic_annotation.h" #include "net/traffic_annotation/network_traffic_annotation.h"
#include "net/url_request/url_fetcher.h" #include "services/network/public/cpp/resource_request.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/simple_url_loader.h"
namespace { namespace {
...@@ -51,17 +53,17 @@ void RecordDiscardReason(DiscardReason reason) { ...@@ -51,17 +53,17 @@ void RecordDiscardReason(DiscardReason reason) {
namespace rappor { namespace rappor {
LogUploader::LogUploader(const GURL& server_url, LogUploader::LogUploader(
const std::string& mime_type, const GURL& server_url,
net::URLRequestContextGetter* request_context) const std::string& mime_type,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
: server_url_(server_url), : server_url_(server_url),
mime_type_(mime_type), mime_type_(mime_type),
request_context_(request_context), url_loader_factory_(std::move(url_loader_factory)),
is_running_(false), is_running_(false),
has_callback_pending_(false), has_callback_pending_(false),
upload_interval_(base::TimeDelta::FromSeconds( upload_interval_(
kUnsentLogsIntervalSeconds)) { base::TimeDelta::FromSeconds(kUnsentLogsIntervalSeconds)) {}
}
LogUploader::~LogUploader() {} LogUploader::~LogUploader() {}
...@@ -140,18 +142,23 @@ void LogUploader::StartScheduledUpload() { ...@@ -140,18 +142,23 @@ void LogUploader::StartScheduledUpload() {
} }
} }
})"); })");
current_fetch_ = net::URLFetcher::Create(server_url_, net::URLFetcher::POST,
this, traffic_annotation);
data_use_measurement::DataUseUserData::AttachToFetcher(
current_fetch_.get(), data_use_measurement::DataUseUserData::RAPPOR);
current_fetch_->SetRequestContext(request_context_.get());
current_fetch_->SetUploadData(mime_type_, queued_logs_.front());
auto resource_request = std::make_unique<network::ResourceRequest>();
resource_request->url = server_url_;
// We already drop cookies server-side, but we might as well strip them out // We already drop cookies server-side, but we might as well strip them out
// client-side as well. // client-side as well.
current_fetch_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | resource_request->load_flags =
net::LOAD_DO_NOT_SEND_COOKIES); net::LOAD_DO_NOT_SAVE_COOKIES | net::LOAD_DO_NOT_SEND_COOKIES;
current_fetch_->Start(); resource_request->method = "POST";
simple_url_loader_ = network::SimpleURLLoader::Create(
std::move(resource_request), traffic_annotation);
simple_url_loader_->AttachStringForUpload(queued_logs_.front(), mime_type_);
// TODO re-add data use measurement once SimpleURLLoader supports it.
// ID=data_use_measurement::DataUseUserData::RAPPOR
simple_url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
url_loader_factory_.get(),
base::BindOnce(&LogUploader::OnSimpleLoaderComplete,
base::Unretained(this)));
} }
// static // static
...@@ -165,31 +172,27 @@ base::TimeDelta LogUploader::BackOffUploadInterval(base::TimeDelta interval) { ...@@ -165,31 +172,27 @@ base::TimeDelta LogUploader::BackOffUploadInterval(base::TimeDelta interval) {
return interval > max_interval ? max_interval : interval; return interval > max_interval ? max_interval : interval;
} }
void LogUploader::OnURLFetchComplete(const net::URLFetcher* source) { void LogUploader::OnSimpleLoaderComplete(
// We're not allowed to re-use the existing |URLFetcher|s, so free them here. std::unique_ptr<std::string> response_body) {
// Note however that |source| is aliased to the fetcher, so we should be int response_code = -1;
// careful not to delete it too early. if (simple_url_loader_->ResponseInfo() &&
DCHECK_EQ(current_fetch_.get(), source); simple_url_loader_->ResponseInfo()->headers) {
std::unique_ptr<net::URLFetcher> fetch(std::move(current_fetch_)); response_code =
simple_url_loader_->ResponseInfo()->headers->response_code();
const net::URLRequestStatus& request_status = source->GetStatus(); }
const int response_code = source->GetResponseCode();
DVLOG(2) << "Upload fetch complete response code: " << response_code; DVLOG(2) << "Upload fetch complete response code: " << response_code;
if (request_status.status() != net::URLRequestStatus::SUCCESS) { int net_error = simple_url_loader_->NetError();
base::UmaHistogramSparse("Rappor.FailedUploadErrorCode", if (net_error != net::OK && (response_code == -1 || response_code == 200)) {
-request_status.error()); base::UmaHistogramSparse("Rappor.FailedUploadErrorCode", -net_error);
DVLOG(1) << "Rappor server upload failed with error: " DVLOG(1) << "Rappor server upload failed with error: " << net_error << ": "
<< request_status.error() << ": " << net::ErrorToString(net_error);
<< net::ErrorToString(request_status.error());
DCHECK_EQ(-1, response_code);
} else { } else {
// Log a histogram to track response success vs. failure rates. // Log a histogram to track response success vs. failure rates.
base::UmaHistogramSparse("Rappor.UploadResponseCode", response_code); base::UmaHistogramSparse("Rappor.UploadResponseCode", response_code);
} }
const bool upload_succeeded = response_code == 200; const bool upload_succeeded = !!response_body;
// Determine whether this log should be retransmitted. // Determine whether this log should be retransmitted.
DiscardReason reason = NUM_DISCARD_REASONS; DiscardReason reason = NUM_DISCARD_REASONS;
......
...@@ -11,16 +11,16 @@ ...@@ -11,16 +11,16 @@
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/containers/queue.h" #include "base/containers/queue.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "components/rappor/log_uploader_interface.h" #include "components/rappor/log_uploader_interface.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "net/url_request/url_request_context_getter.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace net { namespace network {
class URLFetcher; class SimpleURLLoader;
} class SharedURLLoaderFactory;
} // namespace network
namespace rappor { namespace rappor {
...@@ -29,15 +29,15 @@ namespace rappor { ...@@ -29,15 +29,15 @@ namespace rappor {
// at a fixed interval after the successful upload of the previous logs. If an // at a fixed interval after the successful upload of the previous logs. If an
// upload fails, the uploader will keep retrying the upload with an exponential // upload fails, the uploader will keep retrying the upload with an exponential
// backoff interval. // backoff interval.
class LogUploader : public net::URLFetcherDelegate, class LogUploader : public LogUploaderInterface {
public LogUploaderInterface {
public: public:
// Constructor takes the |server_url| that logs should be uploaded to, the // Constructor takes the |server_url| that logs should be uploaded to, the
// |mime_type| of the uploaded data, and |request_context| to create uploads // |mime_type| of the uploaded data, and |request_context| to create uploads
// with. // with.
LogUploader(const GURL& server_url, LogUploader(
const std::string& mime_type, const GURL& server_url,
net::URLRequestContextGetter* request_context); const std::string& mime_type,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
// If the object is destroyed (or the program terminates) while logs are // If the object is destroyed (or the program terminates) while logs are
// queued, the logs are lost. // queued, the logs are lost.
...@@ -70,9 +70,8 @@ class LogUploader : public net::URLFetcherDelegate, ...@@ -70,9 +70,8 @@ class LogUploader : public net::URLFetcherDelegate,
// Drops excess logs until we are under the size limit. // Drops excess logs until we are under the size limit.
void DropExcessLogs(); void DropExcessLogs();
// Implements net::URLFetcherDelegate. Called after transmission completes // Called after transmission completes (whether successful or not).
// (whether successful or not). void OnSimpleLoaderComplete(std::unique_ptr<std::string> response_body);
void OnURLFetchComplete(const net::URLFetcher* source) override;
// Called when the upload is completed. // Called when the upload is completed.
void OnUploadFinished(bool server_is_healthy); void OnUploadFinished(bool server_is_healthy);
...@@ -83,14 +82,14 @@ class LogUploader : public net::URLFetcherDelegate, ...@@ -83,14 +82,14 @@ class LogUploader : public net::URLFetcherDelegate,
// The mime type to specify on uploaded logs. // The mime type to specify on uploaded logs.
const std::string mime_type_; const std::string mime_type_;
// The request context used to send uploads. // The URL loader factory used to send uploads.
scoped_refptr<net::URLRequestContextGetter> request_context_; scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
// True if the uploader is currently running. // True if the uploader is currently running.
bool is_running_; bool is_running_;
// The outstanding transmission that appears as a URL Fetch operation. // The outstanding transmission.
std::unique_ptr<net::URLFetcher> current_fetch_; std::unique_ptr<network::SimpleURLLoader> simple_url_loader_;
// The logs that still need to be uploaded. // The logs that still need to be uploaded.
base::queue<std::string> queued_logs_; base::queue<std::string> queued_logs_;
......
...@@ -9,8 +9,12 @@ ...@@ -9,8 +9,12 @@
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/test/scoped_task_environment.h" #include "base/test/scoped_task_environment.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "net/url_request/test_url_fetcher_factory.h" #include "net/http/http_response_headers.h"
#include "net/url_request/url_request_test_util.h" #include "net/http/http_status_code.h"
#include "net/http/http_util.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace rappor { namespace rappor {
...@@ -22,8 +26,9 @@ const char kTestMimeType[] = "text/plain"; ...@@ -22,8 +26,9 @@ const char kTestMimeType[] = "text/plain";
class TestLogUploader : public LogUploader { class TestLogUploader : public LogUploader {
public: public:
explicit TestLogUploader(net::URLRequestContextGetter* request_context) : explicit TestLogUploader(
LogUploader(GURL(kTestServerURL), kTestMimeType, request_context) { scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
: LogUploader(GURL(kTestServerURL), kTestMimeType, url_loader_factory) {
Start(); Start();
} }
...@@ -63,27 +68,23 @@ class LogUploaderTest : public testing::Test { ...@@ -63,27 +68,23 @@ class LogUploaderTest : public testing::Test {
LogUploaderTest() LogUploaderTest()
: scoped_task_environment_( : scoped_task_environment_(
base::test::ScopedTaskEnvironment::MainThreadType::UI), base::test::ScopedTaskEnvironment::MainThreadType::UI),
request_context_(new net::TestURLRequestContextGetter( test_shared_loader_factory_(
base::ThreadTaskRunnerHandle::Get())), base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
factory_(nullptr) {} &test_url_loader_factory_)) {}
protected: protected:
// Required for base::ThreadTaskRunnerHandle::Get(). // Required for base::ThreadTaskRunnerHandle::Get().
base::test::ScopedTaskEnvironment scoped_task_environment_; base::test::ScopedTaskEnvironment scoped_task_environment_;
scoped_refptr<net::TestURLRequestContextGetter> request_context_; network::TestURLLoaderFactory test_url_loader_factory_;
net::FakeURLFetcherFactory factory_; scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
private: private:
DISALLOW_COPY_AND_ASSIGN(LogUploaderTest); DISALLOW_COPY_AND_ASSIGN(LogUploaderTest);
}; };
TEST_F(LogUploaderTest, Success) { TEST_F(LogUploaderTest, Success) {
TestLogUploader uploader(request_context_.get()); TestLogUploader uploader(test_shared_loader_factory_);
test_url_loader_factory_.AddResponse(kTestServerURL, "");
factory_.SetFakeResponse(GURL(kTestServerURL),
std::string(),
net::HTTP_OK,
net::URLRequestStatus::SUCCESS);
uploader.QueueLog("log1"); uploader.QueueLog("log1");
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
...@@ -92,12 +93,15 @@ TEST_F(LogUploaderTest, Success) { ...@@ -92,12 +93,15 @@ TEST_F(LogUploaderTest, Success) {
} }
TEST_F(LogUploaderTest, Rejection) { TEST_F(LogUploaderTest, Rejection) {
TestLogUploader uploader(request_context_.get()); TestLogUploader uploader(test_shared_loader_factory_);
factory_.SetFakeResponse(GURL(kTestServerURL), network::ResourceResponseHead response_head;
std::string(), std::string headers("HTTP/1.1 400 Bad Request\nContent-type: text/html\n\n");
net::HTTP_BAD_REQUEST, response_head.headers = base::MakeRefCounted<net::HttpResponseHeaders>(
net::URLRequestStatus::SUCCESS); net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size()));
response_head.mime_type = "text/html";
test_url_loader_factory_.AddResponse(GURL(kTestServerURL), response_head, "",
network::URLLoaderCompletionStatus());
uploader.QueueLog("log1"); uploader.QueueLog("log1");
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
...@@ -106,12 +110,16 @@ TEST_F(LogUploaderTest, Rejection) { ...@@ -106,12 +110,16 @@ TEST_F(LogUploaderTest, Rejection) {
} }
TEST_F(LogUploaderTest, Failure) { TEST_F(LogUploaderTest, Failure) {
TestLogUploader uploader(request_context_.get()); TestLogUploader uploader(test_shared_loader_factory_);
factory_.SetFakeResponse(GURL(kTestServerURL), network::ResourceResponseHead response_head;
std::string(), std::string headers(
net::HTTP_INTERNAL_SERVER_ERROR, "HTTP/1.1 500 Internal Server Error\nContent-type: text/html\n\n");
net::URLRequestStatus::SUCCESS); response_head.headers = base::MakeRefCounted<net::HttpResponseHeaders>(
net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size()));
response_head.mime_type = "text/html";
test_url_loader_factory_.AddResponse(GURL(kTestServerURL), response_head, "",
network::URLLoaderCompletionStatus());
uploader.QueueLog("log1"); uploader.QueueLog("log1");
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
...@@ -129,10 +137,7 @@ TEST_F(LogUploaderTest, Failure) { ...@@ -129,10 +137,7 @@ TEST_F(LogUploaderTest, Failure) {
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
EXPECT_GT(uploader.last_interval_set(), error_interval); EXPECT_GT(uploader.last_interval_set(), error_interval);
factory_.SetFakeResponse(GURL(kTestServerURL), test_url_loader_factory_.AddResponse(kTestServerURL, "");
std::string(),
net::HTTP_OK,
net::URLRequestStatus::SUCCESS);
// A success should revert to base interval while queue is not empty. // A success should revert to base interval while queue is not empty.
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "components/rappor/rappor_pref_names.h" #include "components/rappor/rappor_pref_names.h"
#include "components/rappor/rappor_prefs.h" #include "components/rappor/rappor_prefs.h"
#include "components/variations/variations_associated_data.h" #include "components/variations/variations_associated_data.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
namespace rappor { namespace rappor {
...@@ -54,7 +55,7 @@ void RapporServiceImpl::AddDailyObserver( ...@@ -54,7 +55,7 @@ void RapporServiceImpl::AddDailyObserver(
} }
void RapporServiceImpl::Initialize( void RapporServiceImpl::Initialize(
net::URLRequestContextGetter* request_context) { scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(!IsInitialized()); DCHECK(!IsInitialized());
const GURL server_url = GURL(kDefaultServerUrl); const GURL server_url = GURL(kDefaultServerUrl);
...@@ -65,7 +66,7 @@ void RapporServiceImpl::Initialize( ...@@ -65,7 +66,7 @@ void RapporServiceImpl::Initialize(
} }
DVLOG(1) << "RapporServiceImpl reporting to " << server_url.spec(); DVLOG(1) << "RapporServiceImpl reporting to " << server_url.spec();
InitializeInternal( InitializeInternal(
std::make_unique<LogUploader>(server_url, kMimeType, request_context), std::make_unique<LogUploader>(server_url, kMimeType, url_loader_factory),
internal::LoadCohort(pref_service_), internal::LoadSecret(pref_service_)); internal::LoadCohort(pref_service_), internal::LoadSecret(pref_service_));
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/callback.h" #include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "components/metrics/daily_event.h" #include "components/metrics/daily_event.h"
...@@ -24,8 +25,8 @@ ...@@ -24,8 +25,8 @@
class PrefRegistrySimple; class PrefRegistrySimple;
class PrefService; class PrefService;
namespace net { namespace network {
class URLRequestContextGetter; class SharedURLLoaderFactory;
} }
namespace rappor { namespace rappor {
...@@ -52,7 +53,8 @@ class RapporServiceImpl : public RapporService { ...@@ -52,7 +53,8 @@ class RapporServiceImpl : public RapporService {
// Initializes the rappor service, including loading the cohort and secret // Initializes the rappor service, including loading the cohort and secret
// preferences from disk. // preferences from disk.
void Initialize(net::URLRequestContextGetter* context); void Initialize(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
// Updates the settings for metric recording and uploading. // Updates the settings for metric recording and uploading.
// The RapporServiceImpl must be initialized before this method is called. // The RapporServiceImpl must be initialized before this method is called.
......
...@@ -4,6 +4,7 @@ include_rules = [ ...@@ -4,6 +4,7 @@ include_rules = [
"+ios/third_party", "+ios/third_party",
"+net", "+net",
"+services/network/test", "+services/network/test",
"+services/network/public/cpp",
"+sql", "+sql",
"+ui/base", "+ui/base",
"+ui/gfx", "+ui/gfx",
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <string> #include <string>
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/scoped_refptr.h"
namespace component_updater { namespace component_updater {
class ComponentUpdateService; class ComponentUpdateService;
...@@ -38,6 +39,7 @@ class ChromeNetLog; ...@@ -38,6 +39,7 @@ class ChromeNetLog;
} }
namespace network { namespace network {
class SharedURLLoaderFactory;
namespace mojom { namespace mojom {
class NetworkContext; class NetworkContext;
} }
...@@ -90,6 +92,10 @@ class ApplicationContext { ...@@ -90,6 +92,10 @@ class ApplicationContext {
// Gets the URL request context associated with this application. // Gets the URL request context associated with this application.
virtual net::URLRequestContextGetter* GetSystemURLRequestContext() = 0; virtual net::URLRequestContextGetter* GetSystemURLRequestContext() = 0;
// Gets the shared URL loader factory associated with this application.
virtual scoped_refptr<network::SharedURLLoaderFactory>
GetSharedURLLoaderFactory() = 0;
// Gets the NetworkContext object associated with the same context as // Gets the NetworkContext object associated with the same context as
// GetSystemURLRequestContext(). // GetSystemURLRequestContext().
virtual network::mojom::NetworkContext* GetSystemNetworkContext() = 0; virtual network::mojom::NetworkContext* GetSystemNetworkContext() = 0;
......
...@@ -53,6 +53,8 @@ ...@@ -53,6 +53,8 @@
#include "net/socket/client_socket_pool_manager.h" #include "net/socket/client_socket_pool_manager.h"
#include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_context_getter.h"
#include "services/metrics/public/cpp/ukm_recorder.h" #include "services/metrics/public/cpp/ukm_recorder.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
ApplicationContextImpl::ApplicationContextImpl( ApplicationContextImpl::ApplicationContextImpl(
base::SequencedTaskRunner* local_state_task_runner, base::SequencedTaskRunner* local_state_task_runner,
...@@ -197,6 +199,23 @@ ApplicationContextImpl::GetSystemURLRequestContext() { ...@@ -197,6 +199,23 @@ ApplicationContextImpl::GetSystemURLRequestContext() {
return ios_chrome_io_thread_->system_url_request_context_getter(); return ios_chrome_io_thread_->system_url_request_context_getter();
} }
scoped_refptr<network::SharedURLLoaderFactory>
ApplicationContextImpl::GetSharedURLLoaderFactory() {
if (!url_loader_factory_) {
auto url_loader_factory_params =
network::mojom::URLLoaderFactoryParams::New();
url_loader_factory_params->process_id = network::mojom::kBrowserProcessId;
url_loader_factory_params->is_corb_enabled = false;
GetSystemNetworkContext()->CreateURLLoaderFactory(
mojo::MakeRequest(&url_loader_factory_),
std::move(url_loader_factory_params));
shared_url_loader_factory_ =
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
url_loader_factory_.get());
}
return shared_url_loader_factory_;
}
network::mojom::NetworkContext* network::mojom::NetworkContext*
ApplicationContextImpl::GetSystemNetworkContext() { ApplicationContextImpl::GetSystemNetworkContext() {
if (!network_context_) { if (!network_context_) {
......
...@@ -47,6 +47,8 @@ class ApplicationContextImpl : public ApplicationContext { ...@@ -47,6 +47,8 @@ class ApplicationContextImpl : public ApplicationContext {
bool WasLastShutdownClean() override; bool WasLastShutdownClean() override;
PrefService* GetLocalState() override; PrefService* GetLocalState() override;
net::URLRequestContextGetter* GetSystemURLRequestContext() override; net::URLRequestContextGetter* GetSystemURLRequestContext() override;
scoped_refptr<network::SharedURLLoaderFactory> GetSharedURLLoaderFactory()
override;
network::mojom::NetworkContext* GetSystemNetworkContext() override; network::mojom::NetworkContext* GetSystemNetworkContext() override;
const std::string& GetApplicationLocale() override; const std::string& GetApplicationLocale() override;
ios::ChromeBrowserStateManager* GetChromeBrowserStateManager() override; ios::ChromeBrowserStateManager* GetChromeBrowserStateManager() override;
...@@ -89,6 +91,8 @@ class ApplicationContextImpl : public ApplicationContext { ...@@ -89,6 +91,8 @@ class ApplicationContextImpl : public ApplicationContext {
const scoped_refptr<base::SequencedTaskRunner> local_state_task_runner_; const scoped_refptr<base::SequencedTaskRunner> local_state_task_runner_;
network::mojom::NetworkContextPtr network_context_; network::mojom::NetworkContextPtr network_context_;
network::mojom::URLLoaderFactoryPtr url_loader_factory_;
scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
// Created on the UI thread, destroyed on the IO thread. // Created on the UI thread, destroyed on the IO thread.
std::unique_ptr<web::NetworkContextOwner> network_context_owner_; std::unique_ptr<web::NetworkContextOwner> network_context_owner_;
......
...@@ -41,7 +41,7 @@ class IOSChromeMetricsServicesManagerClient ...@@ -41,7 +41,7 @@ class IOSChromeMetricsServicesManagerClient
override; override;
std::unique_ptr<const base::FieldTrial::EntropyProvider> std::unique_ptr<const base::FieldTrial::EntropyProvider>
CreateEntropyProvider() override; CreateEntropyProvider() override;
net::URLRequestContextGetter* GetURLRequestContext() override; scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override;
bool IsMetricsReportingEnabled() override; bool IsMetricsReportingEnabled() override;
bool IsMetricsConsentGiven() override; bool IsMetricsConsentGiven() override;
bool IsIncognitoSessionActive() override; bool IsIncognitoSessionActive() override;
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "ios/chrome/browser/tabs/tab_model_list.h" #include "ios/chrome/browser/tabs/tab_model_list.h"
#include "ios/chrome/browser/variations/ios_chrome_variations_service_client.h" #include "ios/chrome/browser/variations/ios_chrome_variations_service_client.h"
#include "ios/chrome/browser/variations/ios_ui_string_overrider_factory.h" #include "ios/chrome/browser/variations/ios_ui_string_overrider_factory.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
...@@ -89,9 +90,9 @@ IOSChromeMetricsServicesManagerClient::CreateEntropyProvider() { ...@@ -89,9 +90,9 @@ IOSChromeMetricsServicesManagerClient::CreateEntropyProvider() {
return GetMetricsStateManager()->CreateDefaultEntropyProvider(); return GetMetricsStateManager()->CreateDefaultEntropyProvider();
} }
net::URLRequestContextGetter* scoped_refptr<network::SharedURLLoaderFactory>
IOSChromeMetricsServicesManagerClient::GetURLRequestContext() { IOSChromeMetricsServicesManagerClient::GetURLLoaderFactory() {
return GetApplicationContext()->GetSystemURLRequestContext(); return GetApplicationContext()->GetSharedURLLoaderFactory();
} }
bool IOSChromeMetricsServicesManagerClient::IsMetricsReportingEnabled() { bool IOSChromeMetricsServicesManagerClient::IsMetricsReportingEnabled() {
......
...@@ -37,6 +37,8 @@ class TestingApplicationContext : public ApplicationContext { ...@@ -37,6 +37,8 @@ class TestingApplicationContext : public ApplicationContext {
PrefService* GetLocalState() override; PrefService* GetLocalState() override;
net::URLRequestContextGetter* GetSystemURLRequestContext() override; net::URLRequestContextGetter* GetSystemURLRequestContext() override;
scoped_refptr<network::SharedURLLoaderFactory> GetSharedURLLoaderFactory()
override;
network::mojom::NetworkContext* GetSystemNetworkContext() override; network::mojom::NetworkContext* GetSystemNetworkContext() override;
const std::string& GetApplicationLocale() override; const std::string& GetApplicationLocale() override;
ios::ChromeBrowserStateManager* GetChromeBrowserStateManager() override; ios::ChromeBrowserStateManager* GetChromeBrowserStateManager() override;
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "components/network_time/network_time_tracker.h" #include "components/network_time/network_time_tracker.h"
#import "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
#include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_context_getter.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
...@@ -86,6 +87,13 @@ TestingApplicationContext::GetSystemURLRequestContext() { ...@@ -86,6 +87,13 @@ TestingApplicationContext::GetSystemURLRequestContext() {
return nullptr; return nullptr;
} }
scoped_refptr<network::SharedURLLoaderFactory>
TestingApplicationContext::GetSharedURLLoaderFactory() {
DCHECK(thread_checker_.CalledOnValidThread());
NOTREACHED();
return nullptr;
}
network::mojom::NetworkContext* network::mojom::NetworkContext*
TestingApplicationContext::GetSystemNetworkContext() { TestingApplicationContext::GetSystemNetworkContext() {
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment