tile_service_factory_helper.cc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/query_tiles/tile_service_factory_helper.h"
  5. #include <string>
  6. #include <utility>
  7. #include "base/command_line.h"
  8. #include "base/task/sequenced_task_runner.h"
  9. #include "base/task/thread_pool.h"
  10. #include "base/time/default_clock.h"
  11. #include "base/time/default_tick_clock.h"
  12. #include "components/background_task_scheduler/background_task_scheduler.h"
  13. #include "components/image_fetcher/core/image_fetcher_service.h"
  14. #include "components/keyed_service/core/keyed_service.h"
  15. #include "components/leveldb_proto/public/proto_database_provider.h"
  16. #include "components/leveldb_proto/public/shared_proto_database_client_list.h"
  17. #include "components/prefs/pref_service.h"
  18. #include "components/query_tiles/internal/cached_image_loader.h"
  19. #include "components/query_tiles/internal/image_prefetcher.h"
  20. #include "components/query_tiles/internal/init_aware_tile_service.h"
  21. #include "components/query_tiles/internal/logger_impl.h"
  22. #include "components/query_tiles/internal/tile_config.h"
  23. #include "components/query_tiles/internal/tile_fetcher.h"
  24. #include "components/query_tiles/internal/tile_manager.h"
  25. #include "components/query_tiles/internal/tile_service_impl.h"
  26. #include "components/query_tiles/internal/tile_service_scheduler_impl.h"
  27. #include "components/query_tiles/switches.h"
  28. #include "services/network/public/cpp/shared_url_loader_factory.h"
  29. namespace query_tiles {
  30. namespace {
  31. const base::FilePath::CharType kTileDbName[] =
  32. FILE_PATH_LITERAL("UpboardingQueryTileDatabase");
  33. void BuildBackoffPolicy(net::BackoffEntry::Policy* policy) {
  34. policy->num_errors_to_ignore = 0;
  35. policy->initial_delay_ms =
  36. TileConfig::GetBackoffPolicyArgsInitDelayInMs(); // 30 seconds.
  37. policy->maximum_backoff_ms =
  38. TileConfig::GetBackoffPolicyArgsMaxDelayInMs(); // 1 day.
  39. policy->multiply_factor = 2;
  40. policy->jitter_factor = 0.33;
  41. policy->entry_lifetime_ms = -1;
  42. policy->always_use_initial_delay = false;
  43. }
  44. } // namespace
  45. std::unique_ptr<TileService> CreateTileService(
  46. image_fetcher::ImageFetcherService* image_fetcher_service,
  47. leveldb_proto::ProtoDatabaseProvider* db_provider,
  48. const base::FilePath& storage_dir,
  49. background_task::BackgroundTaskScheduler* scheduler,
  50. const std::string& accepted_language,
  51. const std::string& country_code,
  52. const std::string& api_key,
  53. const std::string& client_version,
  54. const std::string& default_server_url,
  55. scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
  56. PrefService* pref_service) {
  57. // Create image loader.
  58. auto* cached_image_fetcher = image_fetcher_service->GetImageFetcher(
  59. image_fetcher::ImageFetcherConfig::kDiskCacheOnly);
  60. auto* reduced_mode_image_fetcher = image_fetcher_service->GetImageFetcher(
  61. image_fetcher::ImageFetcherConfig::kReducedMode);
  62. auto image_loader = std::make_unique<CachedImageLoader>(
  63. cached_image_fetcher, reduced_mode_image_fetcher);
  64. auto image_prefetcher = ImagePrefetcher::Create(
  65. TileConfig::GetImagePrefetchMode(), std::move(image_loader));
  66. auto* clock = base::DefaultClock::GetInstance();
  67. auto logger = std::make_unique<LoggerImpl>();
  68. // Create tile store and manager.
  69. auto task_runner = base::ThreadPool::CreateSequencedTaskRunner(
  70. {base::MayBlock(), base::TaskPriority::USER_VISIBLE});
  71. base::FilePath tile_store_dir = storage_dir.Append(kTileDbName);
  72. auto tile_db = db_provider->GetDB<query_tiles::proto::TileGroup, TileGroup>(
  73. leveldb_proto::ProtoDbType::UPBOARDING_QUERY_TILE_STORE, tile_store_dir,
  74. task_runner);
  75. auto tile_store = std::make_unique<TileStore>(std::move(tile_db));
  76. auto tile_manager =
  77. TileManager::Create(std::move(tile_store), accepted_language);
  78. // Create fetcher.
  79. auto tile_fetcher = TileFetcher::Create(
  80. TileConfig::GetQueryTilesServerUrl(default_server_url, false),
  81. country_code, accepted_language, api_key,
  82. TileConfig::GetExperimentTag(country_code), client_version,
  83. url_loader_factory);
  84. // Wrap background task scheduler.
  85. auto policy = std::make_unique<net::BackoffEntry::Policy>();
  86. BuildBackoffPolicy(policy.get());
  87. auto tile_background_task_scheduler =
  88. std::make_unique<TileServiceSchedulerImpl>(
  89. scheduler, pref_service, clock, base::DefaultTickClock::GetInstance(),
  90. std::move(policy), logger.get());
  91. logger->SetLogSource(tile_background_task_scheduler.get());
  92. auto tile_service_impl = std::make_unique<TileServiceImpl>(
  93. std::move(image_prefetcher), std::move(tile_manager),
  94. std::move(tile_background_task_scheduler), std::move(tile_fetcher), clock,
  95. std::move(logger));
  96. return std::make_unique<InitAwareTileService>(std::move(tile_service_impl));
  97. }
  98. } // namespace query_tiles