blob: a5f585be4b7791b01139ebe60ef364e8932c7cf3 [file] [log] [blame]
[email protected]c5dec6292013-01-25 04:54:521// Copyright 2013 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
[email protected]a7b8e43d2013-03-18 18:52:435#ifndef CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_
6#define CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_
[email protected]c5dec6292013-01-25 04:54:527
Friedrich Horschig9e8749f02017-08-10 09:17:318#include <map>
dcheng4af48582016-04-19 00:29:359#include <memory>
[email protected]c5dec6292013-01-25 04:54:5210#include <set>
[email protected]ab01dd752013-06-08 05:13:3611#include <vector>
[email protected]c5dec6292013-01-25 04:54:5212
[email protected]c4b2af22014-05-11 19:48:5313#include "base/gtest_prod_util.h"
avib896c712015-12-26 02:10:4314#include "base/macros.h"
treibbb0c5af52016-12-09 17:34:1515#include "base/memory/ref_counted.h"
[email protected]280be992013-06-04 03:19:5116#include "base/memory/weak_ptr.h"
[email protected]6af41782013-06-22 13:49:1117#include "base/observer_list.h"
brettw9b0866f2016-12-11 02:34:0618#include "build/build_config.h"
Kristi Parka5141b92018-10-10 01:23:5719#include "chrome/common/search.mojom.h"
sdefresnebc766ef2014-09-25 09:28:1320#include "components/history/core/browser/history_types.h"
[email protected]540380fc2014-03-14 10:10:3421#include "components/keyed_service/core/keyed_service.h"
treibbb0c5af52016-12-09 17:34:1522#include "components/ntp_tiles/most_visited_sites.h"
23#include "components/ntp_tiles/ntp_tile.h"
Kyle Milka66bb07a2018-09-17 17:55:5624#include "components/prefs/pref_change_registrar.h"
Kyle Milka64e205c2018-06-07 17:27:3125#include "components/prefs/pref_registry_simple.h"
Kristi Parka5141b92018-10-10 01:23:5726#include "components/search/url_validity_checker.h"
[email protected]54e0ee62013-02-01 17:25:0327#include "content/public/browser/notification_observer.h"
28#include "content/public/browser/notification_registrar.h"
[email protected]c4b2af22014-05-11 19:48:5329#include "url/gurl.h"
[email protected]c5dec6292013-01-25 04:54:5230
Marc Treib9028a6a2017-12-06 16:21:5131#if defined(OS_ANDROID)
32#error "Instant is only used on desktop";
33#endif
34
[email protected]672c8c12013-03-07 12:30:0635class InstantIOContext;
[email protected]6af41782013-06-22 13:49:1136class InstantServiceObserver;
Kyle Milka31a76c6d2018-10-19 17:37:2737class NtpBackgroundService;
[email protected]672c8c12013-03-07 12:30:0638class Profile;
treibc6892192017-02-15 13:03:3739struct InstantMostVisitedItem;
[email protected]c4b2af22014-05-11 19:48:5340struct ThemeBackgroundInfo;
[email protected]672c8c12013-03-07 12:30:0641
[email protected]4ff347e2013-07-22 19:39:0042namespace content {
[email protected]777590052014-01-17 22:11:5443class RenderProcessHost;
Kristi Parka5141b92018-10-10 01:23:5744} // namespace content
[email protected]4ff347e2013-07-22 19:39:0045
Marc Treibbe5f3feb2017-09-04 09:53:1646// Tracks render process host IDs that are associated with Instant, i.e.
47// processes that are used to render an NTP. Also responsible for keeping
48// necessary information (most visited tiles and theme info) updated in those
49// renderer processes.
[email protected]540380fc2014-03-14 10:10:3450class InstantService : public KeyedService,
[email protected]c4b2af22014-05-11 19:48:5351 public content::NotificationObserver,
treibbb0c5af52016-12-09 17:34:1552 public ntp_tiles::MostVisitedSites::Observer {
[email protected]c5dec6292013-01-25 04:54:5253 public:
[email protected]672c8c12013-03-07 12:30:0654 explicit InstantService(Profile* profile);
Daniel Chenga542fca2014-10-21 09:51:2955 ~InstantService() override;
[email protected]c5dec6292013-01-25 04:54:5256
57 // Add, remove, and query RenderProcessHost IDs that are associated with
58 // Instant processes.
59 void AddInstantProcess(int process_id);
[email protected]c5dec6292013-01-25 04:54:5260 bool IsInstantProcess(int process_id) const;
61
[email protected]6af41782013-06-22 13:49:1162 // Adds/Removes InstantService observers.
63 void AddObserver(InstantServiceObserver* observer);
64 void RemoveObserver(InstantServiceObserver* observer);
65
Kyle Milka64e205c2018-06-07 17:27:3166 // Register prefs associated with the NTP.
67 static void RegisterProfilePrefs(PrefRegistrySimple* registry);
68
[email protected]d572bfd2013-02-14 06:14:2069#if defined(UNIT_TEST)
70 int GetInstantProcessCount() const {
71 return process_ids_.size();
72 }
73#endif
[email protected]c5dec6292013-01-25 04:54:5274
treib2df1b7d2016-11-23 09:16:3275 // Invoked whenever an NTP is opened. Causes an async refresh of Most Visited
76 // items.
77 void OnNewTabPageOpened();
78
Xi Cheng72db9c0c2017-08-30 17:05:4079 // Most visited item APIs.
80 //
treib2df1b7d2016-11-23 09:16:3281 // Invoked when the Instant page wants to delete a Most Visited item.
[email protected]280be992013-06-04 03:19:5182 void DeleteMostVisitedItem(const GURL& url);
treib2df1b7d2016-11-23 09:16:3283 // Invoked when the Instant page wants to undo the deletion.
[email protected]280be992013-06-04 03:19:5184 void UndoMostVisitedDeletion(const GURL& url);
treib2df1b7d2016-11-23 09:16:3285 // Invoked when the Instant page wants to undo all Most Visited deletions.
[email protected]280be992013-06-04 03:19:5186 void UndoAllMostVisitedDeletions();
kristiparka52a3892018-07-24 18:46:4487 // Invoked when the Instant page wants to add a custom link.
kristiparkbe00c6562018-08-01 21:30:2788 bool AddCustomLink(const GURL& url, const std::string& title);
kristipark940dc202018-07-30 18:29:5589 // Invoked when the Instant page wants to update a custom link.
kristiparkbe00c6562018-08-01 21:30:2790 bool UpdateCustomLink(const GURL& url,
kristipark940dc202018-07-30 18:29:5591 const GURL& new_url,
92 const std::string& new_title);
kristiparka52a3892018-07-24 18:46:4493 // Invoked when the Instant page wants to delete a custom link.
kristiparkbe00c6562018-08-01 21:30:2794 bool DeleteCustomLink(const GURL& url);
95 // Invoked when the Instant page wants to undo the previous custom link
Ramya Nagarajan7673f052018-08-13 22:53:2996 // action. Returns false and does nothing if the profile is using a non-Google
97 // search provider.
98 bool UndoCustomLinkAction();
kristiparka52a3892018-07-24 18:46:4499 // Invoked when the Instant page wants to delete all custom links and use Most
Ramya Nagarajan7673f052018-08-13 22:53:29100 // Visited sites instead. Returns false and does nothing if the profile is
101 // using a non-Google search provider.
102 bool ResetCustomLinks();
[email protected]280be992013-06-04 03:19:51103
Kristi Parka5141b92018-10-10 01:23:57104 // Invoked during the add/update a custom link flow. Creates a request to
105 // check if |url| resolves to an existing page and notifies the frontend of
106 // the result. This will be used to determine if we need to use "http" instead
107 // of the default "https" scheme for the link's URL. Custom links must be
108 // enabled.
109 void DoesUrlResolve(
110 const GURL& url,
111 chrome::mojom::EmbeddedSearch::DoesUrlResolveCallback callback);
112
[email protected]6af41782013-06-22 13:49:11113 // Invoked by the InstantController to update theme information for NTP.
114 //
115 // TODO(kmadhusu): Invoking this from InstantController shouldn't be
116 // necessary. Investigate more and remove this from here.
Kyle Milkafb37a772018-06-25 16:09:19117 void UpdateThemeInfo();
[email protected]6af41782013-06-22 13:49:11118
[email protected]ed68ae32013-06-29 20:46:48119 // Invoked by the InstantController to update most visited items details for
120 // NTP.
121 void UpdateMostVisitedItemsInfo();
122
Marc Treibc9c35002017-10-16 10:09:33123 // Sends the current NTP URL to a renderer process.
124 void SendNewTabPageURLToRenderer(content::RenderProcessHost* rph);
[email protected]2309e912013-10-01 01:33:30125
Kyle Milka64e205c2018-06-07 17:27:31126 // Invoked when a custom background is selected on the NTP.
127 void SetCustomBackgroundURL(const GURL& url);
128
Kyle Milka6986ede2018-07-19 02:16:24129 // Invoked when a custom background with attributions is selected on the NTP.
130 void SetCustomBackgroundURLWithAttributions(
131 const GURL& background_url,
132 const std::string& attribution_line_1,
133 const std::string& attribution_line_2,
134 const GURL& action_url);
135
Kyle Milka3626a7d2018-07-03 06:23:55136 // Invoked when a user selected the "Upload an image" option on the NTP.
137 void SelectLocalBackgroundImage(const base::FilePath& path);
138
Kyle Milka6986ede2018-07-19 02:16:24139 // Used for testing.
140 ThemeBackgroundInfo* GetThemeInfoForTesting() { return theme_info_.get(); }
141
Kyle Milka31a76c6d2018-10-19 17:37:27142 void AddValidBackdropUrlForTesting(const GURL& url) const;
143
Kristi Parka5141b92018-10-10 01:23:57144 // Used for testing.
145 void SetUrlValidityCheckerForTesting(UrlValidityChecker* url_checker) {
146 url_checker_for_testing_ = url_checker;
147 }
148
[email protected]c5dec6292013-01-25 04:54:52149 private:
kristiparkf8fa4132018-09-13 18:07:29150 class SearchProviderObserver;
151
[email protected]4ff347e2013-07-22 19:39:00152 friend class InstantExtendedTest;
[email protected]c8a118e2013-09-24 21:33:40153 friend class InstantUnitTestBase;
[email protected]4ff347e2013-07-22 19:39:00154
[email protected]df113a12013-07-24 04:56:08155 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, ProcessIsolation);
Marc Treib7b3985e2017-09-18 11:22:16156 FRIEND_TEST_ALL_PREFIXES(InstantServiceTest, GetNTPTileSuggestion);
[email protected]4ff347e2013-07-22 19:39:00157
[email protected]c4b2af22014-05-11 19:48:53158 // KeyedService:
Daniel Chenga542fca2014-10-21 09:51:29159 void Shutdown() override;
[email protected]c5dec6292013-01-25 04:54:52160
Kristi Parka5141b92018-10-10 01:23:57161 // Called when the request from |DoesUrlResolve| finishes. Invokes the
162 // associated callback with the request status.
163 //
164 // If the request exceeded the UI dialog timeout and the URL did not resolve,
165 // calls |UpdateCustomLink| to internally update the link's default "https"
166 // scheme to "http".
167 void OnDoesUrlResolveComplete(
168 const GURL& url,
169 chrome::mojom::EmbeddedSearch::DoesUrlResolveCallback callback,
170 bool resolves,
Kristi Park8c7eeb62018-10-12 22:16:52171 base::TimeDelta duration);
Kristi Parka5141b92018-10-10 01:23:57172
[email protected]c4b2af22014-05-11 19:48:53173 // content::NotificationObserver:
Daniel Chenga542fca2014-10-21 09:51:29174 void Observe(int type,
175 const content::NotificationSource& source,
176 const content::NotificationDetails& details) override;
[email protected]54e0ee62013-02-01 17:25:03177
[email protected]2309e912013-10-01 01:33:30178 // Called when a renderer process is terminated.
179 void OnRendererProcessTerminated(int process_id);
180
kristiparkf8fa4132018-09-13 18:07:29181 // Called when the search provider changes. Disables custom links if the
182 // search provider is not Google.
183 void OnSearchProviderChanged(bool is_google);
184
treibbb0c5af52016-12-09 17:34:15185 // ntp_tiles::MostVisitedSites::Observer implementation.
Friedrich Horschig9e8749f02017-08-10 09:17:31186 void OnURLsAvailable(
187 const std::map<ntp_tiles::SectionType, ntp_tiles::NTPTilesVector>&
188 sections) override;
treibbb0c5af52016-12-09 17:34:15189 void OnIconMadeAvailable(const GURL& site_url) override;
[email protected]280be992013-06-04 03:19:51190
[email protected]ed68ae32013-06-29 20:46:48191 void NotifyAboutMostVisitedItems();
Marc Treib5891b282017-08-22 09:44:30192 void NotifyAboutThemeInfo();
[email protected]ed68ae32013-06-29 20:46:48193
Marc Treib5891b282017-08-22 09:44:30194 void BuildThemeInfo();
[email protected]6af41782013-06-22 13:49:11195
Kyle Milka6986ede2018-07-19 02:16:24196 void ApplyOrResetCustomBackgroundThemeInfo();
197
Kyle Milka66bb07a2018-09-17 17:55:56198 void ApplyCustomBackgroundThemeInfo();
199 void ApplyCustomBackgroundThemeInfoFromLocalFile(bool file_exists);
200
Kyle Milka6986ede2018-07-19 02:16:24201 void ResetCustomBackgroundThemeInfo();
Kyle Milkafb37a772018-06-25 16:09:19202
Kyle Milka66bb07a2018-09-17 17:55:56203 void FallbackToDefaultThemeInfo();
204
Kyle Milka31a76c6d2018-10-19 17:37:27205 void RemoveLocalBackgroundImageCopy();
206
Kyle Milka3626a7d2018-07-03 06:23:55207 // Update the background pref to point to
208 // chrome-search://local-ntp/background.jpg
209 void SetBackgroundToLocalResource();
210
Kristi Parka4a16f322018-10-17 19:08:48211 // Returns the owned instance of UrlValidityChecker or
212 // |url_checker_for_testing_| if not null. Should only be called from the UI
213 // thread.
Kristi Parka5141b92018-10-10 01:23:57214 UrlValidityChecker* GetUrlValidityChecker();
215
[email protected]672c8c12013-03-07 12:30:06216 Profile* const profile_;
217
[email protected]c5dec6292013-01-25 04:54:52218 // The process ids associated with Instant processes.
219 std::set<int> process_ids_;
220
Marc Treib7b3985e2017-09-18 11:22:16221 // InstantMostVisitedItems for NTP tiles, received from |most_visited_sites_|.
[email protected]ab01dd752013-06-08 05:13:36222 std::vector<InstantMostVisitedItem> most_visited_items_;
[email protected]e7868c82013-03-12 03:55:56223
[email protected]6af41782013-06-22 13:49:11224 // Theme-related data for NTP overlay to adopt themes.
dcheng4af48582016-04-19 00:29:35225 std::unique_ptr<ThemeBackgroundInfo> theme_info_;
[email protected]6af41782013-06-22 13:49:11226
Trent Apteda250ec3ab2018-08-19 08:52:19227 base::ObserverList<InstantServiceObserver>::Unchecked observers_;
[email protected]6af41782013-06-22 13:49:11228
[email protected]54e0ee62013-02-01 17:25:03229 content::NotificationRegistrar registrar_;
230
[email protected]672c8c12013-03-07 12:30:06231 scoped_refptr<InstantIOContext> instant_io_context_;
232
Marc Treib7b3985e2017-09-18 11:22:16233 // Data source for NTP tiles (aka Most Visited tiles). May be null.
treibbb0c5af52016-12-09 17:34:15234 std::unique_ptr<ntp_tiles::MostVisitedSites> most_visited_sites_;
mohan.reddy74595362014-09-23 20:35:34235
kristiparkf8fa4132018-09-13 18:07:29236 // Keeps track of any changes in search engine provider. May be null.
237 std::unique_ptr<SearchProviderObserver> search_provider_observer_;
238
Kristi Parka5141b92018-10-10 01:23:57239 // Test UrlValidityChecker used for testing.
Kristi Park8c7eeb62018-10-12 22:16:52240 UrlValidityChecker* url_checker_for_testing_ = nullptr;
Kristi Parka5141b92018-10-10 01:23:57241
Kyle Milka66bb07a2018-09-17 17:55:56242 PrefChangeRegistrar pref_change_registrar_;
243
244 PrefService* pref_service_;
245
Kyle Milka31a76c6d2018-10-19 17:37:27246 NtpBackgroundService* background_service_;
247
Kyle Milka3626a7d2018-07-03 06:23:55248 base::WeakPtrFactory<InstantService> weak_ptr_factory_;
249
[email protected]c5dec6292013-01-25 04:54:52250 DISALLOW_COPY_AND_ASSIGN(InstantService);
251};
252
[email protected]a7b8e43d2013-03-18 18:52:43253#endif // CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_