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.
17class 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
65PluginDataRemoverHelper::PluginDataRemoverHelper() {}
66
67PluginDataRemoverHelper::~PluginDataRemoverHelper() {
68  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
69  if (internal_)
70    internal_->Invalidate();
71}
72
73void 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
83void 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