Commit 1993375f authored by John Abd-El-Malek's avatar John Abd-El-Malek Committed by Commit Bot

Convert Incident Reporting to use SimpleURLLoader instead of URLFetcher.

Bug: 825242
Change-Id: Idf2df12e459f26b91aafbb7cb434e79f26850ae8
Reviewed-on: https://chromium-review.googlesource.com/989118
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: default avatarGreg Thompson <grt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#547720}
parent 8fff0785
specific_include_rules = {
".*test\.cc": [
"+services/network/test",
]
}
...@@ -14,7 +14,8 @@ ...@@ -14,7 +14,8 @@
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/http/http_status_code.h" #include "net/http/http_status_code.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/shared_url_loader_factory.h"
#include "services/network/public/cpp/simple_url_loader.h"
namespace safe_browsing { namespace safe_browsing {
...@@ -68,35 +69,33 @@ IncidentReportUploaderImpl::~IncidentReportUploaderImpl() { ...@@ -68,35 +69,33 @@ IncidentReportUploaderImpl::~IncidentReportUploaderImpl() {
std::unique_ptr<IncidentReportUploader> std::unique_ptr<IncidentReportUploader>
IncidentReportUploaderImpl::UploadReport( IncidentReportUploaderImpl::UploadReport(
const OnResultCallback& callback, const OnResultCallback& callback,
const scoped_refptr<net::URLRequestContextGetter>& request_context_getter, const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory,
const ClientIncidentReport& report) { const ClientIncidentReport& report) {
std::string post_data; std::string post_data;
if (!report.SerializeToString(&post_data)) if (!report.SerializeToString(&post_data))
return std::unique_ptr<IncidentReportUploader>(); return std::unique_ptr<IncidentReportUploader>();
return std::unique_ptr<IncidentReportUploader>(new IncidentReportUploaderImpl( return std::unique_ptr<IncidentReportUploader>(
callback, request_context_getter, post_data)); new IncidentReportUploaderImpl(callback, url_loader_factory, post_data));
} }
IncidentReportUploaderImpl::IncidentReportUploaderImpl( IncidentReportUploaderImpl::IncidentReportUploaderImpl(
const OnResultCallback& callback, const OnResultCallback& callback,
const scoped_refptr<net::URLRequestContextGetter>& request_context_getter, const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory,
const std::string& post_data) const std::string& post_data)
: IncidentReportUploader(callback), : IncidentReportUploader(callback) {
url_fetcher_( auto resource_request = std::make_unique<network::ResourceRequest>();
net::URLFetcher::Create(kTestUrlFetcherId, resource_request->url = GetIncidentReportUrl();
GetIncidentReportUrl(), resource_request->method = "POST";
net::URLFetcher::POST, resource_request->load_flags = net::LOAD_DISABLE_CACHE;
this, url_loader_ = network::SimpleURLLoader::Create(
kSafeBrowsingIncidentTrafficAnnotation)), std::move(resource_request), kSafeBrowsingIncidentTrafficAnnotation);
time_begin_(base::TimeTicks::Now()) { url_loader_->AttachStringForUpload(post_data, "application/octet-stream");
data_use_measurement::DataUseUserData::AttachToFetcher( url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
url_fetcher_.get(), data_use_measurement::DataUseUserData::SAFE_BROWSING); url_loader_factory.get(),
base::BindOnce(&IncidentReportUploaderImpl::OnURLLoaderComplete,
base::Unretained(this)));
time_begin_ = base::TimeTicks::Now();
UMA_HISTOGRAM_COUNTS("SBIRS.ReportPayloadSize", post_data.size()); UMA_HISTOGRAM_COUNTS("SBIRS.ReportPayloadSize", post_data.size());
url_fetcher_->SetLoadFlags(net::LOAD_DISABLE_CACHE);
url_fetcher_->SetAutomaticallyRetryOn5xx(false);
url_fetcher_->SetRequestContext(request_context_getter.get());
url_fetcher_->SetUploadData("application/octet-stream", post_data);
url_fetcher_->Start();
} }
// static // static
...@@ -108,23 +107,34 @@ GURL IncidentReportUploaderImpl::GetIncidentReportUrl() { ...@@ -108,23 +107,34 @@ GURL IncidentReportUploaderImpl::GetIncidentReportUrl() {
return url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true)); return url.Resolve("?key=" + net::EscapeQueryParamValue(api_key, true));
} }
void IncidentReportUploaderImpl::OnURLFetchComplete( void IncidentReportUploaderImpl::OnURLLoaderComplete(
const net::URLFetcher* source) { std::unique_ptr<std::string> response_body) {
// Take ownership of the fetcher in this scope (source == url_fetcher_). // Take ownership of the loader in this scope.
std::unique_ptr<net::URLFetcher> url_fetcher(std::move(url_fetcher_)); std::unique_ptr<network::SimpleURLLoader> url_loader(std::move(url_loader_));
int response_code = 0;
if (url_loader->ResponseInfo() && url_loader->ResponseInfo()->headers)
response_code = url_loader->ResponseInfo()->headers->response_code();
std::string response_body_str;
if (response_body.get())
response_body_str = std::move(*response_body.get());
OnURLLoaderCompleteInternal(response_body_str, response_code,
url_loader->NetError());
}
void IncidentReportUploaderImpl::OnURLLoaderCompleteInternal(
const std::string& response_body,
int response_code,
int net_error) {
UMA_HISTOGRAM_TIMES("SBIRS.ReportUploadTime", UMA_HISTOGRAM_TIMES("SBIRS.ReportUploadTime",
base::TimeTicks::Now() - time_begin_); base::TimeTicks::Now() - time_begin_);
Result result = UPLOAD_REQUEST_FAILED; Result result = UPLOAD_REQUEST_FAILED;
std::unique_ptr<ClientIncidentResponse> response; std::unique_ptr<ClientIncidentResponse> response;
if (net_error == net::OK && response_code == net::HTTP_OK) {
if (source->GetStatus().is_success() &&
source->GetResponseCode() == net::HTTP_OK) {
std::string data;
source->GetResponseAsString(&data);
response.reset(new ClientIncidentResponse()); response.reset(new ClientIncidentResponse());
if (!response->ParseFromString(data)) { if (!response->ParseFromString(response_body)) {
response.reset(); response.reset();
result = UPLOAD_INVALID_RESPONSE; result = UPLOAD_INVALID_RESPONSE;
} else { } else {
......
...@@ -9,16 +9,16 @@ ...@@ -9,16 +9,16 @@
#include <string> #include <string>
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "chrome/browser/safe_browsing/incident_reporting/incident_report_uploader.h" #include "chrome/browser/safe_browsing/incident_reporting/incident_report_uploader.h"
#include "net/url_request/url_fetcher_delegate.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace net { namespace network {
class URLFetcher; class SharedURLLoaderFactory;
class URLRequestContextGetter; class SimpleURLLoader;
} // namespace net } // namespace network
namespace safe_browsing { namespace safe_browsing {
...@@ -28,8 +28,7 @@ class ClientIncidentReport; ...@@ -28,8 +28,7 @@ class ClientIncidentReport;
// method. The upload can be cancelled by deleting the returned instance. The // method. The upload can be cancelled by deleting the returned instance. The
// instance is no longer usable after the delegate is notified, and may safely // instance is no longer usable after the delegate is notified, and may safely
// be destroyed by the delegate. // be destroyed by the delegate.
class IncidentReportUploaderImpl : public IncidentReportUploader, class IncidentReportUploaderImpl : public IncidentReportUploader {
public net::URLFetcherDelegate {
public: public:
// The id associated with the URLFetcher, for use by tests. // The id associated with the URLFetcher, for use by tests.
static const int kTestUrlFetcherId; static const int kTestUrlFetcherId;
...@@ -41,24 +40,30 @@ class IncidentReportUploaderImpl : public IncidentReportUploader, ...@@ -41,24 +40,30 @@ class IncidentReportUploaderImpl : public IncidentReportUploader,
// for transmission, in which case the delegate is not notified. // for transmission, in which case the delegate is not notified.
static std::unique_ptr<IncidentReportUploader> UploadReport( static std::unique_ptr<IncidentReportUploader> UploadReport(
const OnResultCallback& callback, const OnResultCallback& callback,
const scoped_refptr<net::URLRequestContextGetter>& request_context_getter, const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory,
const ClientIncidentReport& report); const ClientIncidentReport& report);
private: private:
FRIEND_TEST_ALL_PREFIXES(IncidentReportUploaderImplTest, Success);
IncidentReportUploaderImpl( IncidentReportUploaderImpl(
const OnResultCallback& callback, const OnResultCallback& callback,
const scoped_refptr<net::URLRequestContextGetter>& request_context_getter, const scoped_refptr<network::SharedURLLoaderFactory>& url_loader_factory,
const std::string& post_data); const std::string& post_data);
// Returns the URL to which incident reports are to be sent. // Returns the URL to which incident reports are to be sent.
static GURL GetIncidentReportUrl(); static GURL GetIncidentReportUrl();
// net::URLFetcherDelegate methods. // Callback when SimpleURLLoader gets the response.
void OnURLFetchComplete(const net::URLFetcher* source) override; void OnURLLoaderComplete(std::unique_ptr<std::string> response_body);
void OnURLLoaderCompleteInternal(const std::string& response_body,
int response_code,
int net_error);
// The underlying URL fetcher. The instance is alive from construction through // The underlying URLLoader. The instance is alive from construction through
// OnURLFetchComplete. // OnURLLoaderComplete.
std::unique_ptr<net::URLFetcher> url_fetcher_; std::unique_ptr<network::SimpleURLLoader> url_loader_;
// The time at which the upload was initiated. // The time at which the upload was initiated.
base::TimeTicks time_begin_; base::TimeTicks time_begin_;
......
...@@ -7,21 +7,24 @@ ...@@ -7,21 +7,24 @@
#include <string> #include <string>
#include <utility> #include <utility>
#include "base/bind.h"
#include "base/test/test_simple_task_runner.h" #include "base/test/test_simple_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/safe_browsing/proto/csd.pb.h" #include "components/safe_browsing/proto/csd.pb.h"
#include "content/public/common/weak_wrapper_shared_url_loader_factory.h"
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/http/http_status_code.h" #include "net/http/http_status_code.h"
#include "net/url_request/test_url_fetcher_factory.h" #include "services/network/public/cpp/shared_url_loader_factory.h"
#include "net/url_request/url_request_context_getter.h" #include "services/network/test/test_url_loader_factory.h"
#include "net/url_request/url_request_status.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace safe_browsing {
class IncidentReportUploaderImplTest : public testing::Test { class IncidentReportUploaderImplTest : public testing::Test {
public: public:
// safe_browsing::IncidentReportUploader::OnResultCallback implementation. // safe_browsing::IncidentReportUploader::OnResultCallback implementation.
void OnReportUploadResult( void OnReportUploadResult(IncidentReportUploader::Result result,
safe_browsing::IncidentReportUploader::Result result, std::unique_ptr<ClientIncidentResponse> response) {
std::unique_ptr<safe_browsing::ClientIncidentResponse> response) {
result_ = result; result_ = result;
response_ = std::move(response); response_ = std::move(response);
} }
...@@ -29,43 +32,39 @@ class IncidentReportUploaderImplTest : public testing::Test { ...@@ -29,43 +32,39 @@ class IncidentReportUploaderImplTest : public testing::Test {
protected: protected:
IncidentReportUploaderImplTest() IncidentReportUploaderImplTest()
: task_runner_(new base::TestSimpleTaskRunner), : task_runner_(new base::TestSimpleTaskRunner),
result_(safe_browsing::IncidentReportUploader::UPLOAD_REQUEST_FAILED) {} handle_(task_runner_),
result_(IncidentReportUploader::UPLOAD_REQUEST_FAILED) {}
scoped_refptr<base::TestSimpleTaskRunner> task_runner_; scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
net::TestURLFetcherFactory url_fetcher_factory_; base::ThreadTaskRunnerHandle handle_;
safe_browsing::IncidentReportUploader::Result result_; IncidentReportUploader::Result result_;
std::unique_ptr<safe_browsing::ClientIncidentResponse> response_; std::unique_ptr<ClientIncidentResponse> response_;
}; };
TEST_F(IncidentReportUploaderImplTest, Success) { TEST_F(IncidentReportUploaderImplTest, Success) {
safe_browsing::ClientIncidentReport report; network::TestURLLoaderFactory test_url_loader_factory;
std::unique_ptr<safe_browsing::IncidentReportUploader> instance( auto url_loader_factory =
safe_browsing::IncidentReportUploaderImpl::UploadReport( base::MakeRefCounted<content::WeakWrapperSharedURLLoaderFactory>(
base::Bind(&IncidentReportUploaderImplTest::OnReportUploadResult, &test_url_loader_factory);
base::Unretained(this)),
NULL, report));
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(
safe_browsing::IncidentReportUploaderImpl::kTestUrlFetcherId);
ASSERT_NE(static_cast<net::TestURLFetcher*>(NULL), fetcher);
safe_browsing::ClientIncidentReport uploaded_report; ClientIncidentReport report;
auto instance(IncidentReportUploaderImpl::UploadReport(
base::Bind(&IncidentReportUploaderImplTest::OnReportUploadResult,
base::Unretained(this)),
url_loader_factory, report));
EXPECT_EQ(net::LOAD_DISABLE_CACHE, fetcher->GetLoadFlags());
EXPECT_TRUE(uploaded_report.ParseFromString(fetcher->upload_data()));
fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0));
fetcher->set_response_code(net::HTTP_OK);
std::string response; std::string response;
safe_browsing::ClientIncidentResponse().SerializeToString(&response); ClientIncidentResponse().SerializeToString(&response);
fetcher->SetResponseString(response);
fetcher->delegate()->OnURLFetchComplete(fetcher); static_cast<IncidentReportUploaderImpl*>(instance.get())
->OnURLLoaderCompleteInternal(response, net::HTTP_OK, net::OK);
EXPECT_EQ(safe_browsing::IncidentReportUploader::UPLOAD_SUCCESS, result_); EXPECT_EQ(IncidentReportUploader::UPLOAD_SUCCESS, result_);
EXPECT_TRUE(response_); EXPECT_TRUE(response_);
} }
} // namespace safe_browsing
// TODO(grt): // TODO(grt):
// bad status/response code // bad status/response code
// confirm data in request is in upload test // confirm data in request is in upload test
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/download_item_utils.h" #include "content/public/browser/download_item_utils.h"
#include "content/public/browser/notification_service.h" #include "content/public/browser/notification_service.h"
#include "net/url_request/url_request_context_getter.h" #include "services/network/public/cpp/shared_url_loader_factory.h"
#include "services/preferences/public/mojom/tracked_preference_validation_delegate.mojom.h" #include "services/preferences/public/mojom/tracked_preference_validation_delegate.mojom.h"
namespace safe_browsing { namespace safe_browsing {
...@@ -319,9 +319,9 @@ bool IncidentReportingService::IsEnabledForProfile(Profile* profile) { ...@@ -319,9 +319,9 @@ bool IncidentReportingService::IsEnabledForProfile(Profile* profile) {
IncidentReportingService::IncidentReportingService( IncidentReportingService::IncidentReportingService(
SafeBrowsingService* safe_browsing_service) SafeBrowsingService* safe_browsing_service)
: url_request_context_getter_( : url_loader_factory_(safe_browsing_service
safe_browsing_service ? safe_browsing_service->url_request_context() ? safe_browsing_service->GetURLLoaderFactory()
: nullptr), : nullptr),
collect_environment_data_fn_(&CollectEnvironmentData), collect_environment_data_fn_(&CollectEnvironmentData),
environment_collection_task_runner_(GetBackgroundTaskRunner()), environment_collection_task_runner_(GetBackgroundTaskRunner()),
environment_collection_pending_(), environment_collection_pending_(),
...@@ -404,11 +404,9 @@ void IncidentReportingService::AddDownloadManager( ...@@ -404,11 +404,9 @@ void IncidentReportingService::AddDownloadManager(
IncidentReportingService::IncidentReportingService( IncidentReportingService::IncidentReportingService(
SafeBrowsingService* safe_browsing_service, SafeBrowsingService* safe_browsing_service,
const scoped_refptr<net::URLRequestContextGetter>& request_context_getter,
base::TimeDelta delayed_task_interval, base::TimeDelta delayed_task_interval,
const scoped_refptr<base::TaskRunner>& delayed_task_runner) const scoped_refptr<base::TaskRunner>& delayed_task_runner)
: url_request_context_getter_(request_context_getter), : collect_environment_data_fn_(&CollectEnvironmentData),
collect_environment_data_fn_(&CollectEnvironmentData),
environment_collection_task_runner_(GetBackgroundTaskRunner()), environment_collection_task_runner_(GetBackgroundTaskRunner()),
environment_collection_pending_(), environment_collection_pending_(),
collation_timeout_pending_(), collation_timeout_pending_(),
...@@ -509,10 +507,9 @@ IncidentReportingService::CreateDownloadFinder( ...@@ -509,10 +507,9 @@ IncidentReportingService::CreateDownloadFinder(
std::unique_ptr<IncidentReportUploader> std::unique_ptr<IncidentReportUploader>
IncidentReportingService::StartReportUpload( IncidentReportingService::StartReportUpload(
const IncidentReportUploader::OnResultCallback& callback, const IncidentReportUploader::OnResultCallback& callback,
const scoped_refptr<net::URLRequestContextGetter>& request_context_getter,
const ClientIncidentReport& report) { const ClientIncidentReport& report) {
return IncidentReportUploaderImpl::UploadReport( return IncidentReportUploaderImpl::UploadReport(callback, url_loader_factory_,
callback, request_context_getter, report); report);
} }
bool IncidentReportingService::IsProcessingReport() const { bool IncidentReportingService::IsProcessingReport() const {
...@@ -965,7 +962,7 @@ void IncidentReportingService::UploadReportIfUploadingEnabled( ...@@ -965,7 +962,7 @@ void IncidentReportingService::UploadReportIfUploadingEnabled(
context->uploader = StartReportUpload( context->uploader = StartReportUpload(
base::Bind(&IncidentReportingService::OnReportUploadResult, base::Bind(&IncidentReportingService::OnReportUploadResult,
weak_ptr_factory_.GetWeakPtr(), context), weak_ptr_factory_.GetWeakPtr(), context),
url_request_context_getter_, *context->report); *context->report);
if (!context->uploader) { if (!context->uploader) {
OnReportUploadResult(context, OnReportUploadResult(context,
IncidentReportUploader::UPLOAD_INVALID_REQUEST, IncidentReportUploader::UPLOAD_INVALID_REQUEST,
......
...@@ -40,8 +40,8 @@ class NotificationDetails; ...@@ -40,8 +40,8 @@ class NotificationDetails;
class NotificationSource; class NotificationSource;
} }
namespace net { namespace network {
class URLRequestContextGetter; class SharedURLLoaderFactory;
} }
namespace prefs { namespace prefs {
...@@ -116,7 +116,6 @@ class IncidentReportingService : public content::NotificationObserver { ...@@ -116,7 +116,6 @@ class IncidentReportingService : public content::NotificationObserver {
// be specified. // be specified.
IncidentReportingService( IncidentReportingService(
SafeBrowsingService* safe_browsing_service, SafeBrowsingService* safe_browsing_service,
const scoped_refptr<net::URLRequestContextGetter>& request_context_getter,
base::TimeDelta delayed_task_interval, base::TimeDelta delayed_task_interval,
const scoped_refptr<base::TaskRunner>& delayed_task_runner); const scoped_refptr<base::TaskRunner>& delayed_task_runner);
...@@ -148,7 +147,6 @@ class IncidentReportingService : public content::NotificationObserver { ...@@ -148,7 +147,6 @@ class IncidentReportingService : public content::NotificationObserver {
// Initiates an upload. Overridden by unit tests to provide a fake uploader. // Initiates an upload. Overridden by unit tests to provide a fake uploader.
virtual std::unique_ptr<IncidentReportUploader> StartReportUpload( virtual std::unique_ptr<IncidentReportUploader> StartReportUpload(
const IncidentReportUploader::OnResultCallback& callback, const IncidentReportUploader::OnResultCallback& callback,
const scoped_refptr<net::URLRequestContextGetter>& request_context_getter,
const ClientIncidentReport& report); const ClientIncidentReport& report);
// Returns true if a report is currently being processed. // Returns true if a report is currently being processed.
...@@ -271,8 +269,8 @@ class IncidentReportingService : public content::NotificationObserver { ...@@ -271,8 +269,8 @@ class IncidentReportingService : public content::NotificationObserver {
const content::NotificationSource& source, const content::NotificationSource& source,
const content::NotificationDetails& details) override; const content::NotificationDetails& details) override;
// Accessor for an URL context with which reports will be sent. // Accessor for an URLLoaderFactory with which reports will be sent.
scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
// A pointer to a function that collects environment data. The function will // A pointer to a function that collects environment data. The function will
// be run by |environment_collection_task_runner_|. This is ordinarily // be run by |environment_collection_task_runner_|. This is ordinarily
......
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
#include "components/sync_preferences/testing_pref_service_syncable.h" #include "components/sync_preferences/testing_pref_service_syncable.h"
#include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/test_browser_thread_bundle.h"
#include "extensions/browser/quota_service.h" #include "extensions/browser/quota_service.h"
#include "net/url_request/url_request_context_getter.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#if defined(OS_WIN) #if defined(OS_WIN)
...@@ -77,7 +76,6 @@ class IncidentReportingServiceTest : public testing::Test { ...@@ -77,7 +76,6 @@ class IncidentReportingServiceTest : public testing::Test {
const CreateDownloadFinderCallback& create_download_finder_callback, const CreateDownloadFinderCallback& create_download_finder_callback,
const StartUploadCallback& start_upload_callback) const StartUploadCallback& start_upload_callback)
: IncidentReportingService(nullptr, : IncidentReportingService(nullptr,
nullptr,
base::TimeDelta::FromMilliseconds(5), base::TimeDelta::FromMilliseconds(5),
task_runner), task_runner),
pre_profile_add_callback_(pre_profile_add_callback), pre_profile_add_callback_(pre_profile_add_callback),
...@@ -124,8 +122,6 @@ class IncidentReportingServiceTest : public testing::Test { ...@@ -124,8 +122,6 @@ class IncidentReportingServiceTest : public testing::Test {
std::unique_ptr<safe_browsing::IncidentReportUploader> StartReportUpload( std::unique_ptr<safe_browsing::IncidentReportUploader> StartReportUpload(
const safe_browsing::IncidentReportUploader::OnResultCallback& callback, const safe_browsing::IncidentReportUploader::OnResultCallback& callback,
const scoped_refptr<net::URLRequestContextGetter>&
request_context_getter,
const safe_browsing::ClientIncidentReport& report) override { const safe_browsing::ClientIncidentReport& report) override {
return start_upload_callback_.Run(callback, report); return start_upload_callback_.Run(callback, report);
} }
......
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