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_PROFILES_PROFILE_DESTROYER_H_
6#define CHROME_BROWSER_PROFILES_PROFILE_DESTROYER_H_
7
8#include <set>
9
10#include "base/memory/ref_counted.h"
11#include "base/timer/timer.h"
12#include "content/public/browser/render_process_host_observer.h"
13
14class Profile;
15
16namespace content {
17class RenderProcessHost;
18}
19
20// We use this class to destroy the off the record profile so that we can make
21// sure it gets done asynchronously after all render process hosts are gone.
22class ProfileDestroyer : public content::RenderProcessHostObserver {
23 public:
24  static void DestroyProfileWhenAppropriate(Profile* const profile);
25  static void DestroyOffTheRecordProfileNow(Profile* const profile);
26
27 private:
28  typedef std::set<content::RenderProcessHost*> HostSet;
29  typedef std::set<ProfileDestroyer*> DestroyerSet;
30
31  friend class base::RefCounted<ProfileDestroyer>;
32
33  ProfileDestroyer(Profile* const profile, HostSet* hosts);
34  virtual ~ProfileDestroyer();
35
36  // content::RenderProcessHostObserver override.
37  virtual void RenderProcessHostDestroyed(
38      content::RenderProcessHost* host) OVERRIDE;
39
40  // Called by the timer to cancel the pending destruction and do it now.
41  void DestroyProfile();
42
43  // Fetch the list of render process hosts that still refer to the profile.
44  // Return true if we found at least one, false otherwise.
45  static bool GetHostsForProfile(Profile* const profile, HostSet* hosts);
46
47  // We need access to all pending destroyers so we can cancel them.
48  static DestroyerSet* pending_destroyers_;
49
50  // We don't want to wait forever, so we have a cancellation timer.
51  base::Timer timer_;
52
53  // Used to count down the number of render process host left.
54  uint32 num_hosts_;
55
56  // The profile being destroyed. If it is set to NULL, it is a signal from
57  // another instance of ProfileDestroyer that this instance is canceled.
58  Profile* profile_;
59
60  base::WeakPtrFactory<ProfileDestroyer> weak_ptr_factory_;
61
62  DISALLOW_COPY_AND_ASSIGN(ProfileDestroyer);
63};
64
65#endif  // CHROME_BROWSER_PROFILES_PROFILE_DESTROYER_H_
66