1 // Copyright 2012 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.
5 #ifndef CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_
6 #define CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
12 #include "base/gtest_prod_util.h"
13 #include "chrome/browser/search/instant_service_observer.h"
14 #include "chrome/browser/ui/search/search_ipc_router.h"
15 #include "chrome/browser/ui/search/search_model.h"
16 #include "chrome/common/instant_types.h"
17 #include "chrome/common/ntp_logging_events.h"
18 #include "content/public/browser/web_contents_observer.h"
19 #include "content/public/browser/web_contents_user_data.h"
20 #include "ui/base/window_open_disposition.h"
24 struct LoadCommittedDetails
;
28 class InstantPageTest
;
31 class SearchIPCRouterTest
;
33 // Per-tab search "helper". Acts as the owner and controller of the tab's
36 // When the page is finished loading, SearchTabHelper determines the instant
37 // support for the page. When a navigation entry is committed (except for
38 // in-page navigations), SearchTabHelper resets the instant support state to
39 // INSTANT_SUPPORT_UNKNOWN and cause support to be determined again.
40 class SearchTabHelper
: public content::WebContentsObserver
,
41 public content::WebContentsUserData
<SearchTabHelper
>,
42 public InstantServiceObserver
,
43 public SearchIPCRouter::Delegate
{
45 virtual ~SearchTabHelper();
47 SearchModel
* model() {
51 // Sets up the initial state correctly for a preloaded NTP.
52 void InitForPreloadedNTP();
54 // Invoked when the OmniboxEditModel changes state in some way that might
55 // affect the search mode.
56 void OmniboxEditModelChanged(bool user_input_in_progress
, bool cancelling
);
58 // Invoked when the active navigation entry is updated in some way that might
59 // affect the search mode. This is used by Instant when it "fixes up" the
60 // virtual URL of the active entry. Regular navigations are captured through
61 // the notification system and shouldn't call this method.
62 void NavigationEntryUpdated();
64 // Invoked to update the instant support state.
65 void InstantSupportChanged(bool supports_instant
);
67 // Returns true if the page supports instant. If the instant support state is
68 // not determined or if the page does not support instant returns false.
69 bool SupportsInstant() const;
71 // Sends the current SearchProvider suggestion to the Instant page if any.
72 void SetSuggestionToPrefetch(const InstantSuggestion
& suggestion
);
74 // Tells the page that the user pressed Enter in the omnibox.
75 void Submit(const base::string16
& text
);
77 // Called when the tab corresponding to |this| instance is activated.
78 void OnTabActivated();
80 // Called when the tab corresponding to |this| instance is deactivated.
81 void OnTabDeactivated();
83 // Tells the page to toggle voice search.
84 void ToggleVoiceSearch();
86 // Returns true if the underlying page is a search results page.
87 bool IsSearchResultsPage();
90 friend class content::WebContentsUserData
<SearchTabHelper
>;
91 friend class InstantPageTest
;
92 friend class SearchIPCRouterPolicyTest
;
93 friend class SearchIPCRouterTest
;
94 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest
,
95 DetermineIfPageSupportsInstant_Local
);
96 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest
,
97 DetermineIfPageSupportsInstant_NonLocal
);
98 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest
,
99 PageURLDoesntBelongToInstantRenderer
);
100 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest
,
101 OnChromeIdentityCheckMatch
);
102 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest
,
103 OnChromeIdentityCheckMismatch
);
104 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest
,
105 OnChromeIdentityCheckSignedOutMatch
);
106 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest
,
107 OnChromeIdentityCheckSignedOutMismatch
);
108 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperWindowTest
,
109 OnProvisionalLoadFailRedirectNTPToLocal
);
110 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperWindowTest
,
111 OnProvisionalLoadFailDontRedirectIfAborted
);
112 FRIEND_TEST_ALL_PREFIXES(SearchTabHelperWindowTest
,
113 OnProvisionalLoadFailDontRedirectNonNTP
);
114 FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest
,
115 IgnoreMessageIfThePageIsNotActive
);
116 FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest
,
117 DoNotSendSetDisplayInstantResultsMsg
);
118 FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest
, HandleTabChangedEvents
);
119 FRIEND_TEST_ALL_PREFIXES(InstantPageTest
,
120 DetermineIfPageSupportsInstant_Local
);
121 FRIEND_TEST_ALL_PREFIXES(InstantPageTest
,
122 DetermineIfPageSupportsInstant_NonLocal
);
123 FRIEND_TEST_ALL_PREFIXES(InstantPageTest
,
124 PageURLDoesntBelongToInstantRenderer
);
125 FRIEND_TEST_ALL_PREFIXES(InstantPageTest
, PageSupportsInstant
);
127 explicit SearchTabHelper(content::WebContents
* web_contents
);
129 // Overridden from contents::WebContentsObserver:
130 virtual void RenderViewCreated(
131 content::RenderViewHost
* render_view_host
) OVERRIDE
;
132 virtual void DidStartNavigationToPendingEntry(
134 content::NavigationController::ReloadType reload_type
) OVERRIDE
;
135 virtual void DidNavigateMainFrame(
136 const content::LoadCommittedDetails
& details
,
137 const content::FrameNavigateParams
& params
) OVERRIDE
;
138 virtual void DidFailProvisionalLoad(
140 const base::string16
& frame_unique_name
,
142 const GURL
& validated_url
,
144 const base::string16
& error_description
,
145 content::RenderViewHost
* render_view_host
) OVERRIDE
;
146 virtual void DidFinishLoad(
148 const GURL
& validated_url
,
150 content::RenderViewHost
* render_view_host
) OVERRIDE
;
151 virtual void NavigationEntryCommitted(
152 const content::LoadCommittedDetails
& load_details
) OVERRIDE
;
154 // Overridden from SearchIPCRouter::Delegate:
155 virtual void OnInstantSupportDetermined(bool supports_instant
) OVERRIDE
;
156 virtual void OnSetVoiceSearchSupport(bool supports_voice_search
) OVERRIDE
;
157 virtual void FocusOmnibox(OmniboxFocusState state
) OVERRIDE
;
158 virtual void NavigateToURL(const GURL
& url
,
159 WindowOpenDisposition disposition
,
160 bool is_most_visited_item_url
) OVERRIDE
;
161 virtual void OnDeleteMostVisitedItem(const GURL
& url
) OVERRIDE
;
162 virtual void OnUndoMostVisitedDeletion(const GURL
& url
) OVERRIDE
;
163 virtual void OnUndoAllMostVisitedDeletions() OVERRIDE
;
164 virtual void OnLogEvent(NTPLoggingEventType event
) OVERRIDE
;
165 virtual void OnLogImpression(int position
,
166 const base::string16
& provider
) OVERRIDE
;
167 virtual void PasteIntoOmnibox(const base::string16
& text
) OVERRIDE
;
168 virtual void OnChromeIdentityCheck(const base::string16
& identity
) OVERRIDE
;
170 // Overridden from InstantServiceObserver:
171 virtual void ThemeInfoChanged(const ThemeBackgroundInfo
& theme_info
) OVERRIDE
;
172 virtual void MostVisitedItemsChanged(
173 const std::vector
<InstantMostVisitedItem
>& items
) OVERRIDE
;
174 virtual void OmniboxStartMarginChanged(int omnibox_start_margin
) OVERRIDE
;
176 // Removes recommended URLs if a matching URL is already open in the Browser,
177 // if the Most Visited Tile Placement experiment is enabled, and the client is
178 // in the experiment group.
179 void MaybeRemoveMostVisitedItems(std::vector
<InstantMostVisitedItem
>* items
);
181 // Sets the mode of the model based on the current URL of web_contents().
182 // Only updates the origin part of the mode if |update_origin| is true,
183 // otherwise keeps the current origin. If |is_preloaded_ntp| is true, the mode
184 // is set to NTP regardless of the current URL; this is used to ensure that
185 // InstantController can bind InstantTab to new tab pages immediately.
186 void UpdateMode(bool update_origin
, bool is_preloaded_ntp
);
188 // Tells the renderer to determine if the page supports the Instant API, which
189 // results in a call to OnInstantSupportDetermined() when the reply is
191 void DetermineIfPageSupportsInstant();
193 // Used by unit tests.
194 SearchIPCRouter
& ipc_router() { return ipc_router_
; }
196 Profile
* profile() const;
198 // Helper function to navigate the given contents to the local fallback
199 // Instant URL and trim the history correctly.
200 void RedirectToLocalNTP();
202 const bool is_search_enabled_
;
204 // Tracks the last value passed to OmniboxEditModelChanged().
205 bool user_input_in_progress_
;
207 // Model object for UI that cares about search state.
210 content::WebContents
* web_contents_
;
212 SearchIPCRouter ipc_router_
;
214 InstantService
* instant_service_
;
216 DISALLOW_COPY_AND_ASSIGN(SearchTabHelper
);
219 #endif // CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_