| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/glue/extension_util.h" | 5 #include "chrome/browser/sync/glue/extension_util.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/stl_util-inl.h" | 11 #include "base/stl_util-inl.h" |
| 12 #include "base/version.h" | 12 #include "base/version.h" |
| 13 #include "chrome/browser/extensions/extension_prefs.h" | 13 #include "chrome/browser/extensions/extension_prefs.h" |
| 14 #include "chrome/browser/extensions/extension_service.h" | 14 #include "chrome/browser/extensions/extension_service.h" |
| 15 #include "chrome/browser/extensions/extension_sync_data.h" |
| 15 #include "chrome/browser/sync/protocol/extension_specifics.pb.h" | 16 #include "chrome/browser/sync/protocol/extension_specifics.pb.h" |
| 16 #include "chrome/common/extensions/extension.h" | |
| 17 #include "chrome/common/extensions/extension_constants.h" | 17 #include "chrome/common/extensions/extension_constants.h" |
| 18 | 18 |
| 19 namespace browser_sync { | 19 namespace browser_sync { |
| 20 | 20 |
| 21 bool IsExtensionValid(const Extension& extension) { | 21 bool IsExtensionValid(const Extension& extension) { |
| 22 // TODO(akalin): Figure out if we need to allow some other types. | 22 // TODO(akalin): Figure out if we need to allow some other types. |
| 23 if (extension.location() != Extension::INTERNAL) { | 23 if (extension.location() != Extension::INTERNAL) { |
| 24 // We have a non-standard location. | 24 // We have a non-standard location. |
| 25 return false; | 25 return false; |
| 26 } | 26 } |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 bool incognito_enabled = extension_service.IsIncognitoEnabled(id); | 150 bool incognito_enabled = extension_service.IsIncognitoEnabled(id); |
| 151 specifics->set_id(id); | 151 specifics->set_id(id); |
| 152 specifics->set_version(extension.VersionString()); | 152 specifics->set_version(extension.VersionString()); |
| 153 specifics->set_update_url(extension.update_url().spec()); | 153 specifics->set_update_url(extension.update_url().spec()); |
| 154 specifics->set_enabled(enabled); | 154 specifics->set_enabled(enabled); |
| 155 specifics->set_incognito_enabled(incognito_enabled); | 155 specifics->set_incognito_enabled(incognito_enabled); |
| 156 specifics->set_name(extension.name()); | 156 specifics->set_name(extension.name()); |
| 157 DcheckIsExtensionSpecificsValid(*specifics); | 157 DcheckIsExtensionSpecificsValid(*specifics); |
| 158 } | 158 } |
| 159 | 159 |
| 160 bool IsExtensionOutdated(const Extension& extension, | |
| 161 const sync_pb::ExtensionSpecifics& specifics) { | |
| 162 DCHECK(IsExtensionValid(extension)); | |
| 163 DcheckIsExtensionSpecificsValid(specifics); | |
| 164 scoped_ptr<Version> specifics_version( | |
| 165 Version::GetVersionFromString(specifics.version())); | |
| 166 if (!specifics_version.get()) { | |
| 167 // If version is invalid, assume we're up-to-date. | |
| 168 return false; | |
| 169 } | |
| 170 return extension.version()->CompareTo(*specifics_version) < 0; | |
| 171 } | |
| 172 | |
| 173 void MergeExtensionSpecifics( | 160 void MergeExtensionSpecifics( |
| 174 const sync_pb::ExtensionSpecifics& specifics, | 161 const sync_pb::ExtensionSpecifics& specifics, |
| 175 bool merge_user_properties, | 162 bool merge_user_properties, |
| 176 sync_pb::ExtensionSpecifics* merged_specifics) { | 163 sync_pb::ExtensionSpecifics* merged_specifics) { |
| 177 DcheckIsExtensionSpecificsValid(*merged_specifics); | 164 DcheckIsExtensionSpecificsValid(*merged_specifics); |
| 178 DcheckIsExtensionSpecificsValid(specifics); | 165 DcheckIsExtensionSpecificsValid(specifics); |
| 179 DCHECK_EQ(specifics.id(), merged_specifics->id()); | 166 DCHECK_EQ(specifics.id(), merged_specifics->id()); |
| 180 // TODO(akalin): Merge enabled permissions when we sync those. | 167 // TODO(akalin): Merge enabled permissions when we sync those. |
| 181 scoped_ptr<Version> version( | 168 scoped_ptr<Version> version( |
| 182 Version::GetVersionFromString(specifics.version())); | 169 Version::GetVersionFromString(specifics.version())); |
| 183 CHECK(version.get()); | 170 CHECK(version.get()); |
| 184 scoped_ptr<Version> merged_version( | 171 scoped_ptr<Version> merged_version( |
| 185 Version::GetVersionFromString(merged_specifics->version())); | 172 Version::GetVersionFromString(merged_specifics->version())); |
| 186 CHECK(merged_version.get()); | 173 CHECK(merged_version.get()); |
| 187 if (version->CompareTo(*merged_version) >= 0) { | 174 if (version->CompareTo(*merged_version) >= 0) { |
| 188 // |specifics| has a more recent or the same version, so merge it | 175 // |specifics| has a more recent or the same version, so merge it |
| 189 // in. | 176 // in. |
| 190 CopyNonUserProperties(specifics, merged_specifics); | 177 CopyNonUserProperties(specifics, merged_specifics); |
| 191 if (merge_user_properties) { | 178 if (merge_user_properties) { |
| 192 CopyUserProperties(specifics, merged_specifics); | 179 CopyUserProperties(specifics, merged_specifics); |
| 193 } | 180 } |
| 194 } | 181 } |
| 195 } | 182 } |
| 196 | 183 |
| 184 bool GetExtensionSyncData( |
| 185 const sync_pb::ExtensionSpecifics& specifics, |
| 186 ExtensionSyncData* sync_data) { |
| 187 if (!Extension::IdIsValid(specifics.id())) { |
| 188 return false; |
| 189 } |
| 190 |
| 191 scoped_ptr<Version> version( |
| 192 Version::GetVersionFromString(specifics.version())); |
| 193 if (!version.get()) { |
| 194 return false; |
| 195 } |
| 196 |
| 197 // The update URL must be either empty or valid. |
| 198 GURL update_url(specifics.update_url()); |
| 199 if (!update_url.is_empty() && !update_url.is_valid()) { |
| 200 return false; |
| 201 } |
| 202 |
| 203 sync_data->id = specifics.id(); |
| 204 sync_data->update_url = update_url; |
| 205 sync_data->version = *version; |
| 206 sync_data->enabled = specifics.enabled(); |
| 207 sync_data->incognito_enabled = specifics.incognito_enabled(); |
| 208 return true; |
| 209 } |
| 210 |
| 211 bool IsSyncableExtension(Extension::Type type, const GURL& update_url) { |
| 212 switch (type) { |
| 213 case Extension::TYPE_EXTENSION: |
| 214 return true; |
| 215 case Extension::TYPE_USER_SCRIPT: |
| 216 // We only want to sync user scripts with update URLs. |
| 217 return !update_url.is_empty(); |
| 218 default: |
| 219 return false; |
| 220 } |
| 221 } |
| 222 |
| 223 bool IsValidAndSyncableExtension(const Extension& extension) { |
| 224 return |
| 225 IsExtensionValid(extension) && |
| 226 IsSyncableExtension(extension.GetType(), extension.update_url()); |
| 227 } |
| 228 |
| 229 bool IsSyncableApp(Extension::Type type) { |
| 230 return |
| 231 (type == Extension::TYPE_HOSTED_APP) || |
| 232 (type == Extension::TYPE_PACKAGED_APP); |
| 233 } |
| 234 |
| 235 bool IsValidAndSyncableApp( |
| 236 const Extension& extension) { |
| 237 return IsExtensionValid(extension) && IsSyncableApp(extension.GetType()); |
| 238 } |
| 239 |
| 197 } // namespace browser_sync | 240 } // namespace browser_sync |
| OLD | NEW |