// Copyright 2013 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/extensions/pending_enables.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/sync_bundle.h"
#include "components/sync_driver/sync_prefs.h"
namespace extensions {
PendingEnables::PendingEnables(scoped_ptr<sync_driver::SyncPrefs> sync_prefs,
SyncBundle* sync_bundle,
syncer::ModelType enable_type)
: sync_prefs_(sync_prefs.Pass()),
sync_bundle_(sync_bundle),
enable_type_(enable_type),
is_sync_enabled_for_test_(false) {}
PendingEnables::~PendingEnables() {
}
void PendingEnables::OnExtensionEnabled(const std::string& extension_id) {
if (IsWaitingForSync())
ids_.insert(extension_id);
}
void PendingEnables::OnExtensionDisabled(const std::string& extension_id) {
if (IsWaitingForSync())
ids_.erase(extension_id);
}
void PendingEnables::OnSyncStarted(ExtensionService* service) {
for (std::set<std::string>::const_iterator it = ids_.begin();
it != ids_.end(); ++it) {
const Extension* extension = service->GetExtensionById(*it, true);
if (extension)
sync_bundle_->SyncChangeIfNeeded(*extension);
}
ids_.clear();
}
bool PendingEnables::Contains(const std::string& extension_id) const {
return ids_.find(extension_id) != ids_.end();
}
bool PendingEnables::IsSyncEnabled() {
if (is_sync_enabled_for_test_)
return true;
return sync_prefs_ &&
sync_prefs_->HasSyncSetupCompleted() &&
sync_prefs_->GetPreferredDataTypes(syncer::ModelTypeSet(enable_type_))
.Has(enable_type_);
}
bool PendingEnables::IsWaitingForSync() {
return IsSyncEnabled() && !sync_bundle_->IsSyncing();
}
} // namespace extensions