Index: chrome/browser/extensions/extension_service.cc |
=================================================================== |
--- chrome/browser/extensions/extension_service.cc (revision 97482) |
+++ chrome/browser/extensions/extension_service.cc (working copy) |
@@ -53,7 +53,6 @@ |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/search_engines/template_url_service.h" |
#include "chrome/browser/search_engines/template_url_service_factory.h" |
-#include "chrome/browser/sync/api/sync_change.h" |
#include "chrome/browser/themes/theme_service.h" |
#include "chrome/browser/themes/theme_service_factory.h" |
#include "chrome/browser/ui/webui/chrome_url_data_manager.h" |
@@ -152,14 +151,6 @@ |
plugin->ForceShutdown(); |
} |
-static bool IsSyncableExtension(const Extension& extension) { |
- return extension.GetSyncType() == Extension::SYNC_TYPE_EXTENSION; |
-} |
- |
-static bool IsSyncableApp(const Extension& extension) { |
- return extension.GetSyncType() == Extension::SYNC_TYPE_APP; |
-} |
- |
// Manages an ExtensionInstallUI for a particular extension. |
class SimpleExtensionLoadPrompt : public ExtensionInstallUI::Delegate { |
public: |
@@ -526,9 +517,8 @@ |
// static |
// This function is used to implement the command-line switch |
-// --uninstall-extension, and to uninstall an extension via sync. The LOG |
-// statements within this function are used to inform the user if the uninstall |
-// cannot be done. |
+// --uninstall-extension. The LOG statements within this function are used to |
+// inform the user if the uninstall cannot be done. |
bool ExtensionService::UninstallExtensionHelper( |
ExtensionService* extensions_service, |
const std::string& extension_id) { |
@@ -865,18 +855,6 @@ |
return false; |
} |
- // Extract the data we need for sync now, but don't actually sync until we've |
- // completed the uninstallation. |
- SyncBundle* sync_bundle = GetSyncBundleForExtension(*extension); |
- |
- SyncChange sync_change; |
- if (sync_bundle) { |
- ExtensionSyncData extension_sync_data(*extension, |
- IsExtensionEnabled(extension_id), |
- IsIncognitoEnabled(extension_id)); |
- sync_change = extension_sync_data.GetSyncChange(SyncChange::ACTION_DELETE); |
- } |
- |
UninstalledExtensionInfo uninstalled_extension_info(*extension); |
UMA_HISTOGRAM_ENUMERATION("Extensions.UninstallType", |
@@ -916,12 +894,6 @@ |
Source<Profile>(profile_), |
Details<UninstalledExtensionInfo>(&uninstalled_extension_info)); |
- if (sync_bundle && sync_bundle->HasExtensionId(extension_id)) { |
- sync_bundle->sync_processor->ProcessSyncChanges( |
- FROM_HERE, SyncChangeList(1, sync_change)); |
- sync_bundle->synced_extensions.erase(extension_id); |
- } |
- |
return true; |
} |
@@ -980,8 +952,6 @@ |
extension_prefs_->SetBrowserActionVisibility(extension, true); |
NotifyExtensionLoaded(extension); |
- |
- SyncExtensionChangeIfNeeded(*extension); |
} |
void ExtensionService::DisableExtension(const std::string& extension_id) { |
@@ -1018,8 +988,6 @@ |
} |
NotifyExtensionUnloaded(extension, extension_misc::UNLOAD_REASON_DISABLE); |
- |
- SyncExtensionChangeIfNeeded(*extension); |
} |
void ExtensionService::GrantPermissions(const Extension* extension) { |
@@ -1652,224 +1620,60 @@ |
} |
} |
-namespace { |
- bool IsSyncableNone(const Extension& extension) { return false; } |
-} // namespace |
- |
-ExtensionService::SyncBundle::SyncBundle() |
- : filter(IsSyncableNone), |
- sync_processor(NULL) { |
+ExtensionSyncData ExtensionService::GetSyncDataHelper( |
+ const Extension& extension) const { |
+ const std::string& id = extension.id(); |
+ ExtensionSyncData data; |
+ data.id = id; |
+ data.uninstalled = false; |
+ data.enabled = IsExtensionEnabled(id); |
+ data.incognito_enabled = IsIncognitoEnabled(id); |
+ data.version = *extension.version(); |
+ data.update_url = extension.update_url(); |
+ data.name = extension.name(); |
+ return data; |
} |
-ExtensionService::SyncBundle::~SyncBundle() { |
-} |
- |
-bool ExtensionService::SyncBundle::HasExtensionId(const std::string& id) const { |
- return synced_extensions.find(id) != synced_extensions.end(); |
-} |
- |
-bool ExtensionService::SyncBundle::HasPendingExtensionId(const std::string& id) |
- const { |
- return pending_sync_data.find(id) != pending_sync_data.end(); |
-} |
- |
-void ExtensionService::SyncExtensionChangeIfNeeded(const Extension& extension) { |
- SyncBundle* sync_bundle = GetSyncBundleForExtension(extension); |
- if (sync_bundle) { |
- ExtensionSyncData extension_sync_data(extension, |
- IsExtensionEnabled(extension.id()), |
- IsIncognitoEnabled(extension.id())); |
- |
- SyncChangeList sync_change_list(1, extension_sync_data.GetSyncChange( |
- sync_bundle->HasExtensionId(extension.id()) ? |
- SyncChange::ACTION_UPDATE : SyncChange::ACTION_ADD)); |
- sync_bundle->sync_processor->ProcessSyncChanges( |
- FROM_HERE, sync_change_list); |
- sync_bundle->synced_extensions.insert(extension.id()); |
- sync_bundle->pending_sync_data.erase(extension.id()); |
+bool ExtensionService::GetSyncData( |
+ const Extension& extension, |
+ ExtensionFilter filter, |
+ ExtensionSyncData* extension_sync_data) const { |
+ if (!(*filter)(extension)) { |
+ return false; |
} |
+ *extension_sync_data = GetSyncDataHelper(extension); |
+ return true; |
} |
-ExtensionService::SyncBundle* ExtensionService::GetSyncBundleForExtension( |
- const Extension& extension) { |
- if (app_sync_bundle_.filter(extension)) |
- return &app_sync_bundle_; |
- else if (extension_sync_bundle_.filter(extension)) |
- return &extension_sync_bundle_; |
- else |
- return NULL; |
-} |
- |
-ExtensionService::SyncBundle* |
- ExtensionService::GetSyncBundleForExtensionSyncData( |
- const ExtensionSyncData& extension_sync_data) { |
- switch (extension_sync_data.type()) { |
- case Extension::SYNC_TYPE_APP: |
- return &app_sync_bundle_; |
- case Extension::SYNC_TYPE_EXTENSION: |
- return &extension_sync_bundle_; |
- default: |
- NOTREACHED(); |
- return NULL; |
- } |
-} |
- |
-#define GET_SYNC_BUNDLE_FOR_MODEL_TYPE_BODY() \ |
- do { \ |
- switch (type) { \ |
- case syncable::APPS: \ |
- return &app_sync_bundle_; \ |
- case syncable::EXTENSIONS: \ |
- return &extension_sync_bundle_; \ |
- default: \ |
- NOTREACHED(); \ |
- return NULL; \ |
- } \ |
- } while (0) |
- |
-const ExtensionService::SyncBundle* |
- ExtensionService::GetSyncBundleForModelTypeConst( |
- syncable::ModelType type) const { |
- GET_SYNC_BUNDLE_FOR_MODEL_TYPE_BODY(); |
-} |
- |
-ExtensionService::SyncBundle* ExtensionService::GetSyncBundleForModelType( |
- syncable::ModelType type) { |
- GET_SYNC_BUNDLE_FOR_MODEL_TYPE_BODY(); |
-} |
- |
-#undef GET_SYNC_BUNDLE_FOR_MODEL_TYPE_BODY |
- |
-SyncError ExtensionService::MergeDataAndStartSyncing( |
- syncable::ModelType type, |
- const SyncDataList& initial_sync_data, |
- SyncChangeProcessor* sync_processor) { |
- CHECK(sync_processor); |
- |
- SyncBundle* bundle = NULL; |
- |
- switch (type) { |
- case syncable::EXTENSIONS: |
- bundle = &extension_sync_bundle_; |
- bundle->filter = IsSyncableExtension; |
- break; |
- |
- case syncable::APPS: |
- bundle = &app_sync_bundle_; |
- bundle->filter = IsSyncableApp; |
- break; |
- |
- default: |
- LOG(FATAL) << "Got " << type << " ModelType"; |
- } |
- |
- bundle->sync_processor = sync_processor; |
- |
- for (SyncDataList::const_iterator i = initial_sync_data.begin(); |
- i != initial_sync_data.end(); |
- ++i) { |
- ExtensionSyncData extension_sync_data = ExtensionSyncData(*i); |
- bundle->synced_extensions.insert(extension_sync_data.id()); |
- ProcessExtensionSyncData(extension_sync_data, *bundle); |
- } |
- |
- SyncDataList sync_data_list = GetAllSyncData(type); |
- SyncChangeList sync_change_list; |
- for (SyncDataList::const_iterator i = sync_data_list.begin(); |
- i != sync_data_list.end(); |
- ++i) { |
- if (bundle->HasExtensionId(i->GetTag())) |
- sync_change_list.push_back(SyncChange(SyncChange::ACTION_UPDATE, *i)); |
- else |
- sync_change_list.push_back(SyncChange(SyncChange::ACTION_ADD, *i)); |
- } |
- bundle->sync_processor->ProcessSyncChanges(FROM_HERE, sync_change_list); |
- |
- return SyncError(); |
-} |
- |
-void ExtensionService::StopSyncing(syncable::ModelType type) { |
- SyncBundle* bundle = GetSyncBundleForModelType(type); |
- CHECK(bundle); |
- // This is the simplest way to clear out the bundle. |
- *bundle = SyncBundle(); |
-} |
- |
-SyncDataList ExtensionService::GetAllSyncData(syncable::ModelType type) const { |
- const SyncBundle* bundle = GetSyncBundleForModelTypeConst(type); |
- CHECK(bundle); |
- std::vector<ExtensionSyncData> extension_sync_data = GetSyncDataList(*bundle); |
- SyncDataList result(extension_sync_data.size()); |
- for (int i = 0; i < static_cast<int>(extension_sync_data.size()); ++i) { |
- result[i] = extension_sync_data[i].GetSyncData(); |
- } |
- return result; |
-} |
- |
-SyncError ExtensionService::ProcessSyncChanges( |
- const tracked_objects::Location& from_here, |
- const SyncChangeList& change_list) { |
- for (SyncChangeList::const_iterator i = change_list.begin(); |
- i != change_list.end(); |
- ++i) { |
- ExtensionSyncData extension_sync_data = ExtensionSyncData(*i); |
- SyncBundle* bundle = GetSyncBundleForExtensionSyncData(extension_sync_data); |
- CHECK(bundle); |
- |
- if (extension_sync_data.uninstalled()) |
- bundle->synced_extensions.erase(extension_sync_data.id()); |
- else |
- bundle->synced_extensions.insert(extension_sync_data.id()); |
- ProcessExtensionSyncData(extension_sync_data, *bundle); |
- } |
- |
- return SyncError(); |
-} |
- |
void ExtensionService::GetSyncDataListHelper( |
const ExtensionList& extensions, |
- const SyncBundle& bundle, |
+ ExtensionFilter filter, |
std::vector<ExtensionSyncData>* sync_data_list) const { |
for (ExtensionList::const_iterator it = extensions.begin(); |
it != extensions.end(); ++it) { |
const Extension& extension = **it; |
- if (bundle.filter(extension) && |
- // If we have pending extension data for this extension, then this |
- // version is out of date. We'll sync back the version we got from |
- // sync. |
- !bundle.HasPendingExtensionId(extension.id())) { |
- sync_data_list->push_back( |
- ExtensionSyncData(extension, |
- IsExtensionEnabled(extension.id()), |
- IsIncognitoEnabled(extension.id()))); |
+ if ((*filter)(extension)) { |
+ sync_data_list->push_back(GetSyncDataHelper(extension)); |
} |
} |
} |
std::vector<ExtensionSyncData> ExtensionService::GetSyncDataList( |
- const SyncBundle& bundle) const { |
- std::vector<ExtensionSyncData> extension_sync_list; |
- GetSyncDataListHelper(extensions_, bundle, &extension_sync_list); |
- GetSyncDataListHelper(disabled_extensions_, bundle, &extension_sync_list); |
- GetSyncDataListHelper(terminated_extensions_, bundle, &extension_sync_list); |
- |
- for (std::map<std::string, ExtensionSyncData>::const_iterator i = |
- bundle.pending_sync_data.begin(); |
- i != bundle.pending_sync_data.end(); |
- ++i) { |
- extension_sync_list.push_back(i->second); |
- } |
- |
- return extension_sync_list; |
+ ExtensionFilter filter) const { |
+ std::vector<ExtensionSyncData> sync_data_list; |
+ GetSyncDataListHelper(extensions_, filter, &sync_data_list); |
+ GetSyncDataListHelper(disabled_extensions_, filter, &sync_data_list); |
+ GetSyncDataListHelper(terminated_extensions_, filter, &sync_data_list); |
+ return sync_data_list; |
} |
-void ExtensionService::ProcessExtensionSyncData( |
+void ExtensionService::ProcessSyncData( |
const ExtensionSyncData& extension_sync_data, |
- SyncBundle& bundle) { |
- const std::string& id = extension_sync_data.id(); |
+ ExtensionFilter filter) { |
+ const std::string& id = extension_sync_data.id; |
// Handle uninstalls first. |
- if (extension_sync_data.uninstalled()) { |
+ if (extension_sync_data.uninstalled) { |
std::string error; |
if (!UninstallExtensionHelper(this, id)) { |
LOG(WARNING) << "Could not uninstall extension " << id |
@@ -1879,21 +1683,25 @@ |
} |
// Set user settings. |
- if (extension_sync_data.enabled()) { |
+ if (extension_sync_data.enabled) { |
EnableExtension(id); |
} else { |
DisableExtension(id); |
} |
- SetIsIncognitoEnabled(id, extension_sync_data.incognito_enabled()); |
+ SetIsIncognitoEnabled(id, extension_sync_data.incognito_enabled); |
const Extension* extension = GetInstalledExtension(id); |
if (extension) { |
// If the extension is already installed, check if it's outdated. |
- int result = extension->version()->CompareTo(extension_sync_data.version()); |
+ int result = extension->version()->CompareTo(extension_sync_data.version); |
if (result < 0) { |
// Extension is outdated. |
- bundle.pending_sync_data[extension_sync_data.id()] = extension_sync_data; |
CheckForUpdatesSoon(); |
+ } else if (result > 0) { |
+ // Sync version is outdated. Do nothing for now, as sync code |
+ // in other places will eventually update the sync data. |
+ // |
+ // TODO(akalin): Move that code here. |
} |
} else { |
// TODO(akalin): Replace silent update with a list of enabled |
@@ -1901,17 +1709,12 @@ |
const bool kInstallSilently = true; |
if (!pending_extension_manager()->AddFromSync( |
id, |
- extension_sync_data.update_url(), |
- bundle.filter, |
+ extension_sync_data.update_url, |
+ filter, |
kInstallSilently)) { |
LOG(WARNING) << "Could not add pending extension for " << id; |
- // This means that the extension is already pending installation, with a |
- // non-INTERNAL location. Add to pending_sync_data, even though it will |
- // never be removed (we'll never install a syncable version of the |
- // extension), so that GetAllSyncData() continues to send it. |
+ return; |
} |
- // Track pending extensions so that we can return them in GetAllSyncData(). |
- bundle.pending_sync_data[extension_sync_data.id()] = extension_sync_data; |
CheckForUpdatesSoon(); |
} |
} |
@@ -1954,9 +1757,6 @@ |
enabled_extension, extension_misc::UNLOAD_REASON_DISABLE); |
NotifyExtensionLoaded(enabled_extension); |
} |
- |
- if (extension) |
- SyncExtensionChangeIfNeeded(*extension); |
} |
bool ExtensionService::CanCrossIncognito(const Extension* extension) { |
@@ -2226,12 +2026,10 @@ |
chrome::NOTIFICATION_EXTENSION_UPDATE_DISABLED, |
Source<Profile>(profile_), |
Details<const Extension>(extension)); |
- SyncExtensionChangeIfNeeded(*extension); |
return; |
} |
extensions_.push_back(scoped_extension); |
- SyncExtensionChangeIfNeeded(*extension); |
NotifyExtensionLoaded(extension); |
} |