search_tab_helper.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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. 4 5#ifndef CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_ 6#define CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_ 7 8#include <vector> 9 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" 21 22namespace content { 23class WebContents; 24struct LoadCommittedDetails; 25} 26 27class GURL; 28class InstantPageTest; 29class InstantService; 30class Profile; 31class SearchIPCRouterTest; 32 33// Per-tab search "helper". Acts as the owner and controller of the tab's 34// search UI model. 35// 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. 40class SearchTabHelper : public content::WebContentsObserver, 41 public content::WebContentsUserData<SearchTabHelper>, 42 public InstantServiceObserver, 43 public SearchIPCRouter::Delegate { 44 public: 45 virtual ~SearchTabHelper(); 46 47 SearchModel* model() { 48 return &model_; 49 } 50 51 // Sets up the initial state correctly for a preloaded NTP. 52 void InitForPreloadedNTP(); 53 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); 57 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(); 63 64 // Invoked to update the instant support state. 65 void InstantSupportChanged(bool supports_instant); 66 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; 70 71 // Sends the current SearchProvider suggestion to the Instant page if any. 72 void SetSuggestionToPrefetch(const InstantSuggestion& suggestion); 73 74 // Tells the page that the user pressed Enter in the omnibox. 75 void Submit(const base::string16& text); 76 77 // Called when the tab corresponding to |this| instance is activated. 78 void OnTabActivated(); 79 80 // Called when the tab corresponding to |this| instance is deactivated. 81 void OnTabDeactivated(); 82 83 // Tells the page to toggle voice search. 84 void ToggleVoiceSearch(); 85 86 // Returns true if the underlying page is a search results page. 87 bool IsSearchResultsPage(); 88 89 private: 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); 126 127 explicit SearchTabHelper(content::WebContents* web_contents); 128 129 // Overridden from contents::WebContentsObserver: 130 virtual void RenderViewCreated( 131 content::RenderViewHost* render_view_host) OVERRIDE; 132 virtual void DidStartNavigationToPendingEntry( 133 const GURL& url, 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( 139 int64 frame_id, 140 const base::string16& frame_unique_name, 141 bool is_main_frame, 142 const GURL& validated_url, 143 int error_code, 144 const base::string16& error_description, 145 content::RenderViewHost* render_view_host) OVERRIDE; 146 virtual void DidFinishLoad( 147 int64 frame_id, 148 const GURL& validated_url, 149 bool is_main_frame, 150 content::RenderViewHost* render_view_host) OVERRIDE; 151 virtual void NavigationEntryCommitted( 152 const content::LoadCommittedDetails& load_details) OVERRIDE; 153 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; 169 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; 175 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); 180 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); 187 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 190 // received. 191 void DetermineIfPageSupportsInstant(); 192 193 // Used by unit tests. 194 SearchIPCRouter& ipc_router() { return ipc_router_; } 195 196 Profile* profile() const; 197 198 // Helper function to navigate the given contents to the local fallback 199 // Instant URL and trim the history correctly. 200 void RedirectToLocalNTP(); 201 202 const bool is_search_enabled_; 203 204 // Tracks the last value passed to OmniboxEditModelChanged(). 205 bool user_input_in_progress_; 206 207 // Model object for UI that cares about search state. 208 SearchModel model_; 209 210 content::WebContents* web_contents_; 211 212 SearchIPCRouter ipc_router_; 213 214 InstantService* instant_service_; 215 216 DISALLOW_COPY_AND_ASSIGN(SearchTabHelper); 217}; 218 219#endif // CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_ 220