Home | History | Annotate | Download | only in extensions
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/extensions/app_sync_data.h"
      6 
      7 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
      8 #include "extensions/common/extension.h"
      9 #include "sync/api/sync_data.h"
     10 #include "sync/protocol/app_specifics.pb.h"
     11 #include "sync/protocol/sync.pb.h"
     12 
     13 namespace extensions {
     14 
     15 AppSyncData::AppSyncData() {}
     16 
     17 AppSyncData::AppSyncData(const syncer::SyncData& sync_data) {
     18   PopulateFromSyncData(sync_data);
     19 }
     20 
     21 AppSyncData::AppSyncData(const syncer::SyncChange& sync_change) {
     22   PopulateFromSyncData(sync_change.sync_data());
     23   extension_sync_data_.set_uninstalled(
     24       sync_change.change_type() == syncer::SyncChange::ACTION_DELETE);
     25 }
     26 
     27 AppSyncData::AppSyncData(const Extension& extension,
     28                          bool enabled,
     29                          bool incognito_enabled,
     30                          bool remote_install,
     31                          const syncer::StringOrdinal& app_launch_ordinal,
     32                          const syncer::StringOrdinal& page_ordinal,
     33                          extensions::LaunchType launch_type)
     34     : extension_sync_data_(extension,
     35                            enabled,
     36                            incognito_enabled,
     37                            remote_install),
     38       app_launch_ordinal_(app_launch_ordinal),
     39       page_ordinal_(page_ordinal),
     40       launch_type_(launch_type) {
     41   if (extension.from_bookmark()) {
     42     bookmark_app_description_ = extension.description();
     43     bookmark_app_url_ = AppLaunchInfo::GetLaunchWebURL(&extension).spec();
     44   }
     45 }
     46 
     47 AppSyncData::~AppSyncData() {}
     48 
     49 syncer::SyncData AppSyncData::GetSyncData() const {
     50   sync_pb::EntitySpecifics specifics;
     51   PopulateAppSpecifics(specifics.mutable_app());
     52 
     53   return syncer::SyncData::CreateLocalData(extension_sync_data_.id(),
     54                                    extension_sync_data_.name(),
     55                                    specifics);
     56 }
     57 
     58 syncer::SyncChange AppSyncData::GetSyncChange(
     59     syncer::SyncChange::SyncChangeType change_type) const {
     60   return syncer::SyncChange(FROM_HERE, change_type, GetSyncData());
     61 }
     62 
     63 void AppSyncData::PopulateAppSpecifics(sync_pb::AppSpecifics* specifics) const {
     64   DCHECK(specifics);
     65   // Only sync the ordinal values and launch type if they are valid.
     66   if (app_launch_ordinal_.IsValid())
     67     specifics->set_app_launch_ordinal(app_launch_ordinal_.ToInternalValue());
     68   if (page_ordinal_.IsValid())
     69     specifics->set_page_ordinal(page_ordinal_.ToInternalValue());
     70 
     71   sync_pb::AppSpecifics::LaunchType sync_launch_type =
     72       static_cast<sync_pb::AppSpecifics::LaunchType>(launch_type_);
     73 
     74   // The corresponding validation of this value during processing of an
     75   // AppSyncData is in ExtensionSyncService::ProcessAppSyncData.
     76   if (launch_type_ >= LAUNCH_TYPE_FIRST && launch_type_ < NUM_LAUNCH_TYPES &&
     77       sync_pb::AppSpecifics_LaunchType_IsValid(sync_launch_type)) {
     78     specifics->set_launch_type(sync_launch_type);
     79   }
     80 
     81   if (!bookmark_app_url_.empty())
     82     specifics->set_bookmark_app_url(bookmark_app_url_);
     83 
     84   if (!bookmark_app_description_.empty())
     85     specifics->set_bookmark_app_description(bookmark_app_description_);
     86 
     87   extension_sync_data_.PopulateExtensionSpecifics(
     88       specifics->mutable_extension());
     89 }
     90 
     91 void AppSyncData::PopulateFromAppSpecifics(
     92     const sync_pb::AppSpecifics& specifics) {
     93   extension_sync_data_.PopulateFromExtensionSpecifics(specifics.extension());
     94 
     95   app_launch_ordinal_ = syncer::StringOrdinal(specifics.app_launch_ordinal());
     96   page_ordinal_ = syncer::StringOrdinal(specifics.page_ordinal());
     97 
     98   launch_type_ = specifics.has_launch_type()
     99       ? static_cast<extensions::LaunchType>(specifics.launch_type())
    100       : LAUNCH_TYPE_INVALID;
    101 
    102   bookmark_app_url_ = specifics.bookmark_app_url();
    103   bookmark_app_description_ = specifics.bookmark_app_description();
    104 }
    105 
    106 void AppSyncData::PopulateFromSyncData(const syncer::SyncData& sync_data) {
    107   PopulateFromAppSpecifics(sync_data.GetSpecifics().app());
    108 }
    109 
    110 }  // namespace extensions
    111