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 CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_NAVIGATION_OBSERVER_H_
6#define CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_NAVIGATION_OBSERVER_H_
7
8#include <set>
9#include <vector>
10
11#include "base/memory/scoped_vector.h"
12#include "base/values.h"
13#include "chrome/browser/supervised_user/supervised_users.h"
14#include "content/public/browser/web_contents_observer.h"
15#include "content/public/browser/web_contents_user_data.h"
16
17class SupervisedUserService;
18class SupervisedUserURLFilter;
19
20namespace content {
21class NavigationEntry;
22}
23
24namespace infobars {
25class InfoBar;
26}
27
28class SupervisedUserNavigationObserver
29    : public content::WebContentsObserver,
30      public content::WebContentsUserData<SupervisedUserNavigationObserver> {
31 public:
32  virtual ~SupervisedUserNavigationObserver();
33
34  // Sets the specific infobar as dismissed.
35  void WarnInfoBarDismissed();
36
37  const std::vector<const content::NavigationEntry*>*
38      blocked_navigations() const {
39    return &blocked_navigations_.get();
40  }
41
42  // Called when a network request to |url| is blocked.
43  static void OnRequestBlocked(int render_process_host_id,
44                               int render_view_id,
45                               const GURL& url,
46                               const base::Callback<void(bool)>& callback);
47
48 private:
49  friend class content::WebContentsUserData<SupervisedUserNavigationObserver>;
50
51  explicit SupervisedUserNavigationObserver(content::WebContents* web_contents);
52
53  // content::WebContentsObserver implementation.
54  virtual void DidCommitProvisionalLoadForFrame(
55      content::RenderFrameHost* render_frame_host,
56      const GURL& url,
57      ui::PageTransition transition_type) OVERRIDE;
58
59  void OnRequestBlockedInternal(const GURL& url);
60
61  // Owned by the profile, so outlives us.
62  SupervisedUserService* supervised_user_service_;
63
64  // Owned by SupervisedUserService.
65  const SupervisedUserURLFilter* url_filter_;
66
67  // Owned by the InfoBarService, which has the same lifetime as this object.
68  infobars::InfoBar* warn_infobar_;
69
70  ScopedVector<const content::NavigationEntry> blocked_navigations_;
71
72  DISALLOW_COPY_AND_ASSIGN(SupervisedUserNavigationObserver);
73};
74
75#endif  // CHROME_BROWSER_SUPERVISED_USER_SUPERVISED_USER_NAVIGATION_OBSERVER_H_
76