1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_
#define CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_
#include <map>
#include <memory>
#include <set>
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/scoped_multi_source_observation.h"
#include "base/scoped_observation.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/themes/theme_service_observer.h"
#include "components/history/core/browser/history_types.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/ntp_tiles/most_visited_sites.h"
#include "components/ntp_tiles/ntp_tile.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/prefs/pref_registry_simple.h"
#include "content/public/browser/render_process_host_observer.h"
#include "ui/native_theme/native_theme.h"
#include "ui/native_theme/native_theme_observer.h"
#include "url/gurl.h"
#if BUILDFLAG(IS_ANDROID)
#error "Instant is only used on desktop";
#endif
class InstantServiceObserver;
class Profile;
struct CollectionImage;
struct InstantMostVisitedInfo;
struct NtpTheme;
namespace base {
class Clock;
} // namespace base
namespace content {
class BrowserContext;
class RenderProcessHost;
} // namespace content
// Tracks render process host IDs that are associated with Instant, i.e.
// processes that are used to render an NTP. Also responsible for keeping
// necessary information (most visited tiles and theme info) updated in those
// renderer processes.
class InstantService : public KeyedService,
public content::RenderProcessHostObserver,
public ntp_tiles::MostVisitedSites::Observer,
public ui::NativeThemeObserver,
public ThemeServiceObserver {
public:
explicit InstantService(Profile* profile);
InstantService(const InstantService&) = delete;
InstantService& operator=(const InstantService&) = delete;
~InstantService() override;
// Add RenderProcessHosts that are associated with Instant processes and query
// based on PID.
void AddInstantProcess(content::RenderProcessHost* host);
bool IsInstantProcess(int process_id) const;
// Adds/Removes InstantService observers.
virtual void AddObserver(InstantServiceObserver* observer);
void RemoveObserver(InstantServiceObserver* observer);
// Determine if this chrome-search: request is coming from an Instant render
// process.
static bool ShouldServiceRequest(const GURL& url,
content::BrowserContext* browser_context,
int render_process_id);
#if defined(UNIT_TEST)
int GetInstantProcessCount() const {
return process_ids_.size();
}
#endif
// Invoked whenever an NTP is opened. Causes an async refresh of Most Visited
// items.
void OnNewTabPageOpened();
// ThemeServiceObserver implementation.
void OnThemeChanged() override;
// Most visited item APIs.
//
// Invoked when the Instant page wants to delete a Most Visited item.
void DeleteMostVisitedItem(const GURL& url);
// Invoked when the Instant page wants to undo the deletion.
void UndoMostVisitedDeletion(const GURL& url);
// Invoked when the Instant page wants to undo all Most Visited deletions.
void UndoAllMostVisitedDeletions();
// Invoked to update theme information for the NTP.
virtual void UpdateNtpTheme();
// Invoked by the InstantController to update most visited items details for
// NTP.
void UpdateMostVisitedInfo();
// Getter for |theme_| that will also initialize it if necessary.
NtpTheme* GetInitializedNtpTheme();
// Used for testing.
void SetNativeThemeForTesting(ui::NativeTheme* theme);
private:
friend class InstantExtendedTest;
friend class InstantUnitTestBase;
friend class TestInstantService;
FRIEND_TEST_ALL_PREFIXES(InstantServiceTest, GetNTPTileSuggestion);
FRIEND_TEST_ALL_PREFIXES(InstantServiceTest, TestNoNtpTheme);
// KeyedService:
void Shutdown() override;
// content::RenderProcessHostObserver:
void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
// ui::NativeThemeObserver:
void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override;
// ntp_tiles::MostVisitedSites::Observer implementation.
void OnURLsAvailable(
bool is_user_triggered,
const std::map<ntp_tiles::SectionType, ntp_tiles::NTPTilesVector>&
sections) override;
void OnIconMadeAvailable(const GURL& site_url) override;
void NotifyAboutMostVisitedInfo();
void NotifyAboutNtpTheme();
void BuildNtpTheme();
base::TimeTicks GetBackgroundUpdatedTimestampForTesting() {
return background_updated_timestamp_;
}
// Sets NTP elements theme info that are overridden when custom
// background is used.
void SetNtpElementsNtpTheme();
const raw_ptr<Profile> profile_;
// The process ids associated with Instant processes.
std::set<int> process_ids_;
// Contains InstantMostVisitedItems received from |most_visited_sites_| and
// information required to display NTP tiles.
std::unique_ptr<InstantMostVisitedInfo> most_visited_info_;
// Theme-related data for NTP overlay to adopt themes.
std::unique_ptr<NtpTheme> theme_;
base::ObserverList<InstantServiceObserver>::Unchecked observers_;
// Data source for NTP tiles (aka Most Visited tiles). May be null.
std::unique_ptr<ntp_tiles::MostVisitedSites> most_visited_sites_;
PrefChangeRegistrar pref_change_registrar_;
raw_ptr<PrefService> pref_service_;
base::ScopedMultiSourceObservation<content::RenderProcessHost,
content::RenderProcessHostObserver>
host_observation_{this};
base::ScopedObservation<ui::NativeTheme, ui::NativeThemeObserver>
theme_observation_{this};
raw_ptr<ui::NativeTheme> native_theme_;
base::TimeTicks background_updated_timestamp_;
base::WeakPtrFactory<InstantService> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_
|