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

Unified Diff: chrome/browser/extensions/blacklist.cc

Issue 49253005: Fetch extension blacklist states from SafeBrowsing server (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add unit tests, fix bugs. Created 7 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/blacklist.cc
diff --git a/chrome/browser/extensions/blacklist.cc b/chrome/browser/extensions/blacklist.cc
index f39d1137a968dff41c438a8ed0ab947182b65446..ab8f1d3776b0f4b6e7719e313fe42951be717b04 100644
--- a/chrome/browser/extensions/blacklist.cc
+++ b/chrome/browser/extensions/blacklist.cc
@@ -14,6 +14,7 @@
#include "base/stl_util.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/extensions/blacklist_fetcher.h"
#include "chrome/browser/extensions/extension_prefs.h"
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/safe_browsing/safe_browsing_util.h"
@@ -154,7 +155,7 @@ Blacklist::ScopedDatabaseManagerForTest::~ScopedDatabaseManagerForTest() {
SetDatabaseManager(original_);
}
-Blacklist::Blacklist(ExtensionPrefs* prefs) {
+Blacklist::Blacklist(ExtensionPrefs* prefs) : fetcher_() {
not at google - send to devlin 2013/11/18 17:03:49 fetcher_() is implicit?
Oleg Eterevsky 2013/11/20 12:58:45 Removed.
scoped_refptr<SafeBrowsingDatabaseManager> database_manager =
g_database_manager.Get().get();
if (database_manager) {
@@ -223,7 +224,9 @@ void Blacklist::GetBlacklistStateForIDs(
it != blacklisted_ids.end(); ++it) {
BlacklistStateMap::const_iterator cache_it =
blacklist_state_cache_.find(*it);
- if (cache_it == blacklist_state_cache_.end())
+ if (cache_it == blacklist_state_cache_.end() ||
+ cache_it->second == BLACKLISTED_UNKNOWN) // Do not return UNKNOWN
+ // from cache, retry request.
ids_unknown_state.insert(*it);
else
extensions_state[*it] = cache_it->second;
@@ -251,8 +254,9 @@ void Blacklist::ReturnBlacklistStateMap(
it != blacklisted_ids.end(); ++it) {
BlacklistStateMap::const_iterator cache_it =
blacklist_state_cache_.find(*it);
- if (cache_it != blacklist_state_cache_.end())
+ if (cache_it != blacklist_state_cache_.end()) {
extensions_state[*it] = cache_it->second;
+ }
not at google - send to devlin 2013/11/18 17:03:49 preferred the way it was
Oleg Eterevsky 2013/11/20 12:58:45 Must have added something and then removed. Change
// If for some reason we still haven't cached the state of this extension,
// we silently skip it.
}
@@ -263,15 +267,50 @@ void Blacklist::ReturnBlacklistStateMap(
void Blacklist::RequestExtensionsBlacklistState(
const std::set<std::string> ids, base::Callback<void()> callback) {
not at google - send to devlin 2013/11/18 17:03:49 Both of these should have been const&; in the latt
Oleg Eterevsky 2013/11/20 12:58:45 Done.
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- // This is a stub. The request will be made here, but the server is not up
- // yet. For compatibility with current blacklist logic, mark all extensions
- // as malicious.
+ if (!fetcher_) {
+ fetcher_.reset(new BlacklistFetcher());
+ }
not at google - send to devlin 2013/11/18 17:03:49 no {} around single-line if bodies
Oleg Eterevsky 2013/11/20 12:58:45 Done.
+
+ state_requests_.push_back(
+ make_pair(std::vector<std::string>(ids.begin(), ids.end()), callback));
for (std::set<std::string>::const_iterator it = ids.begin();
it != ids.end();
++it) {
- blacklist_state_cache_[*it] = BLACKLISTED_MALWARE;
+ fetcher_->Request(*it, base::Bind(&Blacklist::OnBlacklistStateReceived,
+ AsWeakPtr(), *it));
+ }
+}
+
+void Blacklist::OnBlacklistStateReceived(std::string id, BlacklistState state) {
not at google - send to devlin 2013/11/18 17:03:49 const std::string& base::Bind can handle it.
Oleg Eterevsky 2013/11/20 12:58:45 Done.
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ blacklist_state_cache_[id] = state;
+
+ StateRequestsList::iterator requests_it = state_requests_.begin();
not at google - send to devlin 2013/11/18 17:03:49 I'm not sure you need state_requests_ at all. Blac
Oleg Eterevsky 2013/11/20 12:58:45 I'm a bit reluctant about it. To do this we'll hav
not at google - send to devlin 2013/11/20 23:44:48 You would pass around a pointer with base::Owned()
Oleg Eterevsky 2013/11/21 16:53:13 base::Owned won't work here, since OnBlacklistStat
not at google - send to devlin 2013/11/21 18:42:57 You're right, and now that my memory is working co
+ while (requests_it != state_requests_.end()) {
+ const std::vector<std::string>& ids = requests_it->first;
+
+ bool have_all_in_cache = true;
+ for (std::vector<std::string>::const_iterator ids_it = ids.begin();
+ ids_it != ids.end();
+ ++ids_it) {
+ if (blacklist_state_cache_.find(*ids_it) ==
+ blacklist_state_cache_.end()) {
not at google - send to devlin 2013/11/18 17:03:49 since you're not holding onto the iterator result
Oleg Eterevsky 2013/11/20 12:58:45 I just googled "find vs count stl" and people tend
not at google - send to devlin 2013/11/20 23:44:48 I'm told you should use ContainsKey: https://code
Oleg Eterevsky 2013/11/21 16:53:13 Replaced it here and in other places. On 2013/11/
+ have_all_in_cache = false;
+ break;
+ }
+ }
+
+ if (have_all_in_cache) {
+ requests_it->second.Run();
+ requests_it = state_requests_.erase(requests_it);
+ } else {
+ ++requests_it;
+ }
}
- callback.Run();
+}
+
+void Blacklist::SetBlacklistFetcherForTest(BlacklistFetcher* fetcher) {
+ fetcher_.reset(fetcher);
}
void Blacklist::AddObserver(Observer* observer) {

Powered by Google App Engine
This is Rietveld 408576698