// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/plugin_data_remover_helper.h" #include <string> #include "base/memory/ref_counted.h" #include "chrome/browser/plugin_data_remover.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/profiles/profile.h" #include "content/browser/browser_thread.h" #include "content/common/notification_service.h" // The internal class is refcounted so it can outlive PluginDataRemoverHelper. class PluginDataRemoverHelper::Internal : public base::RefCountedThreadSafe<PluginDataRemoverHelper::Internal> { public: explicit Internal(const char* pref_name, PrefService* prefs) : pref_name_(pref_name), prefs_(prefs) {} void StartUpdate() { BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, NewRunnableMethod( this, &PluginDataRemoverHelper::Internal::UpdateOnFileThread)); } void Invalidate() { prefs_ = NULL; } private: friend class base::RefCountedThreadSafe<Internal>; ~Internal() {} void UpdateOnFileThread() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); bool result = PluginDataRemover::IsSupported(); BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, NewRunnableMethod(this, &PluginDataRemoverHelper::Internal::SetPrefOnUIThread, result)); } void SetPrefOnUIThread(bool value) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); if (prefs_) prefs_->SetBoolean(pref_name_.c_str(), value); } std::string pref_name_; // Weak pointer. PrefService* prefs_; DISALLOW_COPY_AND_ASSIGN(Internal); }; PluginDataRemoverHelper::PluginDataRemoverHelper() {} PluginDataRemoverHelper::~PluginDataRemoverHelper() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); if (internal_) internal_->Invalidate(); } void PluginDataRemoverHelper::Init(const char* pref_name, PrefService* prefs, NotificationObserver* observer) { pref_.Init(pref_name, prefs, observer); registrar_.Add(this, NotificationType::PLUGIN_ENABLE_STATUS_CHANGED, NotificationService::AllSources()); internal_ = make_scoped_refptr(new Internal(pref_name, prefs)); internal_->StartUpdate(); } void PluginDataRemoverHelper::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { if (type.value == NotificationType::PLUGIN_ENABLE_STATUS_CHANGED) { internal_->StartUpdate(); } else { NOTREACHED(); } }