Commit c34903aa authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

Lazily create storage partition in FeedbackUploader

Don't create the storage partition until it's actually needed in
DispatchReport().

Bug: 1011889
Change-Id: I9da607cceb7504642731e8afdc987bd0f90aa497
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1845807
Commit-Queue: Evan Stade <estade@chromium.org>
Reviewed-by: default avatarAhmed Fakhry <afakhry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#704020}
parent 55ea6b26
...@@ -14,8 +14,6 @@ ...@@ -14,8 +14,6 @@
#include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h" #include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "net/url_request/url_fetcher.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
namespace feedback { namespace feedback {
...@@ -34,10 +32,9 @@ void QueueSingleReport(base::WeakPtr<feedback::FeedbackUploader> uploader, ...@@ -34,10 +32,9 @@ void QueueSingleReport(base::WeakPtr<feedback::FeedbackUploader> uploader,
} // namespace } // namespace
FeedbackUploaderChrome::FeedbackUploaderChrome( FeedbackUploaderChrome::FeedbackUploaderChrome(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
content::BrowserContext* context, content::BrowserContext* context,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: FeedbackUploader(url_loader_factory, context, task_runner) { : FeedbackUploader(context, task_runner) {
DCHECK(!context->IsOffTheRecord()); DCHECK(!context->IsOffTheRecord());
task_runner->PostTask( task_runner->PostTask(
......
...@@ -23,7 +23,6 @@ namespace feedback { ...@@ -23,7 +23,6 @@ namespace feedback {
class FeedbackUploaderChrome : public FeedbackUploader { class FeedbackUploaderChrome : public FeedbackUploader {
public: public:
FeedbackUploaderChrome( FeedbackUploaderChrome(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
content::BrowserContext* context, content::BrowserContext* context,
scoped_refptr<base::SingleThreadTaskRunner> task_runner); scoped_refptr<base::SingleThreadTaskRunner> task_runner);
~FeedbackUploaderChrome() override; ~FeedbackUploaderChrome() override;
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include "chrome/browser/feedback/feedback_uploader_chrome.h" #include "chrome/browser/feedback/feedback_uploader_chrome.h"
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "content/public/browser/storage_partition.h"
namespace feedback { namespace feedback {
...@@ -46,10 +45,7 @@ bool FeedbackUploaderFactoryChrome::ServiceIsNULLWhileTesting() const { ...@@ -46,10 +45,7 @@ bool FeedbackUploaderFactoryChrome::ServiceIsNULLWhileTesting() const {
KeyedService* FeedbackUploaderFactoryChrome::BuildServiceInstanceFor( KeyedService* FeedbackUploaderFactoryChrome::BuildServiceInstanceFor(
content::BrowserContext* context) const { content::BrowserContext* context) const {
return new FeedbackUploaderChrome( return new FeedbackUploaderChrome(context, task_runner_);
content::BrowserContext::GetDefaultStoragePartition(context)
->GetURLLoaderFactoryForBrowserProcess(),
context, task_runner_);
} }
} // namespace feedback } // namespace feedback
...@@ -34,10 +34,11 @@ class MockUploader : public FeedbackUploader { ...@@ -34,10 +34,11 @@ class MockUploader : public FeedbackUploader {
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
content::BrowserContext* context, content::BrowserContext* context,
base::OnceClosure on_report_sent) base::OnceClosure on_report_sent)
: FeedbackUploader(url_loader_factory, : FeedbackUploader(context,
context,
FeedbackUploaderFactory::CreateUploaderTaskRunner()), FeedbackUploaderFactory::CreateUploaderTaskRunner()),
on_report_sent_(std::move(on_report_sent)) {} on_report_sent_(std::move(on_report_sent)) {
set_url_loader_factory_for_test(url_loader_factory);
}
~MockUploader() override {} ~MockUploader() override {}
// feedback::FeedbackUploader: // feedback::FeedbackUploader:
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/url_request/url_fetcher.h" #include "net/url_request/url_fetcher.h"
#include "services/network/public/cpp/resource_request.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" #include "services/network/public/cpp/simple_url_loader.h"
namespace feedback { namespace feedback {
...@@ -60,11 +59,9 @@ GURL GetFeedbackPostGURL() { ...@@ -60,11 +59,9 @@ GURL GetFeedbackPostGURL() {
} // namespace } // namespace
FeedbackUploader::FeedbackUploader( FeedbackUploader::FeedbackUploader(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
content::BrowserContext* context, content::BrowserContext* context,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: url_loader_factory_(std::move(url_loader_factory)), : context_(context),
context_(context),
feedback_reports_path_(GetPathFromContext(context)), feedback_reports_path_(GetPathFromContext(context)),
task_runner_(task_runner), task_runner_(task_runner),
feedback_post_url_(GetFeedbackPostGURL()), feedback_post_url_(GetFeedbackPostGURL()),
...@@ -189,6 +186,15 @@ void FeedbackUploader::DispatchReport() { ...@@ -189,6 +186,15 @@ void FeedbackUploader::DispatchReport() {
kProtoBufMimeType); kProtoBufMimeType);
auto it = uploads_in_progress_.insert(uploads_in_progress_.begin(), auto it = uploads_in_progress_.insert(uploads_in_progress_.begin(),
std::move(simple_url_loader)); std::move(simple_url_loader));
// Creating the StoragePartitionImpl is costly, so don't do it until
// necessary (most importantly, avoid doing so during startup).
if (!url_loader_factory_) {
url_loader_factory_ =
content::BrowserContext::GetDefaultStoragePartition(context_)
->GetURLLoaderFactoryForBrowserProcess();
}
simple_url_loader_ptr->DownloadToStringOfUnboundedSizeUntilCrashAndDie( simple_url_loader_ptr->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
url_loader_factory_.get(), url_loader_factory_.get(),
base::BindOnce(&FeedbackUploader::OnDispatchComplete, base::BindOnce(&FeedbackUploader::OnDispatchComplete,
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "base/time/time.h" #include "base/time/time.h"
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "components/keyed_service/core/keyed_service.h" #include "components/keyed_service/core/keyed_service.h"
#include "services/network/public/cpp/shared_url_loader_factory.h"
#include "url/gurl.h" #include "url/gurl.h"
namespace content { namespace content {
...@@ -26,7 +27,6 @@ class BrowserContext; ...@@ -26,7 +27,6 @@ class BrowserContext;
namespace network { namespace network {
struct ResourceRequest; struct ResourceRequest;
class SimpleURLLoader; class SimpleURLLoader;
class SharedURLLoaderFactory;
} // namespace network } // namespace network
namespace feedback { namespace feedback {
...@@ -39,10 +39,8 @@ class FeedbackReport; ...@@ -39,10 +39,8 @@ class FeedbackReport;
class FeedbackUploader : public KeyedService, class FeedbackUploader : public KeyedService,
public base::SupportsWeakPtr<FeedbackUploader> { public base::SupportsWeakPtr<FeedbackUploader> {
public: public:
FeedbackUploader( FeedbackUploader(content::BrowserContext* context,
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, scoped_refptr<base::SingleThreadTaskRunner> task_runner);
content::BrowserContext* context,
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
~FeedbackUploader() override; ~FeedbackUploader() override;
static void SetMinimumRetryDelayForTesting(base::TimeDelta delay); static void SetMinimumRetryDelayForTesting(base::TimeDelta delay);
...@@ -67,6 +65,12 @@ class FeedbackUploader : public KeyedService, ...@@ -67,6 +65,12 @@ class FeedbackUploader : public KeyedService,
base::TimeDelta retry_delay() const { return retry_delay_; } base::TimeDelta retry_delay() const { return retry_delay_; }
// Tests inject a TestURLLoaderFactory so they can mock the network response.
void set_url_loader_factory_for_test(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
url_loader_factory_ = url_loader_factory;
}
protected: protected:
// Virtual to give implementers a chance to do work before the report is // Virtual to give implementers a chance to do work before the report is
// disptached. Implementers can then call // disptached. Implementers can then call
......
...@@ -92,8 +92,8 @@ TEST_F(FeedbackUploaderDispatchTest, VariationHeaders) { ...@@ -92,8 +92,8 @@ TEST_F(FeedbackUploaderDispatchTest, VariationHeaders) {
CreateFieldTrialWithId("Test", "Group1", 123); CreateFieldTrialWithId("Test", "Group1", 123);
FeedbackUploader uploader( FeedbackUploader uploader(
shared_url_loader_factory(), context(), context(), FeedbackUploaderFactory::CreateUploaderTaskRunner());
FeedbackUploaderFactory::CreateUploaderTaskRunner()); uploader.set_url_loader_factory_for_test(shared_url_loader_factory());
net::HttpRequestHeaders headers; net::HttpRequestHeaders headers;
test_url_loader_factory()->SetInterceptor( test_url_loader_factory()->SetInterceptor(
...@@ -110,8 +110,8 @@ TEST_F(FeedbackUploaderDispatchTest, VariationHeaders) { ...@@ -110,8 +110,8 @@ TEST_F(FeedbackUploaderDispatchTest, VariationHeaders) {
TEST_F(FeedbackUploaderDispatchTest, 204Response) { TEST_F(FeedbackUploaderDispatchTest, 204Response) {
FeedbackUploader::SetMinimumRetryDelayForTesting(kTestRetryDelay); FeedbackUploader::SetMinimumRetryDelayForTesting(kTestRetryDelay);
FeedbackUploader uploader( FeedbackUploader uploader(
shared_url_loader_factory(), context(), context(), FeedbackUploaderFactory::CreateUploaderTaskRunner());
FeedbackUploaderFactory::CreateUploaderTaskRunner()); uploader.set_url_loader_factory_for_test(shared_url_loader_factory());
EXPECT_EQ(kTestRetryDelay, uploader.retry_delay()); EXPECT_EQ(kTestRetryDelay, uploader.retry_delay());
// Successful reports should not introduce any retries, and should not // Successful reports should not introduce any retries, and should not
...@@ -133,8 +133,8 @@ TEST_F(FeedbackUploaderDispatchTest, 204Response) { ...@@ -133,8 +133,8 @@ TEST_F(FeedbackUploaderDispatchTest, 204Response) {
TEST_F(FeedbackUploaderDispatchTest, 400Response) { TEST_F(FeedbackUploaderDispatchTest, 400Response) {
FeedbackUploader::SetMinimumRetryDelayForTesting(kTestRetryDelay); FeedbackUploader::SetMinimumRetryDelayForTesting(kTestRetryDelay);
FeedbackUploader uploader( FeedbackUploader uploader(
shared_url_loader_factory(), context(), context(), FeedbackUploaderFactory::CreateUploaderTaskRunner());
FeedbackUploaderFactory::CreateUploaderTaskRunner()); uploader.set_url_loader_factory_for_test(shared_url_loader_factory());
EXPECT_EQ(kTestRetryDelay, uploader.retry_delay()); EXPECT_EQ(kTestRetryDelay, uploader.retry_delay());
// Failed reports due to client errors are not retried. No backoff delay // Failed reports due to client errors are not retried. No backoff delay
...@@ -156,8 +156,8 @@ TEST_F(FeedbackUploaderDispatchTest, 400Response) { ...@@ -156,8 +156,8 @@ TEST_F(FeedbackUploaderDispatchTest, 400Response) {
TEST_F(FeedbackUploaderDispatchTest, 500Response) { TEST_F(FeedbackUploaderDispatchTest, 500Response) {
FeedbackUploader::SetMinimumRetryDelayForTesting(kTestRetryDelay); FeedbackUploader::SetMinimumRetryDelayForTesting(kTestRetryDelay);
FeedbackUploader uploader( FeedbackUploader uploader(
shared_url_loader_factory(), context(), context(), FeedbackUploaderFactory::CreateUploaderTaskRunner());
FeedbackUploaderFactory::CreateUploaderTaskRunner()); uploader.set_url_loader_factory_for_test(shared_url_loader_factory());
EXPECT_EQ(kTestRetryDelay, uploader.retry_delay()); EXPECT_EQ(kTestRetryDelay, uploader.retry_delay());
// Failed reports due to server errors are retried. // Failed reports due to server errors are retried.
......
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
#include "components/feedback/feedback_uploader.h" #include "components/feedback/feedback_uploader.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/keyed_service/content/browser_context_dependency_manager.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
#include "content/public/browser/storage_partition.h"
namespace feedback { namespace feedback {
...@@ -53,10 +52,7 @@ FeedbackUploaderFactory::~FeedbackUploaderFactory() {} ...@@ -53,10 +52,7 @@ FeedbackUploaderFactory::~FeedbackUploaderFactory() {}
KeyedService* FeedbackUploaderFactory::BuildServiceInstanceFor( KeyedService* FeedbackUploaderFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const { content::BrowserContext* context) const {
return new FeedbackUploader( return new FeedbackUploader(context, task_runner_);
content::BrowserContext::GetDefaultStoragePartition(context)
->GetURLLoaderFactoryForBrowserProcess(),
context, task_runner_);
} }
content::BrowserContext* FeedbackUploaderFactory::GetBrowserContextToUse( content::BrowserContext* FeedbackUploaderFactory::GetBrowserContextToUse(
......
...@@ -41,9 +41,10 @@ class MockFeedbackUploader : public FeedbackUploader { ...@@ -41,9 +41,10 @@ class MockFeedbackUploader : public FeedbackUploader {
MockFeedbackUploader( MockFeedbackUploader(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
content::BrowserContext* context) content::BrowserContext* context)
: FeedbackUploader(url_loader_factory, : FeedbackUploader(context,
context, FeedbackUploaderFactory::CreateUploaderTaskRunner()) {
FeedbackUploaderFactory::CreateUploaderTaskRunner()) {} set_url_loader_factory_for_test(url_loader_factory);
}
~MockFeedbackUploader() override {} ~MockFeedbackUploader() override {}
void RunMessageLoop() { void RunMessageLoop() {
......
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