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_INSTANT_CONTROLLER_H_ 6 #define CHROME_BROWSER_UI_SEARCH_INSTANT_CONTROLLER_H_ 7 8 #include <list> 9 #include <string> 10 #include <utility> 11 #include <vector> 12 13 #include "base/basictypes.h" 14 #include "base/gtest_prod_util.h" 15 #include "base/memory/scoped_ptr.h" 16 #include "base/strings/string16.h" 17 #include "chrome/browser/ui/search/instant_page.h" 18 #include "chrome/common/search_types.h" 19 #include "ui/gfx/native_widget_types.h" 20 21 class BrowserInstantController; 22 class GURL; 23 class InstantService; 24 class InstantTab; 25 class Profile; 26 27 namespace content { 28 class WebContents; 29 } 30 31 // Macro used for logging debug events. |message| should be a std::string. 32 #define LOG_INSTANT_DEBUG_EVENT(controller, message) \ 33 controller->LogDebugEvent(message) 34 35 // InstantController drives Chrome Instant, i.e., the browser implementation of 36 // the Embedded Search API (see http://dev.chromium.org/embeddedsearch). 37 // 38 // In extended mode, InstantController maintains and coordinates an InstantTab 39 // instance of InstantPage. An InstantTab instance points to the currently 40 // active tab, if it supports the Embedded Search API. InstantTab is backed by a 41 // WebContents and it does not own that WebContents. 42 // 43 // InstantController is owned by Browser via BrowserInstantController. 44 class InstantController : public InstantPage::Delegate { 45 public: 46 explicit InstantController(BrowserInstantController* browser); 47 virtual ~InstantController(); 48 49 // Called if the browser is navigating to a search URL for |search_terms| with 50 // search-term-replacement enabled. If |instant_tab_| can be used to process 51 // the search, this does so and returns true. Else, returns false. 52 bool SubmitQuery(const base::string16& search_terms); 53 54 // The search mode in the active tab has changed. Bind |instant_tab_| if the 55 // |new_mode| reflects an Instant search results page. 56 void SearchModeChanged(const SearchMode& old_mode, 57 const SearchMode& new_mode); 58 59 // The user switched tabs. Bind |instant_tab_| if the newly active tab is an 60 // Instant search results page. 61 void ActiveTabChanged(); 62 63 // The user is about to switch tabs. 64 void TabDeactivated(content::WebContents* contents); 65 66 // Adds a new event to |debug_events_| and also DVLOG's it. Ensures that 67 // |debug_events_| doesn't get too large. 68 void LogDebugEvent(const std::string& info) const; 69 70 // Resets list of debug events. 71 void ClearDebugEvents(); 72 73 // See comments for |debug_events_| below. debug_events()74 const std::list<std::pair<int64, std::string> >& debug_events() { 75 return debug_events_; 76 } 77 78 // Used by BrowserInstantController to notify InstantController about the 79 // instant support change event for the active web contents. 80 void InstantSupportChanged(InstantSupportState instant_support); 81 82 protected: 83 // Accessors are made protected for testing purposes. 84 virtual InstantTab* instant_tab() const; 85 86 virtual Profile* profile() const; 87 88 private: 89 friend class InstantExtendedManualTest; 90 friend class InstantTestBase; 91 92 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, ExtendedModeIsOn); 93 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, MostVisited); 94 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, ProcessIsolation); 95 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, UnrelatedSiteInstance); 96 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, OnDefaultSearchProviderChanged); 97 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, 98 AcceptingURLSearchDoesNotNavigate); 99 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, AcceptingJSSearchDoesNotRunJS); 100 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, 101 ReloadSearchAfterBackReloadsCorrectQuery); 102 FRIEND_TEST_ALL_PREFIXES(InstantExtendedFirstTabTest, 103 RedirectToLocalOnLoadFailure); 104 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, KeyboardTogglesVoiceSearch); 105 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, HomeButtonAffectsMargin); 106 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, SearchReusesInstantTab); 107 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, 108 SearchDoesntReuseInstantTabWithoutSupport); 109 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, 110 TypedSearchURLDoesntReuseInstantTab); 111 FRIEND_TEST_ALL_PREFIXES(InstantExtendedTest, 112 DispatchMVChangeEventWhileNavigatingBackToNTP); 113 114 // Overridden from InstantPage::Delegate: 115 // TODO(shishir): We assume that the WebContent's current RenderViewHost is 116 // the RenderViewHost being created which is not always true. Fix this. 117 virtual void InstantSupportDetermined( 118 const content::WebContents* contents, 119 bool supports_instant) OVERRIDE; 120 virtual void InstantPageAboutToNavigateMainFrame( 121 const content::WebContents* contents, 122 const GURL& url) OVERRIDE; 123 124 // Helper function to navigate the given contents to the local fallback 125 // Instant URL and trim the history correctly. 126 void RedirectToLocalNTP(content::WebContents* contents); 127 128 // Helper for OmniboxFocusChanged. Commit or discard the overlay. 129 void OmniboxLostFocus(gfx::NativeView view_gaining_focus); 130 131 // If the active tab is an Instant search results page, sets |instant_tab_| to 132 // point to it. Else, deletes any existing |instant_tab_|. 133 void ResetInstantTab(); 134 135 // Sends theme info, omnibox bounds, etc. down to the Instant tab. 136 void UpdateInfoForInstantTab(); 137 138 // Returns the InstantService for the browser profile. 139 InstantService* GetInstantService() const; 140 141 BrowserInstantController* const browser_; 142 143 // The instance of InstantPage maintained by InstantController. 144 scoped_ptr<InstantTab> instant_tab_; 145 146 // The search model mode for the active tab. 147 SearchMode search_mode_; 148 149 // List of events and their timestamps, useful in debugging Instant behaviour. 150 mutable std::list<std::pair<int64, std::string> > debug_events_; 151 152 DISALLOW_COPY_AND_ASSIGN(InstantController); 153 }; 154 155 #endif // CHROME_BROWSER_UI_SEARCH_INSTANT_CONTROLLER_H_ 156