1 // Copyright 2013 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_PAGE_H_ 6 #define CHROME_BROWSER_UI_SEARCH_INSTANT_PAGE_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 "base/strings/string16.h" 14 #include "chrome/browser/ui/search/search_model_observer.h" 15 #include "content/public/browser/web_contents_observer.h" 16 #include "ui/base/page_transition_types.h" 17 18 class GURL; 19 class Profile; 20 21 namespace content { 22 struct FrameNavigateParams; 23 struct LoadCommittedDetails; 24 class WebContents; 25 } 26 27 namespace gfx { 28 class Rect; 29 } 30 31 // InstantPage is used to exchange messages with a page that implements the 32 // Instant/Embedded Search API (http://dev.chromium.org/embeddedsearch). 33 // InstantPage is not used directly but via one of its derived classes, 34 // InstantNTP and InstantTab. 35 class InstantPage : public content::WebContentsObserver, 36 public SearchModelObserver { 37 public: 38 // InstantPage calls its delegate in response to messages received from the 39 // page. Each method is called with the |contents| corresponding to the page 40 // we are observing. 41 class Delegate { 42 public: 43 // Called upon determination of Instant API support. Either in response to 44 // the page loading or because we received some other message. 45 virtual void InstantSupportDetermined(const content::WebContents* contents, 46 bool supports_instant) = 0; 47 48 // Called when the page is about to navigate to |url|. 49 virtual void InstantPageAboutToNavigateMainFrame( 50 const content::WebContents* contents, 51 const GURL& url) = 0; 52 53 protected: 54 virtual ~Delegate(); 55 }; 56 57 virtual ~InstantPage(); 58 59 // Returns the Instant URL that was loaded for this page. Returns the empty 60 // string if no URL was explicitly loaded as is the case for InstantTab. 61 virtual const std::string& instant_url() const; 62 63 // Returns true if the page is known to support the Instant API. This starts 64 // out false, and is set to true whenever we get any message from the page. 65 // Once true, it never becomes false (the page isn't expected to drop API 66 // support suddenly). 67 virtual bool supports_instant() const; 68 69 // Returns true if the page is the local NTP (i.e. its URL is 70 // chrome::kChromeSearchLocalNTPURL). 71 virtual bool IsLocal() const; 72 73 protected: 74 InstantPage(Delegate* delegate, const std::string& instant_url, 75 Profile* profile, bool is_incognito); 76 77 // Sets |web_contents| as the page to communicate with. |web_contents| may be 78 // NULL, which effectively stops all communication. 79 void SetContents(content::WebContents* web_contents); 80 delegate()81 Delegate* delegate() const { return delegate_; } 82 profile()83 Profile* profile() const { return profile_; } 84 85 // These functions are called before processing messages received from the 86 // page. By default, all messages are handled, but any derived classes may 87 // choose to ignore some or all of the received messages by overriding these 88 // methods. 89 virtual bool ShouldProcessAboutToNavigateMainFrame(); 90 91 private: 92 FRIEND_TEST_ALL_PREFIXES(InstantPageTest, IsLocal); 93 FRIEND_TEST_ALL_PREFIXES(InstantPageTest, 94 DetermineIfPageSupportsInstant_Local); 95 FRIEND_TEST_ALL_PREFIXES(InstantPageTest, 96 DetermineIfPageSupportsInstant_NonLocal); 97 FRIEND_TEST_ALL_PREFIXES(InstantPageTest, 98 PageURLDoesntBelongToInstantRenderer); 99 FRIEND_TEST_ALL_PREFIXES(InstantPageTest, PageSupportsInstant); 100 101 // Overridden from content::WebContentsObserver: 102 virtual void DidCommitProvisionalLoadForFrame( 103 content::RenderFrameHost* render_frame_host, 104 const GURL& url, 105 ui::PageTransition transition_type) OVERRIDE; 106 107 // Overridden from SearchModelObserver: 108 virtual void ModelChanged(const SearchModel::State& old_state, 109 const SearchModel::State& new_state) OVERRIDE; 110 111 // Update the status of Instant support. 112 void InstantSupportDetermined(bool supports_instant); 113 114 void ClearContents(); 115 116 // TODO(kmadhusu): Remove |profile_| from here and update InstantNTP to get 117 // |profile| from InstantNTPPrerenderer. 118 Profile* profile_; 119 120 Delegate* const delegate_; 121 const std::string instant_url_; 122 const bool is_incognito_; 123 124 DISALLOW_COPY_AND_ASSIGN(InstantPage); 125 }; 126 127 #endif // CHROME_BROWSER_UI_SEARCH_INSTANT_PAGE_H_ 128