Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(328)

Side by Side Diff: chrome/browser/privacy_blacklist/blacklist_manager.cc

Issue 341050: Implement loading blacklists from extensions.... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: use real extension Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/privacy_blacklist/blacklist_manager.h" 5 #include "chrome/browser/privacy_blacklist/blacklist_manager.h"
6 6
7 #include "base/message_loop.h" 7 #include "base/message_loop.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "base/task.h" 9 #include "base/task.h"
10 #include "base/thread.h" 10 #include "base/thread.h"
(...skipping 17 matching lines...) Expand all
28 DCHECK(original_loop_); 28 DCHECK(original_loop_);
29 manager->AddRef(); 29 manager->AddRef();
30 } 30 }
31 31
32 ~BlacklistManagerTask() { 32 ~BlacklistManagerTask() {
33 original_loop_->ReleaseSoon(FROM_HERE, manager_); 33 original_loop_->ReleaseSoon(FROM_HERE, manager_);
34 } 34 }
35 35
36 protected: 36 protected:
37 BlacklistManager* blacklist_manager() const { return manager_; } 37 BlacklistManager* blacklist_manager() const { return manager_; }
38 38
39 MessageLoop* original_loop_; 39 MessageLoop* original_loop_;
40 40
41 private: 41 private:
42 BlacklistManager* manager_; 42 BlacklistManager* manager_;
43 43
44 DISALLOW_COPY_AND_ASSIGN(BlacklistManagerTask); 44 DISALLOW_COPY_AND_ASSIGN(BlacklistManagerTask);
45 }; 45 };
46 46
47 BlacklistPathProvider::~BlacklistPathProvider() { 47 BlacklistPathProvider::~BlacklistPathProvider() {
48 } 48 }
49 49
50 class BlacklistManager::CompileBlacklistTask : public BlacklistManagerTask { 50 class BlacklistManager::CompileBlacklistTask : public BlacklistManagerTask {
51 public: 51 public:
52 CompileBlacklistTask(BlacklistManager* manager, 52 CompileBlacklistTask(BlacklistManager* manager,
53 const FilePath& destination_blacklist, 53 const FilePath& destination_blacklist,
54 const std::vector<FilePath>& source_blacklists) 54 const std::vector<FilePath>& source_blacklists)
55 : BlacklistManagerTask(manager), 55 : BlacklistManagerTask(manager),
56 destination_blacklist_(destination_blacklist), 56 destination_blacklist_(destination_blacklist),
57 source_blacklists_(source_blacklists) { 57 source_blacklists_(source_blacklists) {
58 } 58 }
59 59
60 virtual void Run() { 60 virtual void Run() {
61 bool success = true; 61 bool success = true;
62 62
63 Blacklist blacklist; 63 Blacklist blacklist;
64 std::string error_string; 64 std::string error_string;
65 65
66 for (std::vector<FilePath>::const_iterator i = source_blacklists_.begin(); 66 for (std::vector<FilePath>::const_iterator i = source_blacklists_.begin();
67 i != source_blacklists_.end(); ++i) { 67 i != source_blacklists_.end(); ++i) {
68 if (!BlacklistIO::ReadText(&blacklist, *i, &error_string)) { 68 if (!BlacklistIO::ReadText(&blacklist, *i, &error_string)) {
69 success = false; 69 success = false;
70 break; 70 break;
71 } 71 }
72 } 72 }
(...skipping 27 matching lines...) Expand all
100 compiled_blacklist_(compiled_blacklist), 100 compiled_blacklist_(compiled_blacklist),
101 transient_blacklists_(transient_blacklists) { 101 transient_blacklists_(transient_blacklists) {
102 } 102 }
103 103
104 virtual void Run() { 104 virtual void Run() {
105 scoped_ptr<Blacklist> blacklist(new Blacklist); 105 scoped_ptr<Blacklist> blacklist(new Blacklist);
106 if (!BlacklistIO::ReadBinary(blacklist.get(), compiled_blacklist_)) { 106 if (!BlacklistIO::ReadBinary(blacklist.get(), compiled_blacklist_)) {
107 ReportReadResult(NULL); 107 ReportReadResult(NULL);
108 return; 108 return;
109 } 109 }
110 110
111 std::string error_string; 111 std::string error_string;
112 std::vector<FilePath>::const_iterator i; 112 std::vector<FilePath>::const_iterator i;
113 for (i = transient_blacklists_.begin(); 113 for (i = transient_blacklists_.begin();
114 i != transient_blacklists_.end(); ++i) { 114 i != transient_blacklists_.end(); ++i) {
115 if (!BlacklistIO::ReadText(blacklist.get(), *i, &error_string)) { 115 if (!BlacklistIO::ReadText(blacklist.get(), *i, &error_string)) {
116 ReportReadResult(NULL); 116 ReportReadResult(NULL);
117 return; 117 return;
118 } 118 }
119 } 119 }
120 120
121 ReportReadResult(blacklist.release()); 121 ReportReadResult(blacklist.release());
122 } 122 }
123 123
124 private: 124 private:
125 void ReportReadResult(Blacklist* blacklist) { 125 void ReportReadResult(Blacklist* blacklist) {
126 original_loop_->PostTask( 126 original_loop_->PostTask(
127 FROM_HERE, NewRunnableMethod(blacklist_manager(), 127 FROM_HERE, NewRunnableMethod(blacklist_manager(),
128 &BlacklistManager::OnBlacklistReadFinished, 128 &BlacklistManager::OnBlacklistReadFinished,
129 blacklist)); 129 blacklist));
130 } 130 }
131 131
132 FilePath compiled_blacklist_; 132 FilePath compiled_blacklist_;
133 std::vector<FilePath> transient_blacklists_; 133 std::vector<FilePath> transient_blacklists_;
134 134
135 DISALLOW_COPY_AND_ASSIGN(ReadBlacklistTask); 135 DISALLOW_COPY_AND_ASSIGN(ReadBlacklistTask);
136 }; 136 };
137 137
138 BlacklistManager::BlacklistManager(Profile* profile, 138 BlacklistManager::BlacklistManager(Profile* profile,
139 BlacklistPathProvider* path_provider, 139 BlacklistPathProvider* path_provider,
140 base::Thread* backend_thread) 140 base::Thread* backend_thread)
141 : first_read_finished_(false), 141 : first_read_finished_(false),
142 profile_(profile), 142 profile_(profile),
143 compiled_blacklist_path_( 143 compiled_blacklist_path_(
144 profile->GetPath().Append(chrome::kPrivacyBlacklistFileName)), 144 profile->GetPath().Append(chrome::kPrivacyBlacklistFileName)),
145 path_provider_(path_provider), 145 path_provider_(path_provider),
146 backend_thread_(backend_thread) { 146 backend_thread_(backend_thread) {
147 registrar_.Add(this, 147 registrar_.Add(this,
148 NotificationType::BLACKLIST_PATH_PROVIDER_UPDATED, 148 NotificationType::EXTENSION_LOADED,
149 Source<Profile>(profile));
150 registrar_.Add(this,
151 NotificationType::EXTENSION_UNLOADED,
149 Source<Profile>(profile)); 152 Source<Profile>(profile));
150 ReadBlacklist(); 153 ReadBlacklist();
151 } 154 }
152 155
153 void BlacklistManager::Observe(NotificationType type, 156 void BlacklistManager::Observe(NotificationType type,
154 const NotificationSource& source, 157 const NotificationSource& source,
155 const NotificationDetails& details) { 158 const NotificationDetails& details) {
156 DCHECK(type == NotificationType::BLACKLIST_PATH_PROVIDER_UPDATED); 159 switch (type.value) {
157 CompileBlacklist(); 160 case NotificationType::EXTENSION_LOADED:
161 case NotificationType::EXTENSION_UNLOADED:
162 CompileBlacklist();
163 break;
164 default:
165 NOTREACHED();
166 break;
167 }
158 } 168 }
159 169
160 void BlacklistManager::CompileBlacklist() { 170 void BlacklistManager::CompileBlacklist() {
161 DCHECK(CalledOnValidThread()); 171 DCHECK(CalledOnValidThread());
162 172
163 RunTaskOnBackendThread(new CompileBlacklistTask( 173 RunTaskOnBackendThread(new CompileBlacklistTask(
164 this, compiled_blacklist_path_, 174 this, compiled_blacklist_path_,
165 path_provider_->GetPersistentBlacklistPaths())); 175 path_provider_->GetPersistentBlacklistPaths()));
166 } 176 }
167 177
168 void BlacklistManager::ReadBlacklist() { 178 void BlacklistManager::ReadBlacklist() {
169 DCHECK(CalledOnValidThread()); 179 DCHECK(CalledOnValidThread());
170 180
171 RunTaskOnBackendThread(new ReadBlacklistTask( 181 RunTaskOnBackendThread(new ReadBlacklistTask(
172 this, compiled_blacklist_path_, 182 this, compiled_blacklist_path_,
173 path_provider_->GetTransientBlacklistPaths())); 183 path_provider_->GetTransientBlacklistPaths()));
174 } 184 }
175 185
176 void BlacklistManager::OnBlacklistCompilationFinished(bool success) { 186 void BlacklistManager::OnBlacklistCompilationFinished(bool success) {
177 DCHECK(CalledOnValidThread()); 187 DCHECK(CalledOnValidThread());
178 188
179 if (success) { 189 if (success) {
180 ReadBlacklist(); 190 ReadBlacklist();
181 } else { 191 } else {
182 string16 error_message(ASCIIToUTF16("Blacklist compilation failed.")); 192 string16 error_message(ASCIIToUTF16("Blacklist compilation failed."));
183 NotificationService::current()->Notify( 193 NotificationService::current()->Notify(
184 NotificationType::BLACKLIST_MANAGER_ERROR, 194 NotificationType::BLACKLIST_MANAGER_ERROR,
185 Source<Profile>(profile_), 195 Source<Profile>(profile_),
186 Details<string16>(&error_message)); 196 Details<string16>(&error_message));
187 } 197 }
188 } 198 }
189 199
190 void BlacklistManager::OnBlacklistReadFinished(Blacklist* blacklist) { 200 void BlacklistManager::OnBlacklistReadFinished(Blacklist* blacklist) {
191 DCHECK(CalledOnValidThread()); 201 DCHECK(CalledOnValidThread());
192 202
193 if (!blacklist) { 203 if (!blacklist) {
194 if (!first_read_finished_) { 204 if (!first_read_finished_) {
195 // If we're loading for the first time, the compiled blacklist could 205 // If we're loading for the first time, the compiled blacklist could
196 // just not exist. Try compiling it once. 206 // just not exist. Try compiling it once.
197 first_read_finished_ = true; 207 first_read_finished_ = true;
198 CompileBlacklist(); 208 CompileBlacklist();
199 } else { 209 } else {
200 string16 error_message(ASCIIToUTF16("Blacklist read failed.")); 210 string16 error_message(ASCIIToUTF16("Blacklist read failed."));
201 NotificationService::current()->Notify( 211 NotificationService::current()->Notify(
202 NotificationType::BLACKLIST_MANAGER_ERROR, 212 NotificationType::BLACKLIST_MANAGER_ERROR,
203 Source<Profile>(profile_), 213 Source<Profile>(profile_),
204 Details<string16>(&error_message)); 214 Details<string16>(&error_message));
205 } 215 }
206 return; 216 return;
207 } 217 }
208 first_read_finished_ = true; 218 first_read_finished_ = true;
209 compiled_blacklist_.reset(blacklist); 219 compiled_blacklist_.reset(blacklist);
210 220
211 NotificationService::current()->Notify( 221 NotificationService::current()->Notify(
212 NotificationType::BLACKLIST_MANAGER_BLACKLIST_READ_FINISHED, 222 NotificationType::BLACKLIST_MANAGER_BLACKLIST_READ_FINISHED,
213 Source<Profile>(profile_), 223 Source<Profile>(profile_),
214 Details<Blacklist>(blacklist)); 224 Details<Blacklist>(blacklist));
215 } 225 }
216 226
217 void BlacklistManager::RunTaskOnBackendThread(Task* task) { 227 void BlacklistManager::RunTaskOnBackendThread(Task* task) {
218 if (backend_thread_) { 228 if (backend_thread_) {
219 backend_thread_->message_loop()->PostTask(FROM_HERE, task); 229 backend_thread_->message_loop()->PostTask(FROM_HERE, task);
220 } else { 230 } else {
221 task->Run(); 231 task->Run();
222 delete task; 232 delete task;
223 } 233 }
224 } 234 }
OLDNEW
« no previous file with comments | « chrome/browser/gtk/browser_actions_toolbar_gtk.cc ('k') | chrome/browser/privacy_blacklist/blacklist_manager_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698