1// Copyright 2014 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 COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_URL_TRACKER_INFOBAR_DELEGATE_H_
6#define COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_URL_TRACKER_INFOBAR_DELEGATE_H_
7
8#include "components/infobars/core/confirm_infobar_delegate.h"
9#include "url/gurl.h"
10
11class GoogleURLTracker;
12class GoogleURLTrackerNavigationHelper;
13
14namespace infobars {
15class InfoBarManager;
16}
17
18// This infobar is shown by the GoogleURLTracker when the Google base URL has
19// changed.
20class GoogleURLTrackerInfoBarDelegate : public ConfirmInfoBarDelegate {
21 public:
22  // Creates a Google URL tracker infobar and delegate and adds the infobar to
23  // |infobar_manager|.  Returns the infobar if it was successfully added.
24  static infobars::InfoBar* Create(
25      infobars::InfoBarManager* infobar_manager,
26      GoogleURLTracker* google_url_tracker,
27      const GURL& search_url);
28
29  // ConfirmInfoBarDelegate:
30  virtual bool Accept() OVERRIDE;
31  virtual bool Cancel() OVERRIDE;
32
33  GoogleURLTrackerNavigationHelper* navigation_helper() {
34    return navigation_helper_weak_ptr_;
35  }
36
37  void set_navigation_helper(
38      scoped_ptr<GoogleURLTrackerNavigationHelper> navigation_helper) {
39    navigation_helper_ = navigation_helper.Pass();
40    navigation_helper_weak_ptr_ = navigation_helper_.get();
41  }
42
43  // Other than set_pending_id(), these accessors are only used by test code.
44  const GURL& search_url() const { return search_url_; }
45  void set_search_url(const GURL& search_url) { search_url_ = search_url; }
46  int pending_id() const { return pending_id_; }
47  void set_pending_id(int pending_id) { pending_id_ = pending_id; }
48
49  // These are virtual so test code can override them in a subclass.
50  virtual void Update(const GURL& search_url);
51  virtual void Close(bool redo_search);
52
53 protected:
54  GoogleURLTrackerInfoBarDelegate(
55      GoogleURLTracker* google_url_tracker,
56      const GURL& search_url);
57  virtual ~GoogleURLTrackerInfoBarDelegate();
58
59 private:
60  // ConfirmInfoBarDelegate:
61  virtual base::string16 GetMessageText() const OVERRIDE;
62  virtual base::string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
63  virtual base::string16 GetLinkText() const OVERRIDE;
64  virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
65  virtual bool ShouldExpireInternal(
66      const NavigationDetails& details) const OVERRIDE;
67
68  GoogleURLTracker* google_url_tracker_;
69  scoped_ptr<GoogleURLTrackerNavigationHelper> navigation_helper_;
70
71  // During Close(), this object gives up ownership of |navigation_helper_|,
72  // which then outlives this object. Sometimes after this point, other classes
73  // still attempt to call navigation_helper() to access the (still-valid)
74  // instance. The NavigationHelper instance is stored as a weak pointer in
75  // addition to a strong pointer to facilitate this case.
76  GoogleURLTrackerNavigationHelper* navigation_helper_weak_ptr_;
77  GURL search_url_;
78  int pending_id_;
79
80  DISALLOW_COPY_AND_ASSIGN(GoogleURLTrackerInfoBarDelegate);
81};
82
83#endif  // COMPONENTS_GOOGLE_CORE_BROWSER_GOOGLE_URL_TRACKER_INFOBAR_DELEGATE_H_
84