• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 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 
5 #ifndef CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_
6 #define CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_
7 
8 #include <set>
9 #include <vector>
10 
11 #include "base/gtest_prod_util.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/observer_list.h"
14 #include "chrome/browser/history/history_types.h"
15 #include "chrome/browser/search_engines/template_url_service_observer.h"
16 #include "components/keyed_service/core/keyed_service.h"
17 #include "content/public/browser/notification_observer.h"
18 #include "content/public/browser/notification_registrar.h"
19 #include "url/gurl.h"
20 
21 class InstantIOContext;
22 struct InstantMostVisitedItem;
23 class InstantSearchPrerenderer;
24 class InstantServiceObserver;
25 class Profile;
26 struct TemplateURLData;
27 class TemplateURLService;
28 struct ThemeBackgroundInfo;
29 class ThemeService;
30 
31 namespace content {
32 class RenderProcessHost;
33 }
34 
35 // Tracks render process host IDs that are associated with Instant.
36 class InstantService : public KeyedService,
37                        public content::NotificationObserver,
38                        public TemplateURLServiceObserver {
39  public:
40   explicit InstantService(Profile* profile);
41   virtual ~InstantService();
42 
43   // Add, remove, and query RenderProcessHost IDs that are associated with
44   // Instant processes.
45   void AddInstantProcess(int process_id);
46   bool IsInstantProcess(int process_id) const;
47 
48   // Adds/Removes InstantService observers.
49   void AddObserver(InstantServiceObserver* observer);
50   void RemoveObserver(InstantServiceObserver* observer);
51 
52 #if defined(UNIT_TEST)
GetInstantProcessCount()53   int GetInstantProcessCount() const {
54     return process_ids_.size();
55   }
56 #endif
57 
58   // Most visited item API.
59 
60   // Invoked by the InstantController when the Instant page wants to delete a
61   // Most Visited item.
62   void DeleteMostVisitedItem(const GURL& url);
63 
64   // Invoked by the InstantController when the Instant page wants to undo the
65   // blacklist action.
66   void UndoMostVisitedDeletion(const GURL& url);
67 
68   // Invoked by the InstantController when the Instant page wants to undo all
69   // Most Visited deletions.
70   void UndoAllMostVisitedDeletions();
71 
72   // Invoked by the InstantController to update theme information for NTP.
73   //
74   // TODO(kmadhusu): Invoking this from InstantController shouldn't be
75   // necessary. Investigate more and remove this from here.
76   void UpdateThemeInfo();
77 
78   // Invoked by the InstantController to update most visited items details for
79   // NTP.
80   void UpdateMostVisitedItemsInfo();
81 
82   // Sends the current set of search URLs to a renderer process.
83   void SendSearchURLsToRenderer(content::RenderProcessHost* rph);
84 
85   // Invoked to notify the Instant page that the omnibox start margin has
86   // changed.
87   void OnOmniboxStartMarginChanged(int start_margin);
88 
instant_search_prerenderer()89   InstantSearchPrerenderer* instant_search_prerenderer() {
90     return instant_prerenderer_.get();
91   }
92 
omnibox_start_margin()93   int omnibox_start_margin() const { return omnibox_start_margin_; }
94 
95  private:
96   friend class InstantExtendedTest;
97   friend class InstantServiceTest;
98   friend class InstantTestBase;
99   friend class InstantUnitTestBase;
100 
101   FRIEND_TEST_ALL_PREFIXES(InstantExtendedManualTest,
102                            MANUAL_SearchesFromFakebox);
103   FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, ProcessIsolation);
104   FRIEND_TEST_ALL_PREFIXES(InstantServiceEnabledTest,
105                            SendsSearchURLsToRenderer);
106 
107   // KeyedService:
108   virtual void Shutdown() OVERRIDE;
109 
110   // content::NotificationObserver:
111   virtual void Observe(int type,
112                        const content::NotificationSource& source,
113                        const content::NotificationDetails& details) OVERRIDE;
114 
115   // TemplateURLServiceObserver:
116   // Caches the previous value of the Default Search Provider and the Google
117   // base URL to filter out changes other than those affecting the Default
118   // Search Provider.
119   virtual void OnTemplateURLServiceChanged() OVERRIDE;
120 
121   // Called when a renderer process is terminated.
122   void OnRendererProcessTerminated(int process_id);
123 
124   // Called when we get new most visited items from TopSites, registered as an
125   // async callback. Parses them and sends them to the renderer via
126   // SendMostVisitedItems.
127   void OnMostVisitedItemsReceived(const history::MostVisitedURLList& data);
128 
129   // Notifies the observer about the last known most visited items.
130   void NotifyAboutMostVisitedItems();
131 
132   // Theme changed notification handler.
133   void OnThemeChanged(ThemeService* theme_service);
134 
135   void ResetInstantSearchPrerenderer();
136 
137   Profile* const profile_;
138 
139   // The TemplateURLService that we are observing. It will outlive this
140   // InstantService due to the dependency declared in InstantServiceFactory.
141   TemplateURLService* template_url_service_;
142 
143   // The process ids associated with Instant processes.
144   std::set<int> process_ids_;
145 
146   // InstantMostVisitedItems sent to the Instant Pages.
147   std::vector<InstantMostVisitedItem> most_visited_items_;
148 
149   // Theme-related data for NTP overlay to adopt themes.
150   scoped_ptr<ThemeBackgroundInfo> theme_info_;
151 
152   // The start-edge margin of the omnibox, used by the Instant page to align
153   // text or assets properly with the omnibox.
154   int omnibox_start_margin_;
155 
156   ObserverList<InstantServiceObserver> observers_;
157 
158   content::NotificationRegistrar registrar_;
159 
160   scoped_refptr<InstantIOContext> instant_io_context_;
161 
162   // Set to NULL if the default search provider does not support Instant.
163   scoped_ptr<InstantSearchPrerenderer> instant_prerenderer_;
164 
165   // Used for Top Sites async retrieval.
166   base::WeakPtrFactory<InstantService> weak_ptr_factory_;
167 
168   // Used to check whether notifications from TemplateURLService indicate a
169   // change that affects the default search provider.
170   scoped_ptr<TemplateURLData> previous_default_search_provider_;
171   GURL previous_google_base_url_;
172 
173   DISALLOW_COPY_AND_ASSIGN(InstantService);
174 };
175 
176 #endif  // CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_
177