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

Side by Side Diff: chrome/browser/extensions/extension_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/extension_sync_data.h" 5 #include "chrome/browser/extensions/extension_sync_data.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "chrome/browser/extensions/app_sync_data.h" 9 #include "chrome/browser/extensions/app_sync_data.h"
10 #include "chrome/browser/extensions/extension_service.h" 10 #include "chrome/browser/extensions/extension_service.h"
(...skipping 20 matching lines...) Expand all
31 31
32 ExtensionSyncData::ExtensionSyncData() 32 ExtensionSyncData::ExtensionSyncData()
33 : uninstalled_(false), 33 : uninstalled_(false),
34 enabled_(false), 34 enabled_(false),
35 incognito_enabled_(false), 35 incognito_enabled_(false),
36 remote_install_(false), 36 remote_install_(false),
37 all_urls_enabled_(BOOLEAN_UNSET), 37 all_urls_enabled_(BOOLEAN_UNSET),
38 installed_by_custodian_(false) { 38 installed_by_custodian_(false) {
39 } 39 }
40 40
41 ExtensionSyncData::ExtensionSyncData(const syncer::SyncData& sync_data)
42 : uninstalled_(false),
43 enabled_(false),
44 incognito_enabled_(false),
45 remote_install_(false),
46 all_urls_enabled_(BOOLEAN_UNSET),
47 installed_by_custodian_(false) {
48 PopulateFromSyncData(sync_data);
49 }
50
51 ExtensionSyncData::ExtensionSyncData(const syncer::SyncChange& sync_change)
52 : uninstalled_(sync_change.change_type() ==
53 syncer::SyncChange::ACTION_DELETE),
54 enabled_(false),
55 incognito_enabled_(false),
56 remote_install_(false),
57 all_urls_enabled_(BOOLEAN_UNSET),
58 installed_by_custodian_(false) {
59 PopulateFromSyncData(sync_change.sync_data());
60 }
61
62 ExtensionSyncData::ExtensionSyncData(const Extension& extension, 41 ExtensionSyncData::ExtensionSyncData(const Extension& extension,
63 bool enabled, 42 bool enabled,
64 bool incognito_enabled, 43 bool incognito_enabled,
65 bool remote_install, 44 bool remote_install,
66 OptionalBoolean all_urls_enabled) 45 OptionalBoolean all_urls_enabled)
67 : id_(extension.id()), 46 : id_(extension.id()),
68 uninstalled_(false), 47 uninstalled_(false),
69 enabled_(enabled), 48 enabled_(enabled),
70 incognito_enabled_(incognito_enabled), 49 incognito_enabled_(incognito_enabled),
71 remote_install_(remote_install), 50 remote_install_(remote_install),
72 all_urls_enabled_(all_urls_enabled), 51 all_urls_enabled_(all_urls_enabled),
73 installed_by_custodian_(extension.was_installed_by_custodian()), 52 installed_by_custodian_(extension.was_installed_by_custodian()),
74 version_(extension.from_bookmark() ? base::Version("0") 53 version_(extension.from_bookmark() ? base::Version("0")
75 : *extension.version()), 54 : *extension.version()),
76 update_url_(ManifestURL::GetUpdateURL(&extension)), 55 update_url_(ManifestURL::GetUpdateURL(&extension)),
77 name_(extension.non_localized_name()) { 56 name_(extension.non_localized_name()) {
78 } 57 }
79 58
80 ExtensionSyncData::~ExtensionSyncData() {} 59 ExtensionSyncData::~ExtensionSyncData() {}
81 60
61 // static
62 scoped_ptr<ExtensionSyncData> ExtensionSyncData::CreateFromSyncData(
63 const syncer::SyncData& sync_data) {
64 scoped_ptr<ExtensionSyncData> data(new ExtensionSyncData);
65 if (data->PopulateFromSyncData(sync_data))
66 return data.Pass();
67 return NULL;
68 }
69
70 // static
71 scoped_ptr<ExtensionSyncData> ExtensionSyncData::CreateFromSyncChange(
72 const syncer::SyncChange& sync_change) {
73 scoped_ptr<ExtensionSyncData> data(
74 CreateFromSyncData(sync_change.sync_data()));
75 if (!data.get())
76 return NULL;
77
78 data->set_uninstalled(sync_change.change_type() ==
79 syncer::SyncChange::ACTION_DELETE);
80 return data.Pass();
81 }
82
82 syncer::SyncData ExtensionSyncData::GetSyncData() const { 83 syncer::SyncData ExtensionSyncData::GetSyncData() const {
83 sync_pb::EntitySpecifics specifics; 84 sync_pb::EntitySpecifics specifics;
84 PopulateExtensionSpecifics(specifics.mutable_extension()); 85 PopulateExtensionSpecifics(specifics.mutable_extension());
85 86
86 return syncer::SyncData::CreateLocalData(id_, name_, specifics); 87 return syncer::SyncData::CreateLocalData(id_, name_, specifics);
87 } 88 }
88 89
89 syncer::SyncChange ExtensionSyncData::GetSyncChange( 90 syncer::SyncChange ExtensionSyncData::GetSyncChange(
90 syncer::SyncChange::SyncChangeType change_type) const { 91 syncer::SyncChange::SyncChangeType change_type) const {
91 return syncer::SyncChange(FROM_HERE, change_type, GetSyncData()); 92 return syncer::SyncChange(FROM_HERE, change_type, GetSyncData());
92 } 93 }
93 94
94 void ExtensionSyncData::PopulateExtensionSpecifics( 95 void ExtensionSyncData::PopulateExtensionSpecifics(
95 sync_pb::ExtensionSpecifics* specifics) const { 96 sync_pb::ExtensionSpecifics* specifics) const {
96 DCHECK(crx_file::id_util::IdIsValid(id_)); 97 DCHECK(crx_file::id_util::IdIsValid(id_));
97 specifics->set_id(id_); 98 specifics->set_id(id_);
98 specifics->set_update_url(update_url_.spec()); 99 specifics->set_update_url(update_url_.spec());
99 specifics->set_version(version_.GetString()); 100 specifics->set_version(version_.GetString());
100 specifics->set_enabled(enabled_); 101 specifics->set_enabled(enabled_);
101 specifics->set_incognito_enabled(incognito_enabled_); 102 specifics->set_incognito_enabled(incognito_enabled_);
102 specifics->set_remote_install(remote_install_); 103 specifics->set_remote_install(remote_install_);
103 if (all_urls_enabled_ != BOOLEAN_UNSET) 104 if (all_urls_enabled_ != BOOLEAN_UNSET)
104 specifics->set_all_urls_enabled(all_urls_enabled_ == BOOLEAN_TRUE); 105 specifics->set_all_urls_enabled(all_urls_enabled_ == BOOLEAN_TRUE);
105 specifics->set_installed_by_custodian(installed_by_custodian_); 106 specifics->set_installed_by_custodian(installed_by_custodian_);
106 specifics->set_name(name_); 107 specifics->set_name(name_);
107 } 108 }
108 109
109 void ExtensionSyncData::PopulateFromExtensionSpecifics( 110 bool ExtensionSyncData::PopulateFromExtensionSpecifics(
110 const sync_pb::ExtensionSpecifics& specifics) { 111 const sync_pb::ExtensionSpecifics& specifics) {
111 if (!crx_file::id_util::IdIsValid(specifics.id())) { 112 if (!crx_file::id_util::IdIsValid(specifics.id())) {
112 LOG(FATAL) << "Attempt to sync bad ExtensionSpecifics (bad ID):\n" 113 LOG(ERROR) << "Attempt to sync bad ExtensionSpecifics (bad ID):\n"
not at google - send to devlin 2015/03/11 23:21:34 Can we track this in UMA, with an enum for why (ba
Yoyo Zhou 2015/03/12 00:25:48 Done.
113 << GetExtensionSpecificsLogMessage(specifics); 114 << GetExtensionSpecificsLogMessage(specifics);
115 return false;
114 } 116 }
115 117
116 Version specifics_version(specifics.version()); 118 Version specifics_version(specifics.version());
117 if (!specifics_version.IsValid()) { 119 if (!specifics_version.IsValid()) {
118 LOG(FATAL) << "Attempt to sync bad ExtensionSpecifics (bad version):\n" 120 LOG(ERROR) << "Attempt to sync bad ExtensionSpecifics (bad version):\n"
119 << GetExtensionSpecificsLogMessage(specifics); 121 << GetExtensionSpecificsLogMessage(specifics);
122 return false;
120 } 123 }
121 124
122 // The update URL must be either empty or valid. 125 // The update URL must be either empty or valid.
123 GURL specifics_update_url(specifics.update_url()); 126 GURL specifics_update_url(specifics.update_url());
124 if (!specifics_update_url.is_empty() && !specifics_update_url.is_valid()) { 127 if (!specifics_update_url.is_empty() && !specifics_update_url.is_valid()) {
125 LOG(FATAL) << "Attempt to sync bad ExtensionSpecifics (bad update URL):\n" 128 LOG(ERROR) << "Attempt to sync bad ExtensionSpecifics (bad update URL):\n"
126 << GetExtensionSpecificsLogMessage(specifics); 129 << GetExtensionSpecificsLogMessage(specifics);
130 return false;
127 } 131 }
128 132
129 id_ = specifics.id(); 133 id_ = specifics.id();
130 update_url_ = specifics_update_url; 134 update_url_ = specifics_update_url;
131 version_ = specifics_version; 135 version_ = specifics_version;
132 enabled_ = specifics.enabled(); 136 enabled_ = specifics.enabled();
133 incognito_enabled_ = specifics.incognito_enabled(); 137 incognito_enabled_ = specifics.incognito_enabled();
134 if (specifics.has_all_urls_enabled()) { 138 if (specifics.has_all_urls_enabled()) {
135 all_urls_enabled_ = 139 all_urls_enabled_ =
136 specifics.all_urls_enabled() ? BOOLEAN_TRUE : BOOLEAN_FALSE; 140 specifics.all_urls_enabled() ? BOOLEAN_TRUE : BOOLEAN_FALSE;
137 } else { 141 } else {
138 // Set this explicitly (even though it's the default) on the offchance 142 // Set this explicitly (even though it's the default) on the offchance
139 // that someone is re-using an ExtensionSyncData object. 143 // that someone is re-using an ExtensionSyncData object.
140 all_urls_enabled_ = BOOLEAN_UNSET; 144 all_urls_enabled_ = BOOLEAN_UNSET;
141 } 145 }
142 remote_install_ = specifics.remote_install(); 146 remote_install_ = specifics.remote_install();
143 installed_by_custodian_ = specifics.installed_by_custodian(); 147 installed_by_custodian_ = specifics.installed_by_custodian();
144 name_ = specifics.name(); 148 name_ = specifics.name();
149 return true;
145 } 150 }
146 151
147 void ExtensionSyncData::set_uninstalled(bool uninstalled) { 152 void ExtensionSyncData::set_uninstalled(bool uninstalled) {
148 uninstalled_ = uninstalled; 153 uninstalled_ = uninstalled;
149 } 154 }
150 155
151 void ExtensionSyncData::PopulateFromSyncData( 156 bool ExtensionSyncData::PopulateFromSyncData(
152 const syncer::SyncData& sync_data) { 157 const syncer::SyncData& sync_data) {
153 const sync_pb::EntitySpecifics& entity_specifics = sync_data.GetSpecifics(); 158 const sync_pb::EntitySpecifics& entity_specifics = sync_data.GetSpecifics();
154 159
155 if (entity_specifics.has_extension()) { 160 if (entity_specifics.has_extension()) {
156 PopulateFromExtensionSpecifics(entity_specifics.extension()); 161 return PopulateFromExtensionSpecifics(entity_specifics.extension());
157 } else { 162 } else {
not at google - send to devlin 2015/03/11 23:21:34 no else after return
Yoyo Zhou 2015/03/12 00:25:48 Done.
158 LOG(FATAL) << "Attempt to sync bad EntitySpecifics."; 163 LOG(ERROR) << "Attempt to sync bad EntitySpecifics: no extension data.";
164 return false;
159 } 165 }
160 } 166 }
161 167
162 } // namespace extensions 168 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698