// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_INSTANT_INSTANT_LOADER_H_ #define CHROME_BROWSER_INSTANT_INSTANT_LOADER_H_ #include #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/string16.h" #include "chrome/browser/history/history_types.h" #include "chrome/browser/instant/instant_commit_type.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" struct InstantAutocompleteResult; class InstantLoaderDelegate; class TabContents; namespace content { class NotificationDetails; class NotificationSource; class WebContents; } namespace gfx { class Rect; } // InstantLoader is created with an "Instant URL". It loads the URL and tells // its delegate (usually InstantController) of all interesting events. For // example, it determines if the page actually supports the Instant API // (http://dev.chromium.org/searchbox) and forwards messages (such as queries // and autocomplete suggestions) between the page and the delegate. class InstantLoader : public content::NotificationObserver { public: // Returns the Instant loader for |web_contents| if it's used for Instant. static InstantLoader* FromWebContents(content::WebContents* web_contents); // Creates a new empty WebContents. Use Init() to actually load |instant_url|. // |tab_contents| is the page the preview will be shown on top of and // potentially replace. |instant_url| is typically the instant_url field of // the default search engine's TemplateURL, with the "{searchTerms}" parameter // replaced with an empty string. InstantLoader(InstantLoaderDelegate* delegate, const std::string& instant_url, const TabContents* tab_contents); virtual ~InstantLoader(); // Initializes |preview_contents_| and loads |instant_url_|. void Init(); // Tells the preview page that the user typed |user_text| into the omnibox. // If |verbatim| is false, the page predicts the query the user means to type // and fetches results for the prediction. If |verbatim| is true, |user_text| // is taken as the exact query (no prediction is made). void Update(const string16& user_text, bool verbatim); // Tells the preview page of the bounds of the omnibox dropdown (in screen // coordinates). This is used by the page to offset the results to avoid them // being covered by the omnibox dropdown. void SetOmniboxBounds(const gfx::Rect& bounds); // Tells the preview page about the available autocomplete results. void SendAutocompleteResults( const std::vector& results); // Tells the preview page that the user pressed the up or down key. |count| // is a repeat count, negative for moving up, positive for moving down. void OnUpOrDownKeyPressed(int count); // Tells the preview page that the searchbox has been focused. void OnAutocompleteGotFocus(); // Tells the preview page that the searchbox has lost focus. void OnAutocompleteLostFocus(); // Called by the history tab helper with the information that it would have // added to the history service had this web contents not been used for // Instant. void DidNavigate(const history::HistoryAddPageArgs& add_page_args); // Releases the preview TabContents passing ownership to the caller. This // should be called when the preview is committed. Notifies the page but not // the delegate. |text| is the final omnibox text being committed. NOTE: The // caller should destroy this loader object right after this method, since // none of the other methods will work once the preview has been released. TabContents* ReleasePreviewContents(InstantCommitType type, const string16& text) WARN_UNUSED_RESULT; // The preview TabContents. The loader retains ownership. This will be // non-NULL until ReleasePreviewContents() is called. TabContents* preview_contents() const { return preview_contents_.get(); } // Returns true if the preview page is known to support the Instant API. This // starts out false, and becomes true whenever we get any message from the // page. Once true, it never becomes false (the page isn't expected to drop // Instant API support suddenly). bool supports_instant() const { return supports_instant_; } // Returns the URL that we're loading. const std::string& instant_url() const { return instant_url_; } // Returns info about the last navigation by the Instant page. If the page // hasn't navigated since the last Update(), the URL is empty. const history::HistoryAddPageArgs& last_navigation() const { return last_navigation_; } // Returns true if the mouse or a touch pointer is down due to activating the // preview content. bool IsPointerDownFromActivate() const; // content::NotificationObserver: virtual void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; private: class WebContentsDelegateImpl; void SetupPreviewContents(); void CleanupPreviewContents(); void ReplacePreviewContents(content::WebContents* old_contents, content::WebContents* new_contents); InstantLoaderDelegate* const loader_delegate_; // See comments on the getter above. scoped_ptr preview_contents_; // Delegate of the preview WebContents. Used to detect when the user does some // gesture on the WebContents and the preview needs to be activated. scoped_ptr preview_delegate_; // See comments on the getter above. bool supports_instant_; // See comments on the getter above. const std::string instant_url_; // Used to get notifications about renderers coming and going. content::NotificationRegistrar registrar_; // See comments on the getter above. history::HistoryAddPageArgs last_navigation_; DISALLOW_IMPLICIT_CONSTRUCTORS(InstantLoader); }; #endif // CHROME_BROWSER_INSTANT_INSTANT_LOADER_H_