Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2624)

Unified Diff: chrome/browser/instant/instant_controller.h

Issue 10836031: Remove Instant v1 API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Build fix Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/instant/instant_controller.h
diff --git a/chrome/browser/instant/instant_controller.h b/chrome/browser/instant/instant_controller.h
index b6ad248cebdf1c81dc4636a52236ebea298c8dde..4d551ff18214be0a46ae4b7d19b6a5b828594020 100644
--- a/chrome/browser/instant/instant_controller.h
+++ b/chrome/browser/instant/instant_controller.h
@@ -5,17 +5,17 @@
#ifndef CHROME_BROWSER_INSTANT_INSTANT_CONTROLLER_H_
#define CHROME_BROWSER_INSTANT_INSTANT_CONTROLLER_H_
-#include <set>
+#include <map>
#include <string>
+#include <vector>
#include "base/basictypes.h"
+#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
-#include "base/memory/scoped_vector.h"
-#include "base/memory/weak_ptr.h"
#include "base/string16.h"
+#include "base/timer.h"
#include "chrome/browser/instant/instant_commit_type.h"
#include "chrome/browser/instant/instant_loader_delegate.h"
-#include "chrome/browser/search_engines/template_url_id.h"
#include "chrome/common/instant_types.h"
#include "content/public/common/page_transition_types.h"
#include "googleurl/src/gurl.h"
@@ -25,31 +25,32 @@
struct AutocompleteMatch;
class InstantControllerDelegate;
class InstantLoader;
-class InstantTest;
class PrefService;
class Profile;
class TabContents;
class TemplateURL;
-// InstantController maintains a WebContents that is intended to give a preview
-// of a URL. InstantController is owned by Browser.
+// InstantController maintains a WebContents that is intended to give a
+// preview of search results. InstantController is owned by Browser via
+// BrowserInstantController.
//
-// At any time the WebContents maintained by InstantController may be destroyed
-// by way of |DestroyPreviewContents|, which results in |HideInstant| being
-// invoked on the delegate. Similarly the preview may be committed at any time
-// by invoking |CommitCurrentPreview|, which results in |CommitInstant|
-// being invoked on the delegate. Also see |PrepareForCommit| below.
+// At any time the WebContents maintained by InstantController may be hidden
+// from view by way of Hide(), which may result in HideInstant() being invoked
+// on the delegate. Similarly the preview may be committed at any time by
+// invoking CommitCurrentPreview(), which results in CommitInstant() being
+// invoked on the delegate.
class InstantController : public InstantLoaderDelegate {
public:
- // Amount of time to wait before starting the instant animation.
- static const int kAutoCommitPauseTimeMS = 1000;
- // Duration of the instant animation in which the colors change.
- static const int kAutoCommitFadeInTimeMS = 300;
+ // Amount of time to wait before starting the animation for suggested text.
+ static const int kInlineAutocompletePauseTimeMS = 1000;
+
+ // Duration of the suggested text animation in which the colors change.
+ static const int kInlineAutocompleteFadeInTimeMS = 300;
// InstantController may operate in one of these modes:
// INSTANT: The default search engine is preloaded when the omnibox gets
// focus. Queries are issued as the user types. Predicted queries are
- // are inline autocompleted into the omnibox. Result previews are shown.
+ // inline autocompleted into the omnibox. Result previews are shown.
// SUGGEST: Same as INSTANT, without visible previews.
// HIDDEN: Same as SUGGEST, without the inline autocompletion.
// SILENT: Same as HIDDEN, without issuing queries as the user types. The
@@ -58,216 +59,180 @@ class InstantController : public InstantLoaderDelegate {
INSTANT,
SUGGEST,
HIDDEN,
- SILENT
+ SILENT,
};
InstantController(InstantControllerDelegate* delegate, Mode mode);
virtual ~InstantController();
- // Registers instant related preferences.
+ // Registers Instant related preferences.
static void RegisterUserPrefs(PrefService* prefs);
- // Records instant metrics.
- static void RecordMetrics(Profile* profile);
-
- // Returns true if instant is enabled in the given |profile|'s preferences.
+ // Returns true if Instant is enabled for the given |profile|.
static bool IsEnabled(Profile* profile);
- // Enables instant.
- static void Enable(Profile* profile);
-
- // Disables instant.
- static void Disable(Profile* profile);
-
- // Invoked as the user types in the omnibox with the url to navigate to. If
- // the url is valid and a preview WebContents has not been created, it is
- // created. If |verbatim| is true search results are shown for |user_text|
- // rather than the best guess as to what the search thought the user meant.
- // |verbatim| only matters if the AutocompleteMatch is for a search engine
- // that supports instant. Returns true if the attempt to update does not
- // result in the preview WebContents being destroyed.
+ // Invoked as the user types into the omnibox. |user_text| is what the user
+ // has typed. |suggested_text| is the current inline autocomplete text. It
+ // may be replaced by Instant's autocomplete suggestion, if any. If |verbatim|
+ // is true, search results are shown for |user_text| rather than the best
+ // guess as to what Instant thinks the user means. Returns true if the update
+ // is processed by Instant (i.e., if |match| is a search rather than a URL).
bool Update(const AutocompleteMatch& match,
const string16& user_text,
bool verbatim,
- string16* suggested_text);
+ string16* suggested_text,
+ InstantCompleteBehavior* complete_behavior);
- // 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.
+ // Sets the bounds of the omnibox dropdown, in screen coordinates.
void SetOmniboxBounds(const gfx::Rect& bounds);
- // Notifies the delegate to hide the preview and destroys the preview
- // WebContents. Does nothing if the preview WebContents has not been created.
- void DestroyPreviewContents();
+ // 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;
- // Notifies the delegate to hide the preview but leaves it around in hopes it
- // can be subsequently used. The preview will not be used until Update() (with
- // valid parameters) is invoked.
+ // Hides the preview, but doesn't destroy it, in hopes it can be subsequently
+ // reused. The preview will not be used until a call to Update() succeeds.
void Hide();
- // Returns true if we're showing the last URL passed to |Update|. If this is
- // false a commit does not result in committing the last url passed to update.
- // A return value of false happens if we're in the process of determining if
- // the page supports instant.
+ // Returns true if the Instant preview can be committed now. This can be true
+ // even if the preview is not showing yet, because we can commit as long as
+ // we've processed the last Update() and we know the loader supports Instant.
bool IsCurrent() const;
- // Returns true if the caller should proceed with committing the preview. A
- // return value of false means that there is no valid preview to commit. This
- // is used by Browser, when the user presses <Enter>, to decide whether to
- // load the omnibox contents through Instant or otherwise. This is needed
- // because calls to |Update| don't necessarily result in a preview being
- // shown, such as in the HIDDEN and SILENT modes.
- bool PrepareForCommit();
-
- // Invoked when the user does some gesture that should trigger making the
- // current previewed page the permanent page. Returns the TabContents that
- // contains the committed preview.
+ // Unconditionally commits the preview. Returns the TabContents that contains
+ // the committed preview.
TabContents* CommitCurrentPreview(InstantCommitType type);
- // Accepts the currently showing instant preview, if any, and returns true.
- // Returns false if there is no instant preview showing.
- bool CommitIfCurrent();
-
- // Sets InstantController so that when the mouse is released or the
- // touch-gesture ends, the preview is committed.
- void SetCommitOnPointerRelease();
-
- bool commit_on_pointer_release() const { return commit_on_pointer_release_; }
-
- // Calls through to method of same name on loader.
- bool IsPointerDownFromActivate();
+ // Releases the preview WebContents passing ownership to the caller. This is
+ // intended to be called when the preview WebContents is committed. This does
+ // not notify the delegate.
+ TabContents* ReleasePreviewContents(
+ InstantCommitType type) WARN_UNUSED_RESULT;
- // The autocomplete edit that was initiating the current instant session has
+ // The autocomplete edit that was initiating the current Instant session has
// lost focus. Commit or discard the preview accordingly.
void OnAutocompleteLostFocus(gfx::NativeView view_gaining_focus);
- // The autocomplete edit has gained focus. Preload the instant URL of the
+ // The autocomplete edit has gained focus. Preload the Instant URL of the
// default search engine, in anticipation of the user typing a query.
void OnAutocompleteGotFocus();
- // Releases the preview WebContents passing ownership to the caller. This is
- // intended to be called when the preview WebContents 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.
- // WARNING: be sure and invoke CompleteRelease after adding the returned
- // WebContents to a tabstrip.
- TabContents* ReleasePreviewContents(InstantCommitType type,
- TabContents* tab_contents);
-
- // Does cleanup after the preview contents has been added to the tabstrip.
- // Invoke this if you explicitly invoke ReleasePreviewContents.
- void CompleteRelease(TabContents* tab);
-
- // The preview TabContents; may be null.
- TabContents* GetPreviewContents() const;
-
- // Returns true if the preview TabContents is ready to be displayed. In
- // some situations this may return false yet GetPreviewContents() returns
- // non-NULL.
- bool is_displayable() const { return is_displayable_; }
+ // Returns whether the preview will be committed when the mouse or touch
+ // pointer is released.
+ bool commit_on_pointer_release() const;
// Returns the transition type of the last AutocompleteMatch passed to Update.
content::PageTransition last_transition_type() const {
return last_transition_type_;
}
- // InstantLoaderDelegate
- virtual void InstantStatusChanged(InstantLoader* loader) OVERRIDE;
- virtual void SetSuggestedTextFor(InstantLoader* loader,
- const string16& text,
- InstantCompleteBehavior behavior) OVERRIDE;
- virtual gfx::Rect GetInstantBounds() OVERRIDE;
- virtual bool ShouldCommitInstantOnPointerRelease() OVERRIDE;
+ // InstantLoaderDelegate:
+ virtual void SetSuggestions(InstantLoader* loader,
+ const std::vector<string16>& suggestions,
+ InstantCompleteBehavior behavior) OVERRIDE;
virtual void CommitInstantLoader(InstantLoader* loader) OVERRIDE;
- virtual void InstantLoaderDoesntSupportInstant(
- InstantLoader* loader) OVERRIDE;
- virtual void AddToBlacklist(InstantLoader* loader,
- const GURL& url) OVERRIDE;
+ virtual void InstantLoaderPreviewLoaded(InstantLoader* loader) OVERRIDE;
+ virtual void InstantSupportDetermined(InstantLoader* loader,
+ bool supports_instant) OVERRIDE;
virtual void SwappedTabContents(InstantLoader* loader) OVERRIDE;
- virtual void InstantLoaderContentsFocused() OVERRIDE;
+ virtual void InstantLoaderContentsFocused(InstantLoader* loader) OVERRIDE;
+
+#if defined(UNIT_TEST)
+ // Accessors used only in tests.
+ bool is_showing() const { return is_showing_; }
+ InstantLoader* loader() const { return loader_.get(); }
+#endif
private:
- friend class InstantTest;
+ // Creates a new loader if necessary (for example, if the |instant_url| has
+ // changed since the last time we created the loader).
+ void ResetLoader(const std::string& instant_url,
+ const TabContents* active_tab);
- typedef std::set<std::string> HostBlacklist;
+ // Destroys the |loader_| and its preview contents.
+ void DeleteLoader();
- // Updates |is_displayable_| and if necessary notifies the delegate.
- void UpdateIsDisplayable();
+ // Counterpart to Hide(). Asks the |delegate_| to display the preview.
+ void Show();
- // Updates InstantLoaderManager and its current InstantLoader. This is invoked
- // internally from Update.
- void UpdateLoader(TabContents* tab_contents,
- const TemplateURL* template_url,
- const GURL& url,
- content::PageTransition transition_type,
- const string16& user_text,
- bool verbatim,
- string16* suggested_text);
+ // Send the omnibox dropdown bounds to the page.
+ void SendBoundsToPage();
- // Returns true if |template_url| is a valid TemplateURL for use by instant.
- bool IsValidInstantTemplateURL(const TemplateURL* template_url);
+ // If |template_url| is a valid TemplateURL for use with Instant, fills in
+ // |instant_url| and returns true; returns false otherwise.
+ // Note: If the command-line switch kInstantURL is set, this method uses its
+ // value for |instant_url| and returns true without examining |template_url|.
+ bool GetInstantURL(const TemplateURL* template_url,
+ std::string* instant_url) const;
- // Marks the loader as not supporting instant.
- void BlacklistFromInstant();
+ // Returns true if the preview is no longer relevant, say because the last
+ // Update() was for a URL and not a search query, or the user switched tabs.
+ bool IsOutOfDate() const;
- // Returns true if the specified id has been blacklisted from supporting
- // instant.
- bool IsBlacklistedFromInstant(TemplateURLID id);
+ InstantControllerDelegate* const delegate_;
- // Clears the set of search engines blacklisted.
- void ClearBlacklist();
+ scoped_ptr<InstantLoader> loader_;
- // Deletes |loader| after a delay. At the time we determine a site doesn't
- // want to participate in instant we can't destroy the loader (because
- // destroying the loader destroys the WebContents and the WebContents is on
- // the stack). Instead we place the loader in |loaders_to_destroy_| and
- // schedule a task.
- void ScheduleDestroy(InstantLoader* loader);
+ // See the enum description above.
+ const Mode mode_;
- // Destroys all loaders scheduled for destruction in |ScheduleForDestroy|.
- void DestroyLoaders();
+ // The active tab at the time of the last Update(). Used by IsOutOfDate() to
+ // know whether the user switched tabs. ***NEVER DEREFERENCE THIS POINTER.***
+ // It may be a dangling pointer to a freed object. Should only be used for
+ // pointer comparisons.
+ const void* last_active_tab_;
- InstantControllerDelegate* delegate_;
+ // The most recent full omnibox query text known to us. If this is empty, it
+ // could also mean that the omnibox text was a URL (or something else that
+ // we shouldn't be processing).
+ string16 last_full_text_;
- // True if |loader_| is ready to be displayed.
- bool is_displayable_;
+ // The most recent user_text passed to Update().
+ string16 last_user_text_;
- // Set to true in Hide() and false in Update(). Used when we persist the
- // |loader_|, but it isn't up to date.
- bool is_out_of_date_;
+ // The most recent verbatim passed to Update().
+ bool last_verbatim_;
- scoped_ptr<InstantLoader> loader_;
+ // The most recent suggestion received from the page, minus any prefix that
+ // the user has typed.
+ string16 last_suggestion_;
- // See description above setter.
- gfx::Rect omnibox_bounds_;
+ // The most recent autocomplete behavior for |last_suggestion_|.
+ InstantCompleteBehavior last_complete_behavior_;
- // See descritopn above for SetCommitOnPointerRelease.
- bool commit_on_pointer_release_;
-
- // See description above getter.
+ // See comments on the getter above.
content::PageTransition last_transition_type_;
- // The IDs of any search engines that don't support instant. We assume all
- // search engines support instant, but if we determine an engine doesn't
- // support instant it is added to this list. The list is cleared out on every
- // reset/commit.
- std::set<TemplateURLID> blacklisted_ids_;
+ // True if the preview is currently being displayed. Guaranteed to be false
+ // if IsOutOfDate() is true.
+ bool is_showing_;
- // Used by ScheduleForDestroy; see it for details.
- base::WeakPtrFactory<InstantController> weak_factory_;
+ // True if we've received a response from the loader for the last Update(),
+ // thus indicating that the page is ready to be shown.
+ bool loader_processed_last_update_;
- // List of InstantLoaders to destroy. See ScheduleForDestroy for details.
- ScopedVector<InstantLoader> loaders_to_destroy_;
+ // Current omnibox bounds.
+ gfx::Rect omnibox_bounds_;
- // The URL of the most recent match passed to |Update|.
- GURL last_url_;
+ // Last bounds passed to the page.
+ gfx::Rect last_omnibox_bounds_;
- // The most recent user_text passed to |Update|.
- string16 last_user_text_;
+ // Timer used to update the bounds of the omnibox.
+ base::OneShotTimer<InstantController> update_bounds_timer_;
- // See the enum description above.
- const Mode mode_;
+ // For each key K => value N, the map says that we found that the search
+ // engine identified by Instant URL K didn't support the Instant API in each
+ // of the last N times that we loaded it. If an Instant URL isn't present in
+ // the map at all or has a value 0, it means that search engine supports the
+ // Instant API (or we assume it does, since we haven't determined it doesn't).
+ std::map<std::string, int> blacklisted_urls_;
+
+ // Search terms extraction (for autocomplete history matches) doesn't work
+ // on Instant URLs. So, whenever the user commits an Instant search, we add
+ // an equivalent non-Instant search URL to history, so that the search shows
+ // up in autocomplete history matches.
+ GURL url_for_history_;
DISALLOW_COPY_AND_ASSIGN(InstantController);
};

Powered by Google App Engine
This is Rietveld 408576698