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 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
|
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_SEARCH_SEARCH_IPC_ROUTER_H_
#define CHROME_BROWSER_UI_SEARCH_SEARCH_IPC_ROUTER_H_
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/common/instant_types.h"
#include "chrome/common/ntp_logging_events.h"
#include "chrome/common/omnibox_focus_state.h"
#include "content/public/browser/web_contents_observer.h"
#include "ui/base/window_open_disposition.h"
class GURL;
namespace content {
class WebContents;
}
class SearchIPCRouterTest;
// SearchIPCRouter is responsible for receiving and sending IPC messages between
// the browser and the Instant page.
class SearchIPCRouter : public content::WebContentsObserver {
public:
// SearchIPCRouter calls its delegate in response to messages received from
// the page.
class Delegate {
public:
// Called upon determination of Instant API support in response to the page
// load event.
virtual void OnInstantSupportDetermined(bool supports_instant) = 0;
// Called upon determination of voice search API support.
virtual void OnSetVoiceSearchSupport(bool supports_voice_search) = 0;
// Called when the page wants the omnibox to be focused. |state| specifies
// the omnibox focus state.
virtual void FocusOmnibox(OmniboxFocusState state) = 0;
// Called when the page wants to navigate to |url|. Usually used by the
// page to navigate to privileged destinations (e.g. chrome:// URLs) or to
// navigate to URLs that are hidden from the page using Restricted IDs (rid
// in the API).
virtual void NavigateToURL(const GURL& url,
WindowOpenDisposition disposition,
bool is_most_visited_item_url) = 0;
// Called when the SearchBox wants to delete a Most Visited item.
virtual void OnDeleteMostVisitedItem(const GURL& url) = 0;
// Called when the SearchBox wants to undo a Most Visited deletion.
virtual void OnUndoMostVisitedDeletion(const GURL& url) = 0;
// Called when the SearchBox wants to undo all Most Visited deletions.
virtual void OnUndoAllMostVisitedDeletions() = 0;
// Called to signal that an event has occurred on the New Tab Page.
virtual void OnLogEvent(NTPLoggingEventType event) = 0;
// Called to log an impression from a given provider on the New Tab Page.
virtual void OnLogMostVisitedImpression(int position,
const base::string16& provider) = 0;
// Called to log a navigation from a given provider on the New Tab Page.
virtual void OnLogMostVisitedNavigation(int position,
const base::string16& provider) = 0;
// Called when the page wants to paste the |text| (or the clipboard contents
// if the |text| is empty) into the omnibox.
virtual void PasteIntoOmnibox(const base::string16& text) = 0;
// Called when the SearchBox wants to verify the signed-in Chrome identity
// against the provided |identity|. Will make a round-trip to the browser
// and eventually return the result through SendChromeIdentityCheckResult.
// Calls SendChromeIdentityCheckResult with true if both the identity
// matches and the user syncs their history.
// TODO(beaudoin): Change this function name and related APIs now that it's
// checking both the identity and the user's sync state.
virtual void OnChromeIdentityCheck(const base::string16& identity) = 0;
};
// An interface to be implemented by consumers of SearchIPCRouter objects to
// decide whether to process the message received from the page, and vice
// versa (decide whether to send messages to the page).
class Policy {
public:
virtual ~Policy() {}
// SearchIPCRouter calls these functions before sending/receiving messages
// to/from the page.
virtual bool ShouldProcessSetVoiceSearchSupport() = 0;
virtual bool ShouldProcessFocusOmnibox(bool is_active_tab) = 0;
virtual bool ShouldProcessNavigateToURL(bool is_active_tab) = 0;
virtual bool ShouldProcessDeleteMostVisitedItem() = 0;
virtual bool ShouldProcessUndoMostVisitedDeletion() = 0;
virtual bool ShouldProcessUndoAllMostVisitedDeletions() = 0;
virtual bool ShouldProcessLogEvent() = 0;
virtual bool ShouldProcessPasteIntoOmnibox(bool is_active_tab) = 0;
virtual bool ShouldProcessChromeIdentityCheck() = 0;
virtual bool ShouldSendSetPromoInformation() = 0;
virtual bool ShouldSendSetDisplayInstantResults() = 0;
virtual bool ShouldSendSetSuggestionToPrefetch() = 0;
virtual bool ShouldSendSetOmniboxStartMargin() = 0;
virtual bool ShouldSendSetInputInProgress(bool is_active_tab) = 0;
virtual bool ShouldSendOmniboxFocusChanged() = 0;
virtual bool ShouldSendMostVisitedItems() = 0;
virtual bool ShouldSendThemeBackgroundInfo() = 0;
virtual bool ShouldSendToggleVoiceSearch() = 0;
virtual bool ShouldSubmitQuery() = 0;
};
SearchIPCRouter(content::WebContents* web_contents, Delegate* delegate,
scoped_ptr<Policy> policy);
virtual ~SearchIPCRouter();
// Tells the SearchIPCRouter that a new page in an Instant process committed.
void OnNavigationEntryCommitted();
// Tells the renderer to determine if the page supports the Instant API, which
// results in a call to OnInstantSupportDetermined() when the reply is
// received.
void DetermineIfPageSupportsInstant();
// Tells the renderer about the result of the Chrome identity check.
void SendChromeIdentityCheckResult(const base::string16& identity,
bool identity_match);
// Tells the renderer information it needs to display promos.
void SetPromoInformation(bool is_app_launcher_enabled);
// Tells the renderer whether to display the Instant results.
void SetDisplayInstantResults();
// Tells the page the suggestion to be prefetched if any.
void SetSuggestionToPrefetch(const InstantSuggestion& suggestion);
// Tells the page the left margin of the omnibox. This is used by the page to
// align text or assets properly with the omnibox.
void SetOmniboxStartMargin(int start_margin);
// Tells the page that user input started or stopped.
void SetInputInProgress(bool input_in_progress);
// Tells the page that the omnibox focus has changed.
void OmniboxFocusChanged(OmniboxFocusState state,
OmniboxFocusChangeReason reason);
// Tells the renderer about the most visited items.
void SendMostVisitedItems(const std::vector<InstantMostVisitedItem>& items);
// Tells the renderer about the current theme background.
void SendThemeBackgroundInfo(const ThemeBackgroundInfo& theme_info);
// Tells the page to toggle voice search.
void ToggleVoiceSearch();
// Tells the page that the user pressed Enter in the omnibox.
void Submit(const base::string16& text);
// Called when the tab corresponding to |this| instance is activated.
void OnTabActivated();
// Called when the tab corresponding to |this| instance is deactivated.
void OnTabDeactivated();
private:
friend class SearchIPCRouterPolicyTest;
friend class SearchIPCRouterTest;
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
DetermineIfPageSupportsInstant_Local);
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
DetermineIfPageSupportsInstant_NonLocal);
FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest,
PageURLDoesntBelongToInstantRenderer);
FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest,
IgnoreMessageIfThePageIsNotActive);
FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest,
DoNotSendSetDisplayInstantResultsMsg);
FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest, HandleTabChangedEvents);
// Overridden from contents::WebContentsObserver:
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
void OnInstantSupportDetermined(int page_seq_no, bool supports_instant) const;
void OnVoiceSearchSupportDetermined(int page_id,
bool supports_voice_search) const;
void OnFocusOmnibox(int page_id, OmniboxFocusState state) const;
void OnSearchBoxNavigate(int page_id,
const GURL& url,
WindowOpenDisposition disposition,
bool is_most_visited_item_url) const;
void OnDeleteMostVisitedItem(int page_seq_no, const GURL& url) const;
void OnUndoMostVisitedDeletion(int page_seq_no, const GURL& url) const;
void OnUndoAllMostVisitedDeletions(int page_seq_no) const;
void OnLogEvent(int page_seq_no, NTPLoggingEventType event) const;
void OnLogMostVisitedImpression(int page_seq_no,
int position,
const base::string16& provider) const;
void OnLogMostVisitedNavigation(int page_seq_no,
int position,
const base::string16& provider) const;
void OnPasteAndOpenDropDown(int page_seq_no,
const base::string16& text) const;
void OnChromeIdentityCheck(int page_seq_no,
const base::string16& identity) const;
// Used by unit tests to set a fake delegate.
void set_delegate_for_testing(Delegate* delegate);
// Used by unit tests.
void set_policy_for_testing(scoped_ptr<Policy> policy);
// Used by unit tests.
Policy* policy_for_testing() const { return policy_.get(); }
// Used by unit tests.
int page_seq_no_for_testing() const { return commit_counter_; }
Delegate* delegate_;
scoped_ptr<Policy> policy_;
// Holds the number of main frame commits executed in this tab. Used by the
// SearchIPCRouter to ensure that delayed IPC replies are ignored.
int commit_counter_;
// Set to true, when the tab corresponding to |this| instance is active.
bool is_active_tab_;
DISALLOW_COPY_AND_ASSIGN(SearchIPCRouter);
};
#endif // CHROME_BROWSER_UI_SEARCH_SEARCH_IPC_ROUTER_H_
|