// Copyright (c) 2010 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/sync/glue/extension_sync_traits.h" #include "base/string_piece.h" #include "base/utf_string_conversions.h" #include "chrome/browser/sync/engine/syncapi.h" #include "chrome/browser/sync/glue/extension_util.h" #include "chrome/browser/sync/protocol/app_specifics.pb.h" #include "chrome/browser/sync/protocol/extension_specifics.pb.h" #include "chrome/common/extensions/extension.h" namespace browser_sync { ExtensionSyncTraits::ExtensionSyncTraits( syncable::ModelType model_type, IsValidAndSyncablePredicate is_valid_and_syncable, ShouldHandleExtensionUninstallPredicate should_handle_extension_uninstall, const char* root_node_tag, ExtensionSpecificsGetter extension_specifics_getter, ExtensionSpecificsSetter extension_specifics_setter, ExtensionSpecificsEntityGetter extension_specifics_entity_getter) : model_type(model_type), is_valid_and_syncable(is_valid_and_syncable), should_handle_extension_uninstall(should_handle_extension_uninstall), root_node_tag(root_node_tag), extension_specifics_getter(extension_specifics_getter), extension_specifics_setter(extension_specifics_setter), extension_specifics_entity_getter(extension_specifics_entity_getter) {} ExtensionSyncTraits::~ExtensionSyncTraits() {} namespace { const sync_pb::ExtensionSpecifics& GetExtensionSpecifics( const sync_api::BaseNode& node) { return node.GetExtensionSpecifics(); } void SetExtensionSpecifics( const sync_pb::ExtensionSpecifics& extension_specifics, sync_api::WriteNode* node) { node->SetTitle(UTF8ToWide(extension_specifics.name())); node->SetExtensionSpecifics(extension_specifics); } bool GetExtensionSpecificsFromEntity( const sync_pb::EntitySpecifics& entity_specifics, sync_pb::ExtensionSpecifics* extension_specifics) { if (!entity_specifics.HasExtension(sync_pb::extension)) { return false; } *extension_specifics = entity_specifics.GetExtension(sync_pb::extension); return true; } bool IsSyncableExtension(Extension::Type type, const GURL& update_url) { switch (type) { case Extension::TYPE_EXTENSION: return true; case Extension::TYPE_USER_SCRIPT: // We only want to sync user scripts with update URLs. return !update_url.is_empty(); default: return false; } } bool IsValidAndSyncableExtension(const Extension& extension) { return IsExtensionValid(extension) && IsSyncableExtension(extension.GetType(), extension.update_url()); } bool IsExtensionUninstall( const UninstalledExtensionInfo& uninstalled_extension_info) { return IsSyncableExtension(uninstalled_extension_info.extension_type, uninstalled_extension_info.update_url); } } // namespace ExtensionSyncTraits GetExtensionSyncTraits() { return ExtensionSyncTraits(syncable::EXTENSIONS, &IsValidAndSyncableExtension, &IsExtensionUninstall, "google_chrome_extensions", &GetExtensionSpecifics, &SetExtensionSpecifics, &GetExtensionSpecificsFromEntity); } namespace { const sync_pb::ExtensionSpecifics& GetExtensionSpecificsOfApp( const sync_api::BaseNode& node) { return node.GetAppSpecifics().extension(); } void SetExtensionSpecificsOfApp( const sync_pb::ExtensionSpecifics& extension_specifics, sync_api::WriteNode* node) { node->SetTitle(UTF8ToWide(extension_specifics.name())); sync_pb::AppSpecifics app_specifics; *app_specifics.mutable_extension() = extension_specifics; node->SetAppSpecifics(app_specifics); } bool GetExtensionSpecificsFromEntityOfApp( const sync_pb::EntitySpecifics& entity_specifics, sync_pb::ExtensionSpecifics* extension_specifics) { if (!entity_specifics.HasExtension(sync_pb::app)) { return false; } *extension_specifics = entity_specifics.GetExtension(sync_pb::app).extension(); return true; } bool IsSyncableApp(Extension::Type type) { return (type == Extension::TYPE_HOSTED_APP) || (type == Extension::TYPE_PACKAGED_APP); } bool IsValidAndSyncableApp( const Extension& extension) { return IsExtensionValid(extension) && IsSyncableApp(extension.GetType()); } bool IsAppUninstall( const UninstalledExtensionInfo& uninstalled_extension_info) { return IsSyncableApp(uninstalled_extension_info.extension_type); } } // namespace ExtensionSyncTraits GetAppSyncTraits() { return ExtensionSyncTraits(syncable::APPS, &IsValidAndSyncableApp, &IsAppUninstall, "google_chrome_apps", &GetExtensionSpecificsOfApp, &SetExtensionSpecificsOfApp, &GetExtensionSpecificsFromEntityOfApp); } } // namespace browser_sync