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 "components/history/core/browser/history_types.h"
15#include "components/keyed_service/core/keyed_service.h"
16#include "components/search_engines/template_url_service_observer.h"
17#include "content/public/browser/notification_observer.h"
18#include "content/public/browser/notification_registrar.h"
19#include "url/gurl.h"
20
21class InstantIOContext;
22struct InstantMostVisitedItem;
23class InstantSearchPrerenderer;
24class InstantServiceObserver;
25class Profile;
26struct TemplateURLData;
27class TemplateURLService;
28struct ThemeBackgroundInfo;
29class ThemeService;
30
31namespace content {
32class RenderProcessHost;
33}
34
35// Tracks render process host IDs that are associated with Instant.
36class 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)
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
89  InstantSearchPrerenderer* instant_search_prerenderer() {
90    return instant_prerenderer_.get();
91  }
92
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 to check whether notifications from TemplateURLService indicate a
166  // change that affects the default search provider.
167  scoped_ptr<TemplateURLData> previous_default_search_provider_;
168  GURL previous_google_base_url_;
169
170  // Used for Top Sites async retrieval.
171  base::WeakPtrFactory<InstantService> weak_ptr_factory_;
172
173  DISALLOW_COPY_AND_ASSIGN(InstantService);
174};
175
176#endif  // CHROME_BROWSER_SEARCH_INSTANT_SERVICE_H_
177