12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <vector> 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/gtest_prod_util.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/search/instant_service_observer.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/search/search_ipc_router.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search/search_model.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/instant_types.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/ntp_logging_events.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/omnibox_focus_state.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h" 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/base/window_open_disposition.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct LoadCommittedDetails; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class GURL; 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass InstantPageTest; 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class InstantService; 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass OmniboxView; 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class Profile; 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class SearchIPCRouterTest; 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass SearchTabHelperDelegate; 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Per-tab search "helper". Acts as the owner and controller of the tab's 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// search UI model. 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// When the page is finished loading, SearchTabHelper determines the instant 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// support for the page. When a navigation entry is committed (except for 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in-page navigations), SearchTabHelper resets the instant support state to 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// INSTANT_SUPPORT_UNKNOWN and cause support to be determined again. 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SearchTabHelper : public content::WebContentsObserver, 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public content::WebContentsUserData<SearchTabHelper>, 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public InstantServiceObserver, 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public SearchIPCRouter::Delegate { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SearchTabHelper(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SearchModel* model() { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &model_; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Sets up the initial state correctly for a preloaded NTP. 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void InitForPreloadedNTP(); 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Invoked when the omnibox input state is changed in some way that might 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // affect the search mode. 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OmniboxInputStateChanged(); 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called to indicate that the omnibox focus state changed with the given 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // |reason|. 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OmniboxFocusChanged(OmniboxFocusState state, 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OmniboxFocusChangeReason reason); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoked when the active navigation entry is updated in some way that might 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // affect the search mode. This is used by Instant when it "fixes up" the 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // virtual URL of the active entry. Regular navigations are captured through 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the notification system and shouldn't call this method. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigationEntryUpdated(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Invoked to update the instant support state. 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void InstantSupportChanged(bool supports_instant); 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Returns true if the page supports instant. If the instant support state is 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // not determined or if the page does not support instant returns false. 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool SupportsInstant() const; 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Sends the current SearchProvider suggestion to the Instant page if any. 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void SetSuggestionToPrefetch(const InstantSuggestion& suggestion); 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Tells the page that the user pressed Enter in the omnibox. 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void Submit(const base::string16& text); 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Called when the tab corresponding to |this| instance is activated. 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void OnTabActivated(); 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Called when the tab corresponding to |this| instance is deactivated. 891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void OnTabDeactivated(); 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Tells the page to toggle voice search. 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ToggleVoiceSearch(); 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns true if the underlying page is a search results page. 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool IsSearchResultsPage(); 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void set_delegate(SearchTabHelperDelegate* delegate) { delegate_ = delegate; } 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class content::WebContentsUserData<SearchTabHelper>; 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch friend class InstantPageTest; 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) friend class SearchIPCRouterPolicyTest; 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) friend class SearchIPCRouterTest; 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch friend class SearchTabHelperPrerenderTest; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DetermineIfPageSupportsInstant_Local); 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DetermineIfPageSupportsInstant_NonLocal); 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PageURLDoesntBelongToInstantRenderer); 1120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, 1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnChromeIdentityCheckMatch); 1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, 1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnChromeIdentityCheckMismatch); 1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, 1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnChromeIdentityCheckSignedOutMatch); 1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, 1190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) OnChromeIdentityCheckSignedOutMismatch); 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperTest, 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnChromeIdentityCheckMatchNotSyncing); 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperWindowTest, 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnProvisionalLoadFailRedirectNTPToLocal); 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperWindowTest, 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) OnProvisionalLoadFailDontRedirectIfAborted); 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchTabHelperWindowTest, 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OnProvisionalLoadFailDontRedirectNonNTP); 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest, 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) IgnoreMessageIfThePageIsNotActive); 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest, 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DoNotSendSetDisplayInstantResultsMsg); 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(SearchIPCRouterTest, HandleTabChangedEvents); 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FRIEND_TEST_ALL_PREFIXES(InstantPageTest, 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetermineIfPageSupportsInstant_Local); 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FRIEND_TEST_ALL_PREFIXES(InstantPageTest, 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DetermineIfPageSupportsInstant_NonLocal); 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FRIEND_TEST_ALL_PREFIXES(InstantPageTest, 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PageURLDoesntBelongToInstantRenderer); 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FRIEND_TEST_ALL_PREFIXES(InstantPageTest, PageSupportsInstant); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit SearchTabHelper(content::WebContents* web_contents); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from contents::WebContentsObserver: 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void RenderViewCreated( 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidStartNavigationToPendingEntry( 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const GURL& url, 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NavigationController::ReloadType reload_type) OVERRIDE; 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void DidNavigateMainFrame( 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const content::LoadCommittedDetails& details, 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const content::FrameNavigateParams& params) OVERRIDE; 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void DidFailProvisionalLoad( 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RenderFrameHost* render_frame_host, 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const GURL& validated_url, 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int error_code, 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::string16& error_description) OVERRIDE; 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void DidFinishLoad(content::RenderFrameHost* render_frame_host, 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GURL& validated_url) OVERRIDE; 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void NavigationEntryCommitted( 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const content::LoadCommittedDetails& load_details) OVERRIDE; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Overridden from SearchIPCRouter::Delegate: 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnInstantSupportDetermined(bool supports_instant) OVERRIDE; 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnSetVoiceSearchSupport(bool supports_voice_search) OVERRIDE; 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void FocusOmnibox(OmniboxFocusState state) OVERRIDE; 1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void NavigateToURL(const GURL& url, 1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WindowOpenDisposition disposition, 1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool is_most_visited_item_url) OVERRIDE; 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnDeleteMostVisitedItem(const GURL& url) OVERRIDE; 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnUndoMostVisitedDeletion(const GURL& url) OVERRIDE; 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnUndoAllMostVisitedDeletions() OVERRIDE; 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void OnLogEvent(NTPLoggingEventType event) OVERRIDE; 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnLogMostVisitedImpression( 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int position, const base::string16& provider) OVERRIDE; 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnLogMostVisitedNavigation( 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int position, const base::string16& provider) OVERRIDE; 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void PasteIntoOmnibox(const base::string16& text) OVERRIDE; 178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnChromeIdentityCheck(const base::string16& identity) OVERRIDE; 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Overridden from InstantServiceObserver: 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void ThemeInfoChanged(const ThemeBackgroundInfo& theme_info) OVERRIDE; 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void MostVisitedItemsChanged( 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::vector<InstantMostVisitedItem>& items) OVERRIDE; 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OmniboxStartMarginChanged(int omnibox_start_margin) OVERRIDE; 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the mode of the model based on the current URL of web_contents(). 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Only updates the origin part of the mode if |update_origin| is true, 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // otherwise keeps the current origin. If |is_preloaded_ntp| is true, the mode 189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // is set to NTP regardless of the current URL; this is used to ensure that 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // InstantController can bind InstantTab to new tab pages immediately. 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void UpdateMode(bool update_origin, bool is_preloaded_ntp); 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Tells the renderer to determine if the page supports the Instant API, which 19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // results in a call to OnInstantSupportDetermined() when the reply is 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // received. 196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void DetermineIfPageSupportsInstant(); 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Used by unit tests. 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SearchIPCRouter& ipc_router() { return ipc_router_; } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Profile* profile() const; 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Helper function to navigate the given contents to the local fallback 20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Instant URL and trim the history correctly. 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void RedirectToLocalNTP(); 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns whether input is in progress, i.e. if the omnibox has focus and the 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // active tab is in mode SEARCH_SUGGESTIONS. 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool IsInputInProgress() const; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Returns the OmniboxView for |web_contents_| or NULL if not available. 212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch OmniboxView* GetOmniboxView() const; 213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef bool (*OmniboxHasFocusFn)(OmniboxView*); 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void set_omnibox_has_focus_fn(OmniboxHasFocusFn fn) { 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch omnibox_has_focus_fn_ = fn; 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const bool is_search_enabled_; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Model object for UI that cares about search state. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SearchModel model_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents_; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) SearchIPCRouter ipc_router_; 22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InstantService* instant_service_; 2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Delegate for notifying our owner about the SearchTabHelper state. Not owned 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // by us. 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // NULL on iOS and Android because they don't use the Instant framework. 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SearchTabHelperDelegate* delegate_; 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Function to check if the omnibox has focus. Tests use this to modify the 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // default behavior. 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OmniboxHasFocusFn omnibox_has_focus_fn_; 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SearchTabHelper); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_SEARCH_SEARCH_TAB_HELPER_H_ 244