blob: 8e862f4834ad167101c844d9b60f4d10d3e7c933 [file] [log] [blame]
// 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 <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 "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<InstantAutocompleteResult>& 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);
// 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<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_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_COPY_AND_ASSIGN(InstantLoader);
};
#endif // CHROME_BROWSER_INSTANT_INSTANT_LOADER_H_