1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_UI_SEARCH_INSTANT_PAGE_H_
6#define CHROME_BROWSER_UI_SEARCH_INSTANT_PAGE_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "base/gtest_prod_util.h"
13#include "base/strings/string16.h"
14#include "chrome/browser/ui/search/search_model_observer.h"
15#include "content/public/browser/web_contents_observer.h"
16#include "ui/base/page_transition_types.h"
17
18class GURL;
19class Profile;
20
21namespace content {
22struct FrameNavigateParams;
23struct LoadCommittedDetails;
24class WebContents;
25}
26
27namespace gfx {
28class Rect;
29}
30
31// InstantPage is used to exchange messages with a page that implements the
32// Instant/Embedded Search API (http://dev.chromium.org/embeddedsearch).
33// InstantPage is not used directly but via one of its derived classes,
34// InstantNTP and InstantTab.
35class InstantPage : public content::WebContentsObserver,
36                    public SearchModelObserver {
37 public:
38  // InstantPage calls its delegate in response to messages received from the
39  // page. Each method is called with the |contents| corresponding to the page
40  // we are observing.
41  class Delegate {
42   public:
43    // Called upon determination of Instant API support. Either in response to
44    // the page loading or because we received some other message.
45    virtual void InstantSupportDetermined(const content::WebContents* contents,
46                                          bool supports_instant) = 0;
47
48    // Called when the page is about to navigate to |url|.
49    virtual void InstantPageAboutToNavigateMainFrame(
50        const content::WebContents* contents,
51        const GURL& url) = 0;
52
53   protected:
54    virtual ~Delegate();
55  };
56
57  virtual ~InstantPage();
58
59  // Returns the Instant URL that was loaded for this page. Returns the empty
60  // string if no URL was explicitly loaded as is the case for InstantTab.
61  virtual const std::string& instant_url() const;
62
63  // Returns true if the page is known to support the Instant API. This starts
64  // out false, and is set to true whenever we get any message from the page.
65  // Once true, it never becomes false (the page isn't expected to drop API
66  // support suddenly).
67  virtual bool supports_instant() const;
68
69  // Returns true if the page is the local NTP (i.e. its URL is
70  // chrome::kChromeSearchLocalNTPURL).
71  virtual bool IsLocal() const;
72
73 protected:
74  InstantPage(Delegate* delegate, const std::string& instant_url,
75              Profile* profile, bool is_incognito);
76
77  // Sets |web_contents| as the page to communicate with. |web_contents| may be
78  // NULL, which effectively stops all communication.
79  void SetContents(content::WebContents* web_contents);
80
81  Delegate* delegate() const { return delegate_; }
82
83  Profile* profile() const { return profile_; }
84
85  // These functions are called before processing messages received from the
86  // page. By default, all messages are handled, but any derived classes may
87  // choose to ignore some or all of the received messages by overriding these
88  // methods.
89  virtual bool ShouldProcessAboutToNavigateMainFrame();
90
91 private:
92  FRIEND_TEST_ALL_PREFIXES(InstantPageTest, IsLocal);
93  FRIEND_TEST_ALL_PREFIXES(InstantPageTest,
94                           DetermineIfPageSupportsInstant_Local);
95  FRIEND_TEST_ALL_PREFIXES(InstantPageTest,
96                           DetermineIfPageSupportsInstant_NonLocal);
97  FRIEND_TEST_ALL_PREFIXES(InstantPageTest,
98                           PageURLDoesntBelongToInstantRenderer);
99  FRIEND_TEST_ALL_PREFIXES(InstantPageTest, PageSupportsInstant);
100
101  // Overridden from content::WebContentsObserver:
102  virtual void DidCommitProvisionalLoadForFrame(
103      content::RenderFrameHost* render_frame_host,
104      const GURL& url,
105      ui::PageTransition transition_type) OVERRIDE;
106
107  // Overridden from SearchModelObserver:
108  virtual void ModelChanged(const SearchModel::State& old_state,
109                            const SearchModel::State& new_state) OVERRIDE;
110
111  // Update the status of Instant support.
112  void InstantSupportDetermined(bool supports_instant);
113
114  void ClearContents();
115
116  // TODO(kmadhusu): Remove |profile_| from here and update InstantNTP to get
117  // |profile| from InstantNTPPrerenderer.
118  Profile* profile_;
119
120  Delegate* const delegate_;
121  const std::string instant_url_;
122  const bool is_incognito_;
123
124  DISALLOW_COPY_AND_ASSIGN(InstantPage);
125};
126
127#endif  // CHROME_BROWSER_UI_SEARCH_INSTANT_PAGE_H_
128