168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/pending_enables.h"
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/sync_bundle.h"
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/sync_driver/sync_prefs.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace extensions {
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)PendingEnables::PendingEnables(scoped_ptr<sync_driver::SyncPrefs> sync_prefs,
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                               SyncBundle* sync_bundle,
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                               syncer::ModelType enable_type)
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    : sync_prefs_(sync_prefs.Pass()),
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      sync_bundle_(sync_bundle),
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      enable_type_(enable_type),
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      is_sync_enabled_for_test_(false) {}
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)PendingEnables::~PendingEnables() {
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void PendingEnables::OnExtensionEnabled(const std::string& extension_id) {
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (IsWaitingForSync())
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ids_.insert(extension_id);
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void PendingEnables::OnExtensionDisabled(const std::string& extension_id) {
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (IsWaitingForSync())
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ids_.erase(extension_id);
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void PendingEnables::OnSyncStarted(ExtensionService* service) {
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (std::set<std::string>::const_iterator it = ids_.begin();
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)       it != ids_.end(); ++it) {
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const Extension* extension = service->GetExtensionById(*it, true);
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (extension)
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      sync_bundle_->SyncChangeIfNeeded(*extension);
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ids_.clear();
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool PendingEnables::Contains(const std::string& extension_id) const {
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return ids_.find(extension_id) != ids_.end();
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool PendingEnables::IsSyncEnabled() {
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (is_sync_enabled_for_test_)
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return true;
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return sync_prefs_ &&
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      sync_prefs_->HasSyncSetupCompleted() &&
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      sync_prefs_->GetPreferredDataTypes(syncer::ModelTypeSet(enable_type_))
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          .Has(enable_type_);
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool PendingEnables::IsWaitingForSync() {
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return IsSyncEnabled() && !sync_bundle_->IsSyncing();
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace extensions
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
63