Index: chrome/browser/instant/instant_loader.h |
diff --git a/chrome/browser/instant/instant_loader.h b/chrome/browser/instant/instant_loader.h |
index 43f74fbada8e622995059b8aaae368d09b2e817f..7ec5f269b37ec569e36b5a45a17763e7f365c4c5 100644 |
--- a/chrome/browser/instant/instant_loader.h |
+++ b/chrome/browser/instant/instant_loader.h |
@@ -8,256 +8,124 @@ |
#include <string> |
#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 "base/timer.h" |
#include "chrome/browser/instant/instant_commit_type.h" |
-#include "chrome/browser/search_engines/template_url_id.h" |
-#include "chrome/common/instant_types.h" |
#include "content/public/browser/notification_observer.h" |
#include "content/public/browser/notification_registrar.h" |
-#include "content/public/common/page_transition_types.h" |
-#include "googleurl/src/gurl.h" |
-#include "ui/gfx/rect.h" |
class InstantLoaderDelegate; |
-class InstantLoaderManagerTest; |
class TabContents; |
-class TemplateURL; |
namespace content { |
-class SessionStorageNamespace; |
+class NotificationDetails; |
+class NotificationSource; |
} |
-// InstantLoader does the loading of a particular URL for InstantController. |
-// InstantLoader notifies its delegate, which is typically InstantController, of |
-// all interesting events. |
-// |
-// InstantLoader is created with a TemplateURLID. If non-zero InstantLoader |
-// first determines if the site actually supports instant. If it doesn't, the |
-// delegate is notified by way of |InstantLoaderDoesntSupportInstant|. |
-// |
-// If the TemplateURLID supplied to the constructor is zero, then the url is |
-// loaded as is. |
+namespace gfx { |
+class Rect; |
+} |
+ |
+namespace history { |
+class HistoryAddPageArgs; |
+} |
+ |
+// 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: |
- // Header and value set on loads that originate from instant. |
- static const char* const kInstantHeader; |
- static const char* const kInstantHeaderValue; |
- |
- // |group| is an identifier suffixed to histograms to distinguish field trial |
- // statistics from regular operation; can be a blank string. |
+ // 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, |
- TemplateURLID id, |
- const std::string& group); |
+ const std::string& instant_url, |
+ const TabContents* tab_contents); |
virtual ~InstantLoader(); |
- // Invoked to load a URL. |tab_contents| is the TabContents the preview |
- // is going to be shown on top of and potentially replace. Returns true if the |
- // arguments differ from the last call to |Update|. |
- bool Update(TabContents* tab_contents, |
- const TemplateURL* template_url, |
- const GURL& url, |
- content::PageTransition transition_type, |
- const string16& user_text, |
- bool verbatim, |
- string16* suggested_text); |
+ // Initializes |preview_contents_| and loads |instant_url_|. |
+ void Init(); |
- // Sets the bounds of the omnibox (in screen coordinates). The bounds are |
- // remembered until the preview is committed or destroyed. This is only used |
- // when showing results for a search provider that supports instant. |
- void SetOmniboxBounds(const gfx::Rect& bounds); |
+ // 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); |
- // Returns true if the mouse or a touch-pointer is down as the result of |
- // activating the preview content. |
- bool IsPointerDownFromActivate(); |
+ // 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); |
- // Releases the preview TabContents passing ownership to the caller. |
- // This is intended to be called when the preview TabContents is |
- // committed. This does not notify the delegate. |tab_contents| is the |
- // underlying tab onto which the preview will be committed. It can be NULL |
- // when the underlying tab is irrelevant, for example when |type| is |
- // INSTANT_COMMIT_DESTROY. |
+ // 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, |
- TabContents* tab_contents); |
+ const string16& text) WARN_UNUSED_RESULT; |
- // Calls through to method of same name on delegate. |
- bool ShouldCommitInstantOnPointerRelease(); |
- void CommitInstantLoader(); |
+ // The preview TabContents. The loader retains ownership. This will be |
+ // non-NULL until ReleasePreviewContents() is called. |
+ TabContents* preview_contents() const { return preview_contents_.get(); } |
- // Preload |template_url|'s instant URL, if the loader doesn't already have |
- // a |preview_contents()| for it. |
- void MaybeLoadInstantURL(TabContents* tab_contents, |
- const TemplateURL* template_url); |
+ // 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 true if the preview NavigationController's WebContents has a |
- // pending NavigationEntry. |
- bool IsNavigationPending() const; |
+ // 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(), this contains NULL. |
+ scoped_refptr<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; |
- // The preview TabContents; may be null. |
- TabContents* preview_contents() const { |
- return preview_contents_.get(); |
- } |
- |
- // Returns true if the preview TabContents is ready to be shown. A |
- // non-instant loader is ready once the renderer paints, otherwise it isn't |
- // ready until we get a response back from the page. |
- bool ready() const { return ready_; } |
- |
- // Returns true if the current load returned a 200. |
- bool http_status_ok() const { return http_status_ok_; } |
- |
- // Returns true if the url needs to be reloaded. This is set to true for |
- // downloads. |
- bool needs_reload() const { return needs_reload_; } |
- |
- const GURL& url() const { return url_; } |
- |
- bool verbatim() const { return verbatim_; } |
- |
- // Are we showing instant results? |
- bool is_showing_instant() const { return template_url_id_ != 0; } |
- |
- // If we're showing instant this returns non-zero. |
- TemplateURLID template_url_id() const { return template_url_id_; } |
- |
- // See description above field. |
- const string16& user_text() const { return user_text_; } |
- |
- // Are we waiting for the preview page to finish loading and to determine if |
- // it supports instant? |
- bool is_determining_if_page_supports_instant() const { |
- return frame_load_observer_.get() != NULL; |
- } |
- |
private: |
- friend class InstantLoaderManagerTest; |
- friend class InstantTest; |
- class FrameLoadObserver; |
- class PaintObserverImpl; |
class WebContentsDelegateImpl; |
- // Invoked when the page wants to update the suggested text. If |user_text_| |
- // starts with |suggested_text|, then the delegate is notified of the change, |
- // which results in updating the omnibox. |
- void SetCompleteSuggestedText(const string16& suggested_text, |
- InstantCompleteBehavior behavior); |
- |
- // Invoked when the page paints. |
- void PreviewPainted(); |
- |
- // Invoked when the http status code changes. This may notify the delegate. |
- void SetHTTPStatusOK(bool is_ok); |
- |
- // Invoked to show the preview. This is invoked in two possible cases: when |
- // the renderer paints, or when an auth dialog is shown. This notifies the |
- // delegate the preview is ready to be shown. |
- void ShowPreview(); |
+ void SetupPreviewContents(); |
+ void CleanupPreviewContents(); |
+ void ReplacePreviewContents(TabContents* old_tc, TabContents* new_tc); |
- // Invoked once the page has finished loading and the script has been sent. |
- void PageFinishedLoading(); |
+ InstantLoaderDelegate* const loader_delegate_; |
- // Returns the bounds of the omnibox in terms of the preview tab contents. |
- gfx::Rect GetOmniboxBoundsInTermsOfPreview(); |
- |
- // Invoked if it the page doesn't really support instant when we thought it |
- // did. If |needs_reload| is true, the text changed since the first load and |
- // the page needs to be reloaded. |
- void PageDoesntSupportInstant(bool needs_reload); |
- |
- // Invokes |SetBoundsToPage(false)|. This is called from the timer. |
- void ProcessBoundsChange(); |
- |
- // Notifes the page of the omnibox bounds. If |force_if_loading| is true the |
- // bounds are sent down even if we're waiting on the load, otherwise if we're |
- // waiting on the load and |force_if_loading| is false this does nothing. |
- void SendBoundsToPage(bool force_if_loading); |
- |
- // Called when the TabContentsDelegate wants to swap a new TabContents |
- // into our |preview_contents_|. |
- void ReplacePreviewContents(TabContents* old_tc, |
- TabContents* new_tc); |
- |
- // Called to set up the |preview_contents_| based on |tab_contents| when it is |
- // created or replaced. |
- void SetupPreviewContents(TabContents* tab_contents); |
- |
- // Creates and sets the preview TabContents. |
- void CreatePreviewContents(TabContents* tab_contents); |
- |
- // Creates and loads the |template_url|'s instant URL. |
- void LoadInstantURL(const TemplateURL* template_url, |
- content::PageTransition transition_type, |
- const string16& user_text, |
- bool verbatim, |
- bool override_user_agent); |
- |
- InstantLoaderDelegate* delegate_; |
- |
- // If we're showing instant results this is the ID of the TemplateURL driving |
- // the results. A value of 0 means there is no TemplateURL. |
- const TemplateURLID template_url_id_; |
- |
- // The url we're displaying. |
- GURL url_; |
+ // See comments on the getter above. |
+ scoped_ptr<TabContents> 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<WebContentsDelegateImpl> preview_tab_contents_delegate_; |
- |
- // The preview TabContents; may be null. |
- scoped_ptr<TabContents> preview_contents_; |
- |
- // Is the preview_contents ready to be shown? |
- bool ready_; |
- |
- // Was the last status code a 200? |
- bool http_status_ok_; |
- |
- // The text the user typed in the omnibox, stripped of the leading ?, if any. |
- string16 user_text_; |
- |
- // The latest suggestion from the page. |
- string16 complete_suggested_text_; |
- |
- // The latest suggestion (suggested text less the user text). |
- string16 last_suggestion_; |
+ scoped_ptr<WebContentsDelegateImpl> preview_delegate_; |
- // See description above setter. |
- gfx::Rect omnibox_bounds_; |
+ // See comments on the getter above. |
+ bool supports_instant_; |
- // Last bounds passed to the page. |
- gfx::Rect last_omnibox_bounds_; |
- |
- scoped_ptr<FrameLoadObserver> frame_load_observer_; |
- |
- // Transition type of the match last passed to Update. |
- content::PageTransition last_transition_type_; |
- |
- // Timer used to update the bounds of the omnibox. |
- base::OneShotTimer<InstantLoader> update_bounds_timer_; |
+ // See comments on the getter above. |
+ const std::string instant_url_; |
// Used to get notifications about renderers coming and going. |
content::NotificationRegistrar registrar_; |
- // Last value of verbatim passed to |Update|. |
- bool verbatim_; |
- |
- // True if the page needs to be reloaded. |
- bool needs_reload_; |
- |
- // See description above constructor. |
- std::string group_; |
- |
- // The session storage namespace identifier of the original tab contents that |
- // the preview_contents_ was based upon. |
- scoped_refptr<content::SessionStorageNamespace> session_storage_namespace_; |
+ // See comments on the getter above. |
+ scoped_refptr<history::HistoryAddPageArgs> last_navigation_; |
DISALLOW_COPY_AND_ASSIGN(InstantLoader); |
}; |