Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: chrome/browser/extensions/app_sync_data.cc

Issue 996213005: Don't crash when trying to create an ExtensionSyncData from invalid SyncData. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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/extensions/app_sync_data.h" 5 #include "chrome/browser/extensions/app_sync_data.h"
6 6
7 #include "chrome/common/extensions/manifest_handlers/app_icon_color_info.h" 7 #include "chrome/common/extensions/manifest_handlers/app_icon_color_info.h"
8 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" 8 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
9 #include "extensions/common/extension.h" 9 #include "extensions/common/extension.h"
10 #include "sync/api/sync_data.h" 10 #include "sync/api/sync_data.h"
11 #include "sync/protocol/app_specifics.pb.h" 11 #include "sync/protocol/app_specifics.pb.h"
12 #include "sync/protocol/sync.pb.h" 12 #include "sync/protocol/sync.pb.h"
13 13
14 namespace extensions { 14 namespace extensions {
15 15
16 AppSyncData::AppSyncData() {} 16 AppSyncData::AppSyncData() {}
17 17
18 AppSyncData::AppSyncData(const syncer::SyncData& sync_data) {
19 PopulateFromSyncData(sync_data);
20 }
21
22 AppSyncData::AppSyncData(const syncer::SyncChange& sync_change) {
23 PopulateFromSyncData(sync_change.sync_data());
24 extension_sync_data_.set_uninstalled(
25 sync_change.change_type() == syncer::SyncChange::ACTION_DELETE);
26 }
27
28 AppSyncData::AppSyncData(const Extension& extension, 18 AppSyncData::AppSyncData(const Extension& extension,
29 bool enabled, 19 bool enabled,
30 bool incognito_enabled, 20 bool incognito_enabled,
31 bool remote_install, 21 bool remote_install,
32 ExtensionSyncData::OptionalBoolean all_urls_enabled, 22 ExtensionSyncData::OptionalBoolean all_urls_enabled,
33 const syncer::StringOrdinal& app_launch_ordinal, 23 const syncer::StringOrdinal& app_launch_ordinal,
34 const syncer::StringOrdinal& page_ordinal, 24 const syncer::StringOrdinal& page_ordinal,
35 extensions::LaunchType launch_type) 25 extensions::LaunchType launch_type)
36 : extension_sync_data_(extension, 26 : extension_sync_data_(extension,
37 enabled, 27 enabled,
38 incognito_enabled, 28 incognito_enabled,
39 remote_install, 29 remote_install,
40 all_urls_enabled), 30 all_urls_enabled),
41 app_launch_ordinal_(app_launch_ordinal), 31 app_launch_ordinal_(app_launch_ordinal),
42 page_ordinal_(page_ordinal), 32 page_ordinal_(page_ordinal),
43 launch_type_(launch_type) { 33 launch_type_(launch_type) {
44 if (extension.from_bookmark()) { 34 if (extension.from_bookmark()) {
45 bookmark_app_description_ = extension.description(); 35 bookmark_app_description_ = extension.description();
46 bookmark_app_url_ = AppLaunchInfo::GetLaunchWebURL(&extension).spec(); 36 bookmark_app_url_ = AppLaunchInfo::GetLaunchWebURL(&extension).spec();
47 bookmark_app_icon_color_ = AppIconColorInfo::GetIconColorString(&extension); 37 bookmark_app_icon_color_ = AppIconColorInfo::GetIconColorString(&extension);
48 } 38 }
49 } 39 }
50 40
51 AppSyncData::~AppSyncData() {} 41 AppSyncData::~AppSyncData() {}
52 42
43 // static
44 scoped_ptr<AppSyncData> AppSyncData::CreateFromSyncData(
45 const syncer::SyncData& sync_data) {
46 scoped_ptr<AppSyncData> data(new AppSyncData);
47 if (data->PopulateFromSyncData(sync_data))
48 return data.Pass();
49 return NULL;
50 }
51
52 // static
53 scoped_ptr<AppSyncData> AppSyncData::CreateFromSyncChange(
54 const syncer::SyncChange& sync_change) {
55 scoped_ptr<AppSyncData> data(CreateFromSyncData(sync_change.sync_data()));
56 if (!data.get())
57 return NULL;
58
59 data->extension_sync_data_.set_uninstalled(sync_change.change_type() ==
60 syncer::SyncChange::ACTION_DELETE);
61 return data.Pass();
62 }
63
53 syncer::SyncData AppSyncData::GetSyncData() const { 64 syncer::SyncData AppSyncData::GetSyncData() const {
54 sync_pb::EntitySpecifics specifics; 65 sync_pb::EntitySpecifics specifics;
55 PopulateAppSpecifics(specifics.mutable_app()); 66 PopulateAppSpecifics(specifics.mutable_app());
56 67
57 return syncer::SyncData::CreateLocalData(extension_sync_data_.id(), 68 return syncer::SyncData::CreateLocalData(extension_sync_data_.id(),
58 extension_sync_data_.name(), 69 extension_sync_data_.name(),
59 specifics); 70 specifics);
60 } 71 }
61 72
62 syncer::SyncChange AppSyncData::GetSyncChange( 73 syncer::SyncChange AppSyncData::GetSyncChange(
(...skipping 25 matching lines...) Expand all
88 if (!bookmark_app_description_.empty()) 99 if (!bookmark_app_description_.empty())
89 specifics->set_bookmark_app_description(bookmark_app_description_); 100 specifics->set_bookmark_app_description(bookmark_app_description_);
90 101
91 if (!bookmark_app_icon_color_.empty()) 102 if (!bookmark_app_icon_color_.empty())
92 specifics->set_bookmark_app_icon_color(bookmark_app_icon_color_); 103 specifics->set_bookmark_app_icon_color(bookmark_app_icon_color_);
93 104
94 extension_sync_data_.PopulateExtensionSpecifics( 105 extension_sync_data_.PopulateExtensionSpecifics(
95 specifics->mutable_extension()); 106 specifics->mutable_extension());
96 } 107 }
97 108
98 void AppSyncData::PopulateFromAppSpecifics( 109 bool AppSyncData::PopulateFromAppSpecifics(
99 const sync_pb::AppSpecifics& specifics) { 110 const sync_pb::AppSpecifics& specifics) {
100 extension_sync_data_.PopulateFromExtensionSpecifics(specifics.extension()); 111 if (!extension_sync_data_.PopulateFromExtensionSpecifics(
112 specifics.extension()))
113 return false;
101 114
102 app_launch_ordinal_ = syncer::StringOrdinal(specifics.app_launch_ordinal()); 115 app_launch_ordinal_ = syncer::StringOrdinal(specifics.app_launch_ordinal());
103 page_ordinal_ = syncer::StringOrdinal(specifics.page_ordinal()); 116 page_ordinal_ = syncer::StringOrdinal(specifics.page_ordinal());
104 117
105 launch_type_ = specifics.has_launch_type() 118 launch_type_ = specifics.has_launch_type()
106 ? static_cast<extensions::LaunchType>(specifics.launch_type()) 119 ? static_cast<extensions::LaunchType>(specifics.launch_type())
107 : LAUNCH_TYPE_INVALID; 120 : LAUNCH_TYPE_INVALID;
108 121
109 bookmark_app_url_ = specifics.bookmark_app_url(); 122 bookmark_app_url_ = specifics.bookmark_app_url();
110 bookmark_app_description_ = specifics.bookmark_app_description(); 123 bookmark_app_description_ = specifics.bookmark_app_description();
111 bookmark_app_icon_color_ = specifics.bookmark_app_icon_color(); 124 bookmark_app_icon_color_ = specifics.bookmark_app_icon_color();
125 return true;
112 } 126 }
113 127
114 void AppSyncData::PopulateFromSyncData(const syncer::SyncData& sync_data) { 128 bool AppSyncData::PopulateFromSyncData(const syncer::SyncData& sync_data) {
115 PopulateFromAppSpecifics(sync_data.GetSpecifics().app()); 129 return PopulateFromAppSpecifics(sync_data.GetSpecifics().app());
116 } 130 }
117 131
118 } // namespace extensions 132 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698