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