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