| Index: chrome/browser/instant/instant_controller.h | 
| diff --git a/chrome/browser/instant/instant_controller.h b/chrome/browser/instant/instant_controller.h | 
| index 436f9866560268177df9731e72a553709fb0e405..5830643e731b1ee58f7b220e76cb0334df918914 100644 | 
| --- a/chrome/browser/instant/instant_controller.h | 
| +++ b/chrome/browser/instant/instant_controller.h | 
| @@ -27,14 +27,18 @@ | 
| struct AutocompleteMatch; | 
| class AutocompleteProvider; | 
| class InstantLoader; | 
| -class TabContents; | 
| +class InstantTab; | 
| class TemplateURL; | 
| -struct ThemeBackgroundInfo; | 
| + | 
|  | 
| namespace chrome { | 
| class BrowserInstantController; | 
| } | 
|  | 
| +namespace content { | 
| +class WebContents; | 
| +} | 
| + | 
| // InstantController maintains a WebContents that is intended to give a preview | 
| // of search suggestions and results. InstantController is owned by Browser via | 
| // BrowserInstantController. | 
| @@ -69,10 +73,10 @@ class InstantController { | 
| // handled the key press. | 
| bool OnUpOrDownKeyPressed(int count); | 
|  | 
| -  // The preview TabContents. May be NULL if ReleasePreviewContents() has been | 
| -  // called, with no subsequent successful call to Update(). InstantController | 
| -  // retains ownership of the object. | 
| -  TabContents* GetPreviewContents() const; | 
| +  // The preview WebContents. May be NULL if CommitIfCurrent() has been called, | 
| +  // with no subsequent successful call to Update(). InstantController retains | 
| +  // ownership of the object. | 
| +  content::WebContents* GetPreviewContents() const; | 
|  | 
| // Returns true if the Instant preview can be committed now. | 
| bool IsCurrent() const; | 
| @@ -89,11 +93,13 @@ class InstantController { | 
| void OmniboxGotFocus(); | 
|  | 
| // The search mode in the active tab has changed. Pass the message down to | 
| -  // the loader which will notify the renderer. | 
| +  // the loader which will notify the renderer. Create |instant_tab_| if the | 
| +  // |new_mode| reflects an Instant search results page. | 
| void SearchModeChanged(const chrome::search::Mode& old_mode, | 
| const chrome::search::Mode& new_mode); | 
|  | 
| -  // The user switched tabs. Hide the preview if needed. | 
| +  // The user switched tabs. Hide the preview if needed. Create |instant_tab_| | 
| +  // if the newly active tab is an Instant search results page. | 
| void ActiveTabChanged(); | 
|  | 
| // Sets whether Instant should show result previews. | 
| @@ -114,37 +120,30 @@ class InstantController { | 
|  | 
| const InstantModel* model() const { return &model_; } | 
|  | 
| -  // Invoked by InstantLoader when it has suggested text. | 
| -  void SetSuggestions(InstantLoader* loader, | 
| +  // Invoked by the page when it has suggested text. | 
| +  void SetSuggestions(const content::WebContents* contents, | 
| const std::vector<InstantSuggestion>& suggestions); | 
|  | 
| -  // Invoked by InstantLoader to commit the preview. | 
| -  void CommitInstantLoader(InstantLoader* loader); | 
| +  // Invoked by the page when its support for the Instant API is determined. | 
| +  void InstantSupportDetermined(const content::WebContents* contents, | 
| +                                bool supports_instant); | 
|  | 
| // Invoked by InstantLoader to request that the preview be shown. | 
| -  void ShowInstantPreview(InstantLoader* loader, | 
| -                          InstantShownReason reason, | 
| +  void ShowInstantPreview(InstantShownReason reason, | 
| int height, | 
| InstantSizeUnits units); | 
|  | 
| -  // Invoked by InstantLoader when it has determined whether or not the page | 
| -  // supports the Instant API. | 
| -  void InstantSupportDetermined(InstantLoader* loader, bool supports_instant); | 
| - | 
| -  // Invoked by InstantLoader when it has swapped a different TabContents into | 
| +  // Invoked by InstantLoader when it has swapped a different WebContents into | 
| // the preview, usually because a prerendered page was navigated to. | 
| -  void SwappedTabContents(InstantLoader* loader); | 
| +  void SwappedWebContents(); | 
|  | 
| // Invoked by InstantLoader when the preview gains focus, usually due to the | 
| // user clicking on it. | 
| -  void InstantLoaderContentsFocused(InstantLoader* loader); | 
| - | 
| -#if defined(UNIT_TEST) | 
| -  // Accessors used only in tests. | 
| -  InstantLoader* loader() const { return loader_.get(); } | 
| -#endif | 
| +  void InstantLoaderContentsFocused(); | 
|  | 
| private: | 
| +  FRIEND_TEST_ALL_PREFIXES(InstantTest, OmniboxFocusLoadsInstant); | 
| +  FRIEND_TEST_ALL_PREFIXES(InstantTest, NonInstantSearchProvider); | 
| FRIEND_TEST_ALL_PREFIXES(InstantTest, InstantLoaderRefresh); | 
|  | 
| // Creates a new loader if necessary, using the instant_url property of the | 
| @@ -152,7 +151,7 @@ class InstantController { | 
| // time the loader was created). Returns false if the |template_url| doesn't | 
| // have a valid Instant URL; true otherwise. | 
| bool ResetLoader(const TemplateURL* template_url, | 
| -                   const TabContents* active_tab); | 
| +                   const content::WebContents* active_tab); | 
|  | 
| // Ensures that the |loader_| uses the default Instant URL, recreating it if | 
| // necessary, and returns true. Returns false if the Instant URL could not be | 
| @@ -164,16 +163,20 @@ class InstantController { | 
| // deleted and recreated. Else the refresh is skipped. | 
| void OnStaleLoader(); | 
|  | 
| -  // Destroys the |loader_| and its preview contents. | 
| -  void DeleteLoader(); | 
| +  // If the active tab is an Instant search results page, sets |instant_tab_| to | 
| +  // point to it. Else, deletes any existing |instant_tab_|. | 
| +  void ResetInstantTab(); | 
| + | 
| +  // Hide the preview. Also sends an onchange event (with blank query) to the | 
| +  // preview, telling it to clear out results for any old queries. | 
| +  void Hide(); | 
|  | 
| -  // Hide the preview. If |clear_query| is true, clears query text and sends a | 
| -  // an onchange event (with blank query) to the preview, telling it to clear | 
| -  // out results for any old queries. | 
| -  void Hide(bool clear_query); | 
| +  // Like Hide(), but doesn't call OnStaleLoader(). You'll almost always want | 
| +  // Hide(). Use this only if you are going to call loader_.reset() afterwards. | 
| +  void HideInternal(); | 
|  | 
| -  // Counterpart to Hide(). Asks the |browser_| to display the preview with | 
| -  // the given |height|. | 
| +  // Counterpart to Hide(). Asks the |browser_| to display the preview with the | 
| +  // given |height|. | 
| void Show(InstantShownReason reason, int height, InstantSizeUnits units); | 
|  | 
| // Send the omnibox dropdown bounds to the page. | 
| @@ -193,10 +196,17 @@ class InstantController { | 
| const bool extended_enabled_; | 
| bool instant_enabled_; | 
|  | 
| +  // The state of the preview page, i.e., the page owned by |loader_|. Ignored | 
| +  // if |instant_tab_| is in use. | 
| InstantModel model_; | 
|  | 
| +  // The preview WebContents. | 
| scoped_ptr<InstantLoader> loader_; | 
|  | 
| +  // A committed WebContents that supports Instant. If non-NULL, messages will | 
| +  // be sent to this, instead of |loader_| (which will be hidden). | 
| +  scoped_ptr<InstantTab> instant_tab_; | 
| + | 
| // The most recent user_text passed to Update(). | 
| string16 last_user_text_; | 
|  | 
| @@ -248,8 +258,7 @@ class InstantController { | 
| GURL url_for_history_; | 
|  | 
| // The timestamp at which query editing began. This value is used when the | 
| -  // first set of suggestions is processed and cleared when the overlay is | 
| -  // hidden. | 
| +  // preview is showed and cleared when the preview is hidden. | 
| base::Time first_interaction_time_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(InstantController); | 
|  |