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