Home | History | Annotate | Download | only in profiles
      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 
     14 class Profile;
     15 
     16 namespace content {
     17 class 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.
     22 class 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