Home | History | Annotate | Download | only in browser
      1 // Copyright (c) 2011 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 #include "chrome/browser/plugin_data_remover_helper.h"
      6 
      7 #include <string>
      8 
      9 #include "base/memory/ref_counted.h"
     10 #include "chrome/browser/plugin_data_remover.h"
     11 #include "chrome/browser/prefs/pref_service.h"
     12 #include "chrome/browser/profiles/profile.h"
     13 #include "content/browser/browser_thread.h"
     14 #include "content/common/notification_service.h"
     15 
     16 // The internal class is refcounted so it can outlive PluginDataRemoverHelper.
     17 class PluginDataRemoverHelper::Internal
     18     : public base::RefCountedThreadSafe<PluginDataRemoverHelper::Internal> {
     19  public:
     20   explicit Internal(const char* pref_name, PrefService* prefs)
     21       : pref_name_(pref_name), prefs_(prefs) {}
     22 
     23   void StartUpdate() {
     24     BrowserThread::PostTask(
     25         BrowserThread::FILE,
     26         FROM_HERE,
     27         NewRunnableMethod(
     28             this,
     29             &PluginDataRemoverHelper::Internal::UpdateOnFileThread));
     30   }
     31 
     32   void Invalidate() {
     33     prefs_ = NULL;
     34   }
     35 
     36  private:
     37   friend class base::RefCountedThreadSafe<Internal>;
     38 
     39   ~Internal() {}
     40 
     41   void UpdateOnFileThread() {
     42     DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
     43     bool result = PluginDataRemover::IsSupported();
     44     BrowserThread::PostTask(
     45         BrowserThread::UI,
     46         FROM_HERE,
     47         NewRunnableMethod(this,
     48                           &PluginDataRemoverHelper::Internal::SetPrefOnUIThread,
     49                           result));
     50   }
     51 
     52   void SetPrefOnUIThread(bool value) {
     53     DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     54     if (prefs_)
     55       prefs_->SetBoolean(pref_name_.c_str(), value);
     56   }
     57 
     58   std::string pref_name_;
     59   // Weak pointer.
     60   PrefService* prefs_;
     61 
     62   DISALLOW_COPY_AND_ASSIGN(Internal);
     63 };
     64 
     65 PluginDataRemoverHelper::PluginDataRemoverHelper() {}
     66 
     67 PluginDataRemoverHelper::~PluginDataRemoverHelper() {
     68   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     69   if (internal_)
     70     internal_->Invalidate();
     71 }
     72 
     73 void PluginDataRemoverHelper::Init(const char* pref_name,
     74                                    PrefService* prefs,
     75                                    NotificationObserver* observer) {
     76   pref_.Init(pref_name, prefs, observer);
     77   registrar_.Add(this, NotificationType::PLUGIN_ENABLE_STATUS_CHANGED,
     78                  NotificationService::AllSources());
     79   internal_ = make_scoped_refptr(new Internal(pref_name, prefs));
     80   internal_->StartUpdate();
     81 }
     82 
     83 void PluginDataRemoverHelper::Observe(NotificationType type,
     84                                       const NotificationSource& source,
     85                                       const NotificationDetails& details) {
     86   if (type.value == NotificationType::PLUGIN_ENABLE_STATUS_CHANGED) {
     87     internal_->StartUpdate();
     88   } else {
     89     NOTREACHED();
     90   }
     91 }
     92