e5ab6626535ff1bab20cd31869bab202d7e8fca2
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / search / search_ipc_router.h
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_UI_SEARCH_SEARCH_IPC_ROUTER_H_
6 #define CHROME_BROWSER_UI_SEARCH_SEARCH_IPC_ROUTER_H_
7
8 #include <vector>
9
10 #include "base/gtest_prod_util.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "chrome/common/instant_types.h"
13 #include "chrome/common/ntp_logging_events.h"
14 #include "chrome/common/omnibox_focus_state.h"
15 #include "content/public/browser/web_contents_observer.h"
16 #include "ui/base/window_open_disposition.h"
17
18 class GURL;
19
20 namespace content {
21 class WebContents;
22 }
23
24 class SearchIPCRouterTest;
25
26 // SearchIPCRouter is responsible for receiving and sending IPC messages between
27 // the browser and the Instant page.
28 class SearchIPCRouter : public content::WebContentsObserver {
29  public:
30   // SearchIPCRouter calls its delegate in response to messages received from
31   // the page.
32   class Delegate {
33    public:
34     // Called upon determination of Instant API support in response to the page
35     // load event.
36     virtual void OnInstantSupportDetermined(bool supports_instant) = 0;
37
38     // Called upon determination of voice search API support.
39     virtual void OnSetVoiceSearchSupport(bool supports_voice_search) = 0;
40
41     // Called when the page wants the omnibox to be focused. |state| specifies
42     // the omnibox focus state.
43     virtual void FocusOmnibox(OmniboxFocusState state) = 0;
44
45     // Called when the page wants to navigate to |url|. Usually used by the
46     // page to navigate to privileged destinations (e.g. chrome:// URLs) or to
47     // navigate to URLs that are hidden from the page using Restricted IDs (rid
48     // in the API).
49     virtual void NavigateToURL(const GURL& url,
50                                WindowOpenDisposition disposition,
51                                bool is_most_visited_item_url) = 0;
52
53     // Called when the SearchBox wants to delete a Most Visited item.
54     virtual void OnDeleteMostVisitedItem(const GURL& url) = 0;
55
56     // Called when the SearchBox wants to undo a Most Visited deletion.
57     virtual void OnUndoMostVisitedDeletion(const GURL& url) = 0;
58
59     // Called when the SearchBox wants to undo all Most Visited deletions.
60     virtual void OnUndoAllMostVisitedDeletions() = 0;
61
62     // Called to signal that an event has occurred on the New Tab Page.
63     virtual void OnLogEvent(NTPLoggingEventType event) = 0;
64
65     // Called to log an impression from a given provider on the New Tab Page.
66     virtual void OnLogMostVisitedImpression(int position,
67                                             const base::string16& provider) = 0;
68
69     // Called to log a navigation from a given provider on the New Tab Page.
70     virtual void OnLogMostVisitedNavigation(int position,
71                                             const base::string16& provider) = 0;
72
73     // Called when the page wants to paste the |text| (or the clipboard contents
74     // if the |text| is empty) into the omnibox.
75     virtual void PasteIntoOmnibox(const base::string16& text) = 0;
76
77     // Called when the SearchBox wants to verify the signed-in Chrome identity
78     // against the provided |identity|. Will make a round-trip to the browser
79     // and eventually return the result through SendChromeIdentityCheckResult.
80     // Calls SendChromeIdentityCheckResult with true if both the identity
81     // matches and the user syncs their history.
82     // TODO(beaudoin): Change this function name and related APIs now that it's
83     // checking both the identity and the user's sync state.
84     virtual void OnChromeIdentityCheck(const base::string16& identity) = 0;
85   };
86
87   // An interface to be implemented by consumers of SearchIPCRouter objects to
88   // decide whether to process the message received from the page, and vice
89   // versa (decide whether to send messages to the page).
90   class Policy {
91    public:
92     virtual ~Policy() {}
93
94     // SearchIPCRouter calls these functions before sending/receiving messages
95     // to/from the page.
96     virtual bool ShouldProcessSetVoiceSearchSupport() = 0;
97     virtual bool ShouldProcessFocusOmnibox(bool is_active_tab) = 0;
98     virtual bool ShouldProcessNavigateToURL(bool is_active_tab) = 0;
99     virtual bool ShouldProcessDeleteMostVisitedItem() = 0;
100     virtual bool ShouldProcessUndoMostVisitedDeletion() = 0;
101     virtual bool ShouldProcessUndoAllMostVisitedDeletions() = 0;
102     virtual bool ShouldProcessLogEvent() = 0;
103     virtual bool ShouldProcessPasteIntoOmnibox(bool is_active_tab) = 0;
104     virtual bool ShouldProcessChromeIdentityCheck() = 0;
105     virtual bool ShouldSendSetPromoInformation() = 0;
106     virtual bool ShouldSendSetDisplayInstantResults() = 0;
107     virtual bool ShouldSendSetSuggestionToPrefetch() = 0;
108     virtual bool ShouldSendSetOmniboxStartMargin() = 0;
109     virtual bool ShouldSendSetInputInProgress(bool is_active_tab) = 0;
110     virtual bool ShouldSendOmniboxFocusChanged() = 0;
111     virtual bool ShouldSendMostVisitedItems() = 0;
112     virtual bool ShouldSendThemeBackgroundInfo() = 0;
113     virtual bool ShouldSendToggleVoiceSearch() = 0;
114     virtual bool ShouldSubmitQuery() = 0;
115   };
116
117   SearchIPCRouter(content::WebContents* web_contents, Delegate* delegate,
118                   scoped_ptr<Policy> policy);
119   ~SearchIPCRouter() override;
120
121   // Tells the SearchIPCRouter that a new page in an Instant process committed.
122   void OnNavigationEntryCommitted();
123
124   // Tells the renderer to determine if the page supports the Instant API, which
125   // results in a call to OnInstantSupportDetermined() when the reply is
126   // received.
127   void DetermineIfPageSupportsInstant();
128
129   // Tells the renderer about the result of the Chrome identity check.
130   void SendChromeIdentityCheckResult(const base::string16& identity,
131                                      bool identity_match);
132
133   // Tells the renderer information it needs to display promos.
134   void SetPromoInformation(bool is_app_launcher_enabled);
135
136   // Tells the renderer whether to display the Instant results.
137   void SetDisplayInstantResults();
138
139   // Tells the page the suggestion to be prefetched if any.
140   void SetSuggestionToPrefetch(const InstantSuggestion& suggestion);
141
142   // Tells the page the left margin of the omnibox. This is used by the page to
143   // align text or assets properly with the omnibox.
144   void SetOmniboxStartMargin(int start_margin);
145
146   // Tells the page that user input started or stopped.
147   void SetInputInProgress(bool input_in_progress);
148
149   // Tells the page that the omnibox focus has changed.
150   void OmniboxFocusChanged(OmniboxFocusState state,
151                            OmniboxFocusChangeReason reason);
152
153   // Tells the renderer about the most visited items.
154   void SendMostVisitedItems(const std::vector<InstantMostVisitedItem>& items);
155
156   // Tells the renderer about the current theme background.
157   void SendThemeBackgroundInfo(const ThemeBackgroundInfo& theme_info);
158
159   // Tells the page to toggle voice search.
160   void ToggleVoiceSearch();
161
162   // Tells the page that the user pressed Enter in the omnibox.
163   void Submit(const base::string16& text,
164               const EmbeddedSearchRequestParams& params);
165
166   // Called when the tab corresponding to |this| instance is activated.
167   void OnTabActivated();
168
169   // Called when the tab corresponding to |this| instance is deactivated.
170   void OnTabDeactivated();
171
172  private:
173   friend class SearchIPCRouterPolicyTest;
174   friend class SearchIPCRouterTest;
175   FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
176                            DetermineIfPageSupportsInstant_Local);
177   FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
178                            DetermineIfPageSupportsInstant_NonLocal);
179   FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
180                            PageURLDoesntBelongToInstantRenderer);
181   FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest,
182                            IgnoreMessageIfThePageIsNotActive);
183   FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest,
184                            DoNotSendSetDisplayInstantResultsMsg);
185   FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest, HandleTabChangedEvents);
186
187   // Overridden from contents::WebContentsObserver:
188   bool OnMessageReceived(const IPC::Message& message) override;
189
190   void OnInstantSupportDetermined(int page_seq_no, bool supports_instant) const;
191   void OnVoiceSearchSupportDetermined(int page_id,
192                                       bool supports_voice_search) const;
193   void OnFocusOmnibox(int page_id, OmniboxFocusState state) const;
194   void OnSearchBoxNavigate(int page_id,
195                            const GURL& url,
196                            WindowOpenDisposition disposition,
197                            bool is_most_visited_item_url) const;
198   void OnDeleteMostVisitedItem(int page_seq_no, const GURL& url) const;
199   void OnUndoMostVisitedDeletion(int page_seq_no, const GURL& url) const;
200   void OnUndoAllMostVisitedDeletions(int page_seq_no) const;
201   void OnLogEvent(int page_seq_no, NTPLoggingEventType event) const;
202   void OnLogMostVisitedImpression(int page_seq_no,
203                                   int position,
204                                   const base::string16& provider) const;
205   void OnLogMostVisitedNavigation(int page_seq_no,
206                                   int position,
207                                   const base::string16& provider) const;
208   void OnPasteAndOpenDropDown(int page_seq_no,
209                               const base::string16& text) const;
210   void OnChromeIdentityCheck(int page_seq_no,
211                              const base::string16& identity) const;
212
213   // Used by unit tests to set a fake delegate.
214   void set_delegate_for_testing(Delegate* delegate);
215
216   // Used by unit tests.
217   void set_policy_for_testing(scoped_ptr<Policy> policy);
218
219   // Used by unit tests.
220   Policy* policy_for_testing() const { return policy_.get(); }
221
222   // Used by unit tests.
223   int page_seq_no_for_testing() const { return commit_counter_; }
224
225   Delegate* delegate_;
226   scoped_ptr<Policy> policy_;
227
228   // Holds the number of main frame commits executed in this tab. Used by the
229   // SearchIPCRouter to ensure that delayed IPC replies are ignored.
230   int commit_counter_;
231
232   // Set to true, when the tab corresponding to |this| instance is active.
233   bool is_active_tab_;
234
235   DISALLOW_COPY_AND_ASSIGN(SearchIPCRouter);
236 };
237
238 #endif  // CHROME_BROWSER_UI_SEARCH_SEARCH_IPC_ROUTER_H_