15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/app_sync_data.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_data.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/app_specifics.pb.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AppSyncData::AppSyncData() {}
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AppSyncData::AppSyncData(const syncer::SyncData& sync_data) {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopulateFromSyncData(sync_data);
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AppSyncData::AppSyncData(const syncer::SyncChange& sync_change) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopulateFromSyncData(sync_change.sync_data());
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_sync_data_.set_uninstalled(
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sync_change.change_type() == syncer::SyncChange::ACTION_DELETE);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppSyncData::AppSyncData(const Extension& extension,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool enabled,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         bool incognito_enabled,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         bool remote_install,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const syncer::StringOrdinal& app_launch_ordinal,
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const syncer::StringOrdinal& page_ordinal,
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         extensions::LaunchType launch_type)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : extension_sync_data_(extension,
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           enabled,
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           incognito_enabled,
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           remote_install),
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      app_launch_ordinal_(app_launch_ordinal),
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      page_ordinal_(page_ordinal),
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      launch_type_(launch_type) {
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (extension.from_bookmark()) {
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    bookmark_app_description_ = extension.description();
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    bookmark_app_url_ = AppLaunchInfo::GetLaunchWebURL(&extension).spec();
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppSyncData::~AppSyncData() {}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncData AppSyncData::GetSyncData() const {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::EntitySpecifics specifics;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopulateAppSpecifics(specifics.mutable_app());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncData::CreateLocalData(extension_sync_data_.id(),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   extension_sync_data_.name(),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   specifics);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::SyncChange AppSyncData::GetSyncChange(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::SyncChange::SyncChangeType change_type) const {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::SyncChange(FROM_HERE, change_type, GetSyncData());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppSyncData::PopulateAppSpecifics(sync_pb::AppSpecifics* specifics) const {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(specifics);
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Only sync the ordinal values and launch type if they are valid.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (app_launch_ordinal_.IsValid())
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    specifics->set_app_launch_ordinal(app_launch_ordinal_.ToInternalValue());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_ordinal_.IsValid())
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    specifics->set_page_ordinal(page_ordinal_.ToInternalValue());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_pb::AppSpecifics::LaunchType sync_launch_type =
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      static_cast<sync_pb::AppSpecifics::LaunchType>(launch_type_);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The corresponding validation of this value during processing of an
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // AppSyncData is in ExtensionSyncService::ProcessAppSyncData.
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (launch_type_ >= LAUNCH_TYPE_FIRST && launch_type_ < NUM_LAUNCH_TYPES &&
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      sync_pb::AppSpecifics_LaunchType_IsValid(sync_launch_type)) {
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    specifics->set_launch_type(sync_launch_type);
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!bookmark_app_url_.empty())
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    specifics->set_bookmark_app_url(bookmark_app_url_);
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!bookmark_app_description_.empty())
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    specifics->set_bookmark_app_description(bookmark_app_description_);
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_sync_data_.PopulateExtensionSpecifics(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      specifics->mutable_extension());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppSyncData::PopulateFromAppSpecifics(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const sync_pb::AppSpecifics& specifics) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_sync_data_.PopulateFromExtensionSpecifics(specifics.extension());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_launch_ordinal_ = syncer::StringOrdinal(specifics.app_launch_ordinal());
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  page_ordinal_ = syncer::StringOrdinal(specifics.page_ordinal());
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  launch_type_ = specifics.has_launch_type()
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ? static_cast<extensions::LaunchType>(specifics.launch_type())
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : LAUNCH_TYPE_INVALID;
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bookmark_app_url_ = specifics.bookmark_app_url();
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bookmark_app_description_ = specifics.bookmark_app_description();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppSyncData::PopulateFromSyncData(const syncer::SyncData& sync_data) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PopulateFromAppSpecifics(sync_data.GetSpecifics().app());
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
111