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