1// Copyright (c) 2012 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_INFOBARS_INFOBAR_SERVICE_H_
6#define CHROME_BROWSER_INFOBARS_INFOBAR_SERVICE_H_
7
8#include <vector>
9
10#include "base/memory/scoped_ptr.h"
11#include "components/infobars/core/infobar_manager.h"
12#include "content/public/browser/web_contents_observer.h"
13#include "content/public/browser/web_contents_user_data.h"
14
15namespace content {
16struct LoadCommittedDetails;
17class WebContents;
18}
19
20namespace infobars {
21class InfoBar;
22}
23
24// Associates a Tab to a InfoBarManager and manages its lifetime.
25// It manages the infobar notifications and responds to navigation events.
26class InfoBarService : public infobars::InfoBarManager,
27                       public content::WebContentsObserver,
28                       public content::WebContentsUserData<InfoBarService> {
29 public:
30  static infobars::InfoBarDelegate::NavigationDetails
31      NavigationDetailsFromLoadCommittedDetails(
32          const content::LoadCommittedDetails& details);
33
34  // This function must only be called on infobars that are owned by an
35  // InfoBarService instance (or not owned at all, in which case this returns
36  // NULL).
37  static content::WebContents* WebContentsFromInfoBar(
38      infobars::InfoBar* infobar);
39
40  // Makes it so the next reload is ignored. That is, if the next commit is a
41  // reload then it is treated as if nothing happened and no infobars are
42  // attempted to be closed.
43  // This is useful for non-user triggered reloads that should not dismiss
44  // infobars. For example, instant may trigger a reload when the google URL
45  // changes.
46  void set_ignore_next_reload() { ignore_next_reload_ = true; }
47
48 private:
49  friend class content::WebContentsUserData<InfoBarService>;
50
51  explicit InfoBarService(content::WebContents* web_contents);
52  virtual ~InfoBarService();
53
54  // InfoBarManager:
55  virtual int GetActiveEntryID() OVERRIDE;
56  // TODO(droger): Remove these functions once infobar notifications are
57  // removed. See http://crbug.com/354380
58  virtual void NotifyInfoBarAdded(infobars::InfoBar* infobar) OVERRIDE;
59  virtual void NotifyInfoBarRemoved(infobars::InfoBar* infobar,
60                                    bool animate) OVERRIDE;
61
62  // content::WebContentsObserver:
63  virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;
64  virtual void DidStartNavigationToPendingEntry(
65      const GURL& url,
66      content::NavigationController::ReloadType reload_type) OVERRIDE;
67  virtual void NavigationEntryCommitted(
68      const content::LoadCommittedDetails& load_details) OVERRIDE;
69  virtual void WebContentsDestroyed() OVERRIDE;
70  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
71
72  // Message handlers.
73  void OnDidBlockDisplayingInsecureContent();
74  void OnDidBlockRunningInsecureContent();
75
76  // See description in set_ignore_next_reload().
77  bool ignore_next_reload_;
78
79  DISALLOW_COPY_AND_ASSIGN(InfoBarService);
80};
81
82#endif  // CHROME_BROWSER_INFOBARS_INFOBAR_SERVICE_H_
83