Implement syncing of bookmark apps.
This CL adds syncing of bookmark apps. This involves syncing two extra fields,
which are the bookmark app url and description. These are not populated for
non-bookmark apps. The bookmark app name is obtained from the extension sync
data's name field.
Bookmark apps that are installled from sync will not have any icon. Updating
the icon and possibly fetching it on sync will be implemented in a future CL.
Bookmark apps that are updated with a new name will keep their icons.
This CL also adds a GetWebApplicationInfoFromBookmarkApp() function that
returns a ready-to-install WebApplicationInfo that is populated with the app's
details and icons.
BUG=318607
Review URL: https://codereview.chromium.org/229553003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@265887 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/extensions/extension_sync_service.cc b/chrome/browser/extensions/extension_sync_service.cc
index dd5ca84..7dbe613 100644
--- a/chrome/browser/extensions/extension_sync_service.cc
+++ b/chrome/browser/extensions/extension_sync_service.cc
@@ -7,9 +7,11 @@
#include <iterator>
#include "base/basictypes.h"
+#include "base/strings/utf_string_conversions.h"
#include "base/threading/sequenced_worker_pool.h"
#include "base/threading/thread_restrictions.h"
#include "chrome/browser/extensions/app_sync_data.h"
+#include "chrome/browser/extensions/bookmark_app_helper.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_sync_data.h"
#include "chrome/browser/extensions/extension_sync_service_factory.h"
@@ -17,22 +19,46 @@
#include "chrome/browser/extensions/launch_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/glue/sync_start_util.h"
+#include "chrome/common/extensions/extension_constants.h"
+#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
#include "chrome/common/extensions/sync_helper.h"
+#include "chrome/common/web_application_info.h"
#include "components/sync_driver/sync_prefs.h"
#include "extensions/browser/app_sorting.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/extension.h"
+#include "extensions/common/extension_icon_set.h"
#include "extensions/common/feature_switch.h"
#include "extensions/common/manifest_constants.h"
+#include "extensions/common/manifest_handlers/icons_handler.h"
#include "sync/api/sync_change.h"
#include "sync/api/sync_error_factory.h"
+#include "ui/gfx/image/image_family.h"
using extensions::Extension;
using extensions::ExtensionPrefs;
using extensions::ExtensionRegistry;
using extensions::FeatureSwitch;
+namespace {
+
+void OnWebApplicationInfoLoaded(
+ WebApplicationInfo synced_info,
+ base::WeakPtr<ExtensionService> extension_service,
+ const WebApplicationInfo& loaded_info) {
+ DCHECK_EQ(synced_info.app_url, loaded_info.app_url);
+
+ if (!extension_service)
+ return;
+
+ // Use the old icons if they exist.
+ synced_info.icons = loaded_info.icons;
+ CreateOrUpdateBookmarkApp(extension_service.get(), synced_info);
+}
+
+} // namespace
+
ExtensionSyncService::ExtensionSyncService(Profile* profile,
ExtensionPrefs* extension_prefs,
ExtensionService* extension_service)
@@ -317,6 +343,9 @@
app_sync_data.launch_type());
}
+ if (!app_sync_data.bookmark_app_url().empty())
+ ProcessBookmarkAppSyncData(app_sync_data);
+
if (!ProcessExtensionSyncDataHelper(app_sync_data.extension_sync_data(),
syncer::APPS)) {
app_sync_bundle_.AddPendingApp(id, app_sync_data);
@@ -327,6 +356,46 @@
return true;
}
+void ExtensionSyncService::ProcessBookmarkAppSyncData(
+ const extensions::AppSyncData& app_sync_data) {
+ // Process bookmark app sync if necessary.
+ GURL bookmark_app_url(app_sync_data.bookmark_app_url());
+ if (!bookmark_app_url.is_valid() ||
+ app_sync_data.extension_sync_data().uninstalled()) {
+ return;
+ }
+
+ const extensions::Extension* extension =
+ extension_service_->GetInstalledExtension(
+ app_sync_data.extension_sync_data().id());
+
+ // Return if there are no bookmark app details that need updating.
+ if (extension && extension->non_localized_name() ==
+ app_sync_data.extension_sync_data().name() &&
+ extension->description() == app_sync_data.bookmark_app_description()) {
+ return;
+ }
+
+ WebApplicationInfo web_app_info;
+ web_app_info.app_url = bookmark_app_url;
+ web_app_info.title =
+ base::UTF8ToUTF16(app_sync_data.extension_sync_data().name());
+ web_app_info.description =
+ base::UTF8ToUTF16(app_sync_data.bookmark_app_description());
+
+ // If the bookmark app already exists, keep the old icons.
+ if (!extension) {
+ CreateOrUpdateBookmarkApp(extension_service_, web_app_info);
+ } else {
+ app_sync_data.extension_sync_data().name();
+ GetWebApplicationInfoFromApp(profile_,
+ extension,
+ base::Bind(&OnWebApplicationInfoLoaded,
+ web_app_info,
+ extension_service_->AsWeakPtr()));
+ }
+}
+
void ExtensionSyncService::SyncOrderingChange(const std::string& extension_id) {
const extensions::Extension* ext = extension_service_->GetInstalledExtension(
extension_id);