1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/glue/extension_sync_traits.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_piece.h" 8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h" 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/engine/syncapi.h" 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/sync/glue/extension_util.h" 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/protocol/app_specifics.pb.h" 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sync/protocol/extension_specifics.pb.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/extensions/extension.h" 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace browser_sync { 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenExtensionSyncTraits::ExtensionSyncTraits( 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen syncable::ModelType model_type, 1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IsValidAndSyncablePredicate is_valid_and_syncable, 2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ShouldHandleExtensionUninstallPredicate 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen should_handle_extension_uninstall, 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const char* root_node_tag, 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionSpecificsGetter extension_specifics_getter, 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionSpecificsSetter extension_specifics_setter, 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen ExtensionSpecificsEntityGetter extension_specifics_entity_getter) 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : model_type(model_type), 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen is_valid_and_syncable(is_valid_and_syncable), 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen should_handle_extension_uninstall(should_handle_extension_uninstall), 29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen root_node_tag(root_node_tag), 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen extension_specifics_getter(extension_specifics_getter), 31bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen extension_specifics_setter(extension_specifics_setter), 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen extension_specifics_entity_getter(extension_specifics_entity_getter) {} 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 34731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickExtensionSyncTraits::~ExtensionSyncTraits() {} 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace { 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst sync_pb::ExtensionSpecifics& GetExtensionSpecifics( 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const sync_api::BaseNode& node) { 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return node.GetExtensionSpecifics(); 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SetExtensionSpecifics( 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const sync_pb::ExtensionSpecifics& extension_specifics, 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sync_api::WriteNode* node) { 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen node->SetTitle(UTF8ToWide(extension_specifics.name())); 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen node->SetExtensionSpecifics(extension_specifics); 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool GetExtensionSpecificsFromEntity( 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const sync_pb::EntitySpecifics& entity_specifics, 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sync_pb::ExtensionSpecifics* extension_specifics) { 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!entity_specifics.HasExtension(sync_pb::extension)) { 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *extension_specifics = entity_specifics.GetExtension(sync_pb::extension); 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool IsSyncableExtension(Extension::Type type, const GURL& update_url) { 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen switch (type) { 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen case Extension::TYPE_EXTENSION: 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen case Extension::TYPE_USER_SCRIPT: 6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // We only want to sync user scripts with update URLs. 6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return !update_url.is_empty(); 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen default: 6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool IsValidAndSyncableExtension(const Extension& extension) { 7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return 7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IsExtensionValid(extension) && 7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen IsSyncableExtension(extension.GetType(), extension.update_url()); 7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool IsExtensionUninstall( 7921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const UninstalledExtensionInfo& uninstalled_extension_info) { 8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return IsSyncableExtension(uninstalled_extension_info.extension_type, 8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen uninstalled_extension_info.update_url); 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenExtensionSyncTraits GetExtensionSyncTraits() { 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return ExtensionSyncTraits(syncable::EXTENSIONS, 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &IsValidAndSyncableExtension, 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &IsExtensionUninstall, 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "google_chrome_extensions", 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &GetExtensionSpecifics, 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &SetExtensionSpecifics, 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &GetExtensionSpecificsFromEntity); 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace { 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenconst sync_pb::ExtensionSpecifics& GetExtensionSpecificsOfApp( 99bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const sync_api::BaseNode& node) { 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return node.GetAppSpecifics().extension(); 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SetExtensionSpecificsOfApp( 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const sync_pb::ExtensionSpecifics& extension_specifics, 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sync_api::WriteNode* node) { 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen node->SetTitle(UTF8ToWide(extension_specifics.name())); 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sync_pb::AppSpecifics app_specifics; 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *app_specifics.mutable_extension() = extension_specifics; 109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen node->SetAppSpecifics(app_specifics); 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool GetExtensionSpecificsFromEntityOfApp( 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const sync_pb::EntitySpecifics& entity_specifics, 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sync_pb::ExtensionSpecifics* extension_specifics) { 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!entity_specifics.HasExtension(sync_pb::app)) { 116bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 117bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 118bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *extension_specifics = 119bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen entity_specifics.GetExtension(sync_pb::app).extension(); 120bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 121bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 122bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool IsSyncableApp(Extension::Type type) { 12421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return 12521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (type == Extension::TYPE_HOSTED_APP) || 12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (type == Extension::TYPE_PACKAGED_APP); 12721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool IsValidAndSyncableApp( 13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const Extension& extension) { 13121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return IsExtensionValid(extension) && IsSyncableApp(extension.GetType()); 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 13321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 13421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool IsAppUninstall( 13521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const UninstalledExtensionInfo& uninstalled_extension_info) { 13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return IsSyncableApp(uninstalled_extension_info.extension_type); 13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace 140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 141bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenExtensionSyncTraits GetAppSyncTraits() { 142bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return ExtensionSyncTraits(syncable::APPS, 14321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &IsValidAndSyncableApp, 14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &IsAppUninstall, 145bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen "google_chrome_apps", 146bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &GetExtensionSpecificsOfApp, 147bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &SetExtensionSpecificsOfApp, 148bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &GetExtensionSpecificsFromEntityOfApp); 149bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 150bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 151bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace browser_sync 152