// Copyright (c) 2011 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_ #pragma once #include "base/basictypes.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/common/notification_observer.h" #include "content/common/notification_registrar.h" #include "content/common/page_transition_types.h" #include "googleurl/src/gurl.h" #include "ui/gfx/rect.h" class InstantLoaderDelegate; class InstantLoaderManagerTest; class TabContents; class TabContentsWrapper; class TemplateURL; // 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. class InstantLoader : public NotificationObserver { public: InstantLoader(InstantLoaderDelegate* delegate, TemplateURLID id); 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(TabContentsWrapper* tab_contents, const TemplateURL* template_url, const GURL& url, PageTransition::Type transition_type, const string16& user_text, bool verbatim, string16* suggested_text); // 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); // Returns true if the mouse is down as the result of activating the preview // content. bool IsMouseDownFromActivate(); // 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. TabContentsWrapper* ReleasePreviewContents(InstantCommitType type); // Calls through to method of same name on delegate. bool ShouldCommitInstantOnMouseUp(); void CommitInstantLoader(); // NotificationObserver: virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) OVERRIDE; // The preview TabContents; may be null. TabContentsWrapper* preview_contents() const { return preview_contents_.get(); } // Returns true if the preview TabContents is ready to be shown. 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_; } private: friend class InstantLoaderManagerTest; friend class InstantTest; class FrameLoadObserver; class PaintObserverImpl; class TabContentsDelegateImpl; // 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(); // Invoked once the page has finished loading and the script has been sent. void PageFinishedLoading(); // Returns the bounds of the omnibox in terms of the preview tab contents. gfx::Rect GetOmniboxBoundsInTermsOfPreview(); // Are we waiting for the preview page to finish loading? bool is_waiting_for_load() const { return frame_load_observer_.get() != NULL; } // 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); // Creates and sets the preview TabContentsWrapper. void CreatePreviewContents(TabContentsWrapper* tab_contents); 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_; // Delegate of the preview TabContents. Used to detect when the user does some // gesture on the TabContents and the preview needs to be activated. scoped_ptr<TabContentsDelegateImpl> preview_tab_contents_delegate_; // The preview TabContents; may be null. scoped_ptr<TabContentsWrapper> 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_; // See description above setter. gfx::Rect omnibox_bounds_; // 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. PageTransition::Type last_transition_type_; // Timer used to update the bounds of the omnibox. base::OneShotTimer<InstantLoader> update_bounds_timer_; // Used to get notifications about renderers coming and going. NotificationRegistrar registrar_; // Last value of verbatim passed to |Update|. bool verbatim_; // True if the page needs to be reloaded. bool needs_reload_; DISALLOW_COPY_AND_ASSIGN(InstantLoader); }; #endif // CHROME_BROWSER_INSTANT_INSTANT_LOADER_H_