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

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

Issue 1254363004: Move ownership of AppSorting from ExtensionPrefs to ExtensionSystem (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add missing include Created 5 years, 4 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_service.h" 5 #include "chrome/browser/extensions/extension_sync_service.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "base/threading/thread_restrictions.h" 9 #include "base/threading/thread_restrictions.h"
10 #include "chrome/browser/extensions/bookmark_app_helper.h" 10 #include "chrome/browser/extensions/bookmark_app_helper.h"
11 #include "chrome/browser/extensions/extension_service.h" 11 #include "chrome/browser/extensions/extension_service.h"
12 #include "chrome/browser/extensions/extension_sync_data.h" 12 #include "chrome/browser/extensions/extension_sync_data.h"
13 #include "chrome/browser/extensions/extension_sync_service_factory.h" 13 #include "chrome/browser/extensions/extension_sync_service_factory.h"
14 #include "chrome/browser/extensions/extension_util.h" 14 #include "chrome/browser/extensions/extension_util.h"
15 #include "chrome/browser/extensions/launch_util.h" 15 #include "chrome/browser/extensions/launch_util.h"
16 #include "chrome/browser/profiles/profile.h" 16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/browser/sync/glue/sync_start_util.h" 17 #include "chrome/browser/sync/glue/sync_start_util.h"
18 #include "chrome/common/extensions/extension_constants.h" 18 #include "chrome/common/extensions/extension_constants.h"
19 #include "chrome/common/extensions/sync_helper.h" 19 #include "chrome/common/extensions/sync_helper.h"
20 #include "chrome/common/web_application_info.h" 20 #include "chrome/common/web_application_info.h"
21 #include "components/sync_driver/sync_prefs.h" 21 #include "components/sync_driver/sync_prefs.h"
22 #include "extensions/browser/app_sorting.h" 22 #include "extensions/browser/app_sorting.h"
23 #include "extensions/browser/extension_prefs.h" 23 #include "extensions/browser/extension_prefs.h"
24 #include "extensions/browser/extension_registry.h" 24 #include "extensions/browser/extension_registry.h"
25 #include "extensions/browser/extension_system.h"
25 #include "extensions/browser/extension_util.h" 26 #include "extensions/browser/extension_util.h"
26 #include "extensions/browser/uninstall_reason.h" 27 #include "extensions/browser/uninstall_reason.h"
27 #include "extensions/common/extension.h" 28 #include "extensions/common/extension.h"
28 #include "extensions/common/extension_set.h" 29 #include "extensions/common/extension_set.h"
29 #include "extensions/common/image_util.h" 30 #include "extensions/common/image_util.h"
30 #include "sync/api/sync_change.h" 31 #include "sync/api/sync_change.h"
31 #include "sync/api/sync_error_factory.h" 32 #include "sync/api/sync_error_factory.h"
32 33
34 using extensions::AppSorting;
33 using extensions::Extension; 35 using extensions::Extension;
34 using extensions::ExtensionPrefs; 36 using extensions::ExtensionPrefs;
35 using extensions::ExtensionRegistry; 37 using extensions::ExtensionRegistry;
36 using extensions::ExtensionSet; 38 using extensions::ExtensionSet;
37 using extensions::ExtensionSyncData; 39 using extensions::ExtensionSyncData;
40 using extensions::ExtensionSystem;
38 using extensions::SyncBundle; 41 using extensions::SyncBundle;
39 42
40 namespace { 43 namespace {
41 44
42 void OnWebApplicationInfoLoaded( 45 void OnWebApplicationInfoLoaded(
43 WebApplicationInfo synced_info, 46 WebApplicationInfo synced_info,
44 base::WeakPtr<ExtensionService> extension_service, 47 base::WeakPtr<ExtensionService> extension_service,
45 const WebApplicationInfo& loaded_info) { 48 const WebApplicationInfo& loaded_info) {
46 DCHECK_EQ(synced_info.app_url, loaded_info.app_url); 49 DCHECK_EQ(synced_info.app_url, loaded_info.app_url);
47 50
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 104
102 ExtensionSyncService::~ExtensionSyncService() {} 105 ExtensionSyncService::~ExtensionSyncService() {}
103 106
104 // static 107 // static
105 ExtensionSyncService* ExtensionSyncService::Get( 108 ExtensionSyncService* ExtensionSyncService::Get(
106 content::BrowserContext* context) { 109 content::BrowserContext* context) {
107 return ExtensionSyncServiceFactory::GetForBrowserContext(context); 110 return ExtensionSyncServiceFactory::GetForBrowserContext(context);
108 } 111 }
109 112
110 void ExtensionSyncService::SyncUninstallExtension( 113 void ExtensionSyncService::SyncUninstallExtension(
111 const extensions::Extension& extension) { 114 const Extension& extension) {
112 if (!extensions::util::ShouldSync(&extension, profile_)) 115 if (!extensions::util::ShouldSync(&extension, profile_))
113 return; 116 return;
114 117
115 // TODO(tim): If we get here and IsSyncing is false, this will cause 118 // TODO(tim): If we get here and IsSyncing is false, this will cause
116 // "back from the dead" style bugs, because sync will add-back the extension 119 // "back from the dead" style bugs, because sync will add-back the extension
117 // that was uninstalled here when MergeDataAndStartSyncing is called. 120 // that was uninstalled here when MergeDataAndStartSyncing is called.
118 // See crbug.com/256795. 121 // See crbug.com/256795.
119 syncer::ModelType type = 122 syncer::ModelType type =
120 extension.is_app() ? syncer::APPS : syncer::EXTENSIONS; 123 extension.is_app() ? syncer::APPS : syncer::EXTENSIONS;
121 SyncBundle* bundle = GetSyncBundle(type); 124 SyncBundle* bundle = GetSyncBundle(type);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 // Now push those local changes to sync. 177 // Now push those local changes to sync.
175 // TODO(treib,kalman): We should only have to send out changes for extensions 178 // TODO(treib,kalman): We should only have to send out changes for extensions
176 // which have NeedsSync set (i.e. |GetLocalSyncDataList(type, false)|). That 179 // which have NeedsSync set (i.e. |GetLocalSyncDataList(type, false)|). That
177 // makes some sync_integration_tests fail though - figure out why and fix it! 180 // makes some sync_integration_tests fail though - figure out why and fix it!
178 std::vector<ExtensionSyncData> data_list = GetLocalSyncDataList(type, true); 181 std::vector<ExtensionSyncData> data_list = GetLocalSyncDataList(type, true);
179 bundle->PushSyncDataList(ToSyncerSyncDataList(data_list)); 182 bundle->PushSyncDataList(ToSyncerSyncDataList(data_list));
180 for (const ExtensionSyncData& data : data_list) 183 for (const ExtensionSyncData& data : data_list)
181 ExtensionPrefs::Get(profile_)->SetNeedsSync(data.id(), false); 184 ExtensionPrefs::Get(profile_)->SetNeedsSync(data.id(), false);
182 185
183 if (type == syncer::APPS) 186 if (type == syncer::APPS)
184 extension_prefs_->app_sorting()->FixNTPOrdinalCollisions(); 187 ExtensionSystem::Get(profile_)->app_sorting()->FixNTPOrdinalCollisions();
185 188
186 return syncer::SyncMergeResult(type); 189 return syncer::SyncMergeResult(type);
187 } 190 }
188 191
189 void ExtensionSyncService::StopSyncing(syncer::ModelType type) { 192 void ExtensionSyncService::StopSyncing(syncer::ModelType type) {
190 GetSyncBundle(type)->Reset(); 193 GetSyncBundle(type)->Reset();
191 } 194 }
192 195
193 syncer::SyncDataList ExtensionSyncService::GetAllSyncData( 196 syncer::SyncDataList ExtensionSyncService::GetAllSyncData(
194 syncer::ModelType type) const { 197 syncer::ModelType type) const {
195 const SyncBundle* bundle = GetSyncBundle(type); 198 const SyncBundle* bundle = GetSyncBundle(type);
196 if (!bundle->IsSyncing()) 199 if (!bundle->IsSyncing())
197 return syncer::SyncDataList(); 200 return syncer::SyncDataList();
198 201
199 std::vector<extensions::ExtensionSyncData> sync_data_list = 202 std::vector<ExtensionSyncData> sync_data_list =
200 GetLocalSyncDataList(type, true); 203 GetLocalSyncDataList(type, true);
201 204
202 // Add pending data (where the local extension is either not installed yet or 205 // Add pending data (where the local extension is either not installed yet or
203 // outdated). 206 // outdated).
204 std::vector<ExtensionSyncData> pending_extensions = bundle->GetPendingData(); 207 std::vector<ExtensionSyncData> pending_extensions = bundle->GetPendingData();
205 sync_data_list.insert(sync_data_list.begin(), 208 sync_data_list.insert(sync_data_list.begin(),
206 pending_extensions.begin(), 209 pending_extensions.begin(),
207 pending_extensions.end()); 210 pending_extensions.end());
208 211
209 return ToSyncerSyncDataList(sync_data_list); 212 return ToSyncerSyncDataList(sync_data_list);
210 } 213 }
211 214
212 syncer::SyncError ExtensionSyncService::ProcessSyncChanges( 215 syncer::SyncError ExtensionSyncService::ProcessSyncChanges(
213 const tracked_objects::Location& from_here, 216 const tracked_objects::Location& from_here,
214 const syncer::SyncChangeList& change_list) { 217 const syncer::SyncChangeList& change_list) {
215 for (const syncer::SyncChange& sync_change : change_list) { 218 for (const syncer::SyncChange& sync_change : change_list) {
216 scoped_ptr<ExtensionSyncData> extension_sync_data( 219 scoped_ptr<ExtensionSyncData> extension_sync_data(
217 ExtensionSyncData::CreateFromSyncChange(sync_change)); 220 ExtensionSyncData::CreateFromSyncChange(sync_change));
218 if (extension_sync_data) 221 if (extension_sync_data)
219 ApplySyncData(*extension_sync_data); 222 ApplySyncData(*extension_sync_data);
220 } 223 }
221 224
222 extension_prefs_->app_sorting()->FixNTPOrdinalCollisions(); 225 ExtensionSystem::Get(profile_)->app_sorting()->FixNTPOrdinalCollisions();
223 226
224 return syncer::SyncError(); 227 return syncer::SyncError();
225 } 228 }
226 229
227 ExtensionSyncData ExtensionSyncService::CreateSyncData( 230 ExtensionSyncData ExtensionSyncService::CreateSyncData(
228 const extensions::Extension& extension) const { 231 const Extension& extension) const {
229 bool enabled = extension_service_->IsExtensionEnabled(extension.id()); 232 bool enabled = extension_service_->IsExtensionEnabled(extension.id());
230 int disable_reasons = extension_prefs_->GetDisableReasons(extension.id()); 233 int disable_reasons = extension_prefs_->GetDisableReasons(extension.id());
231 bool incognito_enabled = extensions::util::IsIncognitoEnabled(extension.id(), 234 bool incognito_enabled = extensions::util::IsIncognitoEnabled(extension.id(),
232 profile_); 235 profile_);
233 bool remote_install = 236 bool remote_install =
234 extension_prefs_->HasDisableReason(extension.id(), 237 extension_prefs_->HasDisableReason(extension.id(),
235 Extension::DISABLE_REMOTE_INSTALL); 238 Extension::DISABLE_REMOTE_INSTALL);
236 ExtensionSyncData::OptionalBoolean allowed_on_all_url = 239 ExtensionSyncData::OptionalBoolean allowed_on_all_url =
237 GetAllowedOnAllUrlsOptionalBoolean(extension.id(), profile_); 240 GetAllowedOnAllUrlsOptionalBoolean(extension.id(), profile_);
238 if (extension.is_app()) { 241 if (extension.is_app()) {
242 AppSorting* app_sorting = ExtensionSystem::Get(profile_)->app_sorting();
239 return ExtensionSyncData( 243 return ExtensionSyncData(
240 extension, enabled, disable_reasons, incognito_enabled, remote_install, 244 extension, enabled, disable_reasons, incognito_enabled, remote_install,
241 allowed_on_all_url, 245 allowed_on_all_url,
242 extension_prefs_->app_sorting()->GetAppLaunchOrdinal(extension.id()), 246 app_sorting->GetAppLaunchOrdinal(extension.id()),
243 extension_prefs_->app_sorting()->GetPageOrdinal(extension.id()), 247 app_sorting->GetPageOrdinal(extension.id()),
244 extensions::GetLaunchTypePrefValue(extension_prefs_, extension.id())); 248 extensions::GetLaunchTypePrefValue(extension_prefs_, extension.id()));
245 } 249 }
246 return ExtensionSyncData( 250 return ExtensionSyncData(
247 extension, enabled, disable_reasons, incognito_enabled, remote_install, 251 extension, enabled, disable_reasons, incognito_enabled, remote_install,
248 allowed_on_all_url); 252 allowed_on_all_url);
249 } 253 }
250 254
251 bool ExtensionSyncService::ApplySyncData( 255 bool ExtensionSyncService::ApplySyncData(
252 const ExtensionSyncData& extension_sync_data) { 256 const ExtensionSyncData& extension_sync_data) {
253 syncer::ModelType type = extension_sync_data.is_app() ? syncer::APPS 257 syncer::ModelType type = extension_sync_data.is_app() ? syncer::APPS
254 : syncer::EXTENSIONS; 258 : syncer::EXTENSIONS;
255 SyncBundle* bundle = GetSyncBundle(type); 259 SyncBundle* bundle = GetSyncBundle(type);
256 bundle->ApplySyncData(extension_sync_data); 260 bundle->ApplySyncData(extension_sync_data);
257 261
258 const std::string& id = extension_sync_data.id(); 262 const std::string& id = extension_sync_data.id();
259 263
260 if (extension_sync_data.is_app()) { 264 if (extension_sync_data.is_app()) {
261 if (extension_sync_data.app_launch_ordinal().IsValid() && 265 if (extension_sync_data.app_launch_ordinal().IsValid() &&
262 extension_sync_data.page_ordinal().IsValid()) { 266 extension_sync_data.page_ordinal().IsValid()) {
263 extension_prefs_->app_sorting()->SetAppLaunchOrdinal( 267 AppSorting* app_sorting = ExtensionSystem::Get(profile_)->app_sorting();
268 app_sorting->SetAppLaunchOrdinal(
264 id, 269 id,
265 extension_sync_data.app_launch_ordinal()); 270 extension_sync_data.app_launch_ordinal());
266 extension_prefs_->app_sorting()->SetPageOrdinal( 271 app_sorting->SetPageOrdinal(id, extension_sync_data.page_ordinal());
267 id,
268 extension_sync_data.page_ordinal());
269 } 272 }
270 273
271 // The corresponding validation of this value during ExtensionSyncData 274 // The corresponding validation of this value during ExtensionSyncData
272 // population is in ExtensionSyncData::ToAppSpecifics. 275 // population is in ExtensionSyncData::ToAppSpecifics.
273 if (extension_sync_data.launch_type() >= extensions::LAUNCH_TYPE_FIRST && 276 if (extension_sync_data.launch_type() >= extensions::LAUNCH_TYPE_FIRST &&
274 extension_sync_data.launch_type() < extensions::NUM_LAUNCH_TYPES) { 277 extension_sync_data.launch_type() < extensions::NUM_LAUNCH_TYPES) {
275 extensions::SetLaunchType( 278 extensions::SetLaunchType(
276 profile_, id, extension_sync_data.launch_type()); 279 profile_, id, extension_sync_data.launch_type());
277 } 280 }
278 281
279 if (!extension_sync_data.bookmark_app_url().empty()) 282 if (!extension_sync_data.bookmark_app_url().empty())
280 ApplyBookmarkAppSyncData(extension_sync_data); 283 ApplyBookmarkAppSyncData(extension_sync_data);
281 } 284 }
282 285
283 if (!ApplyExtensionSyncDataHelper(extension_sync_data, type)) { 286 if (!ApplyExtensionSyncDataHelper(extension_sync_data, type)) {
284 bundle->AddPendingExtension(id, extension_sync_data); 287 bundle->AddPendingExtension(id, extension_sync_data);
285 extension_service_->CheckForUpdatesSoon(); 288 extension_service_->CheckForUpdatesSoon();
286 return false; 289 return false;
287 } 290 }
288 291
289 return true; 292 return true;
290 } 293 }
291 294
292 void ExtensionSyncService::ApplyBookmarkAppSyncData( 295 void ExtensionSyncService::ApplyBookmarkAppSyncData(
293 const extensions::ExtensionSyncData& extension_sync_data) { 296 const ExtensionSyncData& extension_sync_data) {
294 DCHECK(extension_sync_data.is_app()); 297 DCHECK(extension_sync_data.is_app());
295 298
296 // Process bookmark app sync if necessary. 299 // Process bookmark app sync if necessary.
297 GURL bookmark_app_url(extension_sync_data.bookmark_app_url()); 300 GURL bookmark_app_url(extension_sync_data.bookmark_app_url());
298 if (!bookmark_app_url.is_valid() || 301 if (!bookmark_app_url.is_valid() ||
299 extension_sync_data.uninstalled()) { 302 extension_sync_data.uninstalled()) {
300 return; 303 return;
301 } 304 }
302 305
303 const Extension* extension = 306 const Extension* extension =
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 // non-INTERNAL location. Add to pending_sync_data, even though it will 513 // non-INTERNAL location. Add to pending_sync_data, even though it will
511 // never be removed (we'll never install a syncable version of the 514 // never be removed (we'll never install a syncable version of the
512 // extension), so that GetAllSyncData() continues to send it. 515 // extension), so that GetAllSyncData() continues to send it.
513 } 516 }
514 // Track pending extensions so that we can return them in GetAllSyncData(). 517 // Track pending extensions so that we can return them in GetAllSyncData().
515 return false; 518 return false;
516 } 519 }
517 520
518 return true; 521 return true;
519 } 522 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_service.cc ('k') | chrome/browser/extensions/extension_system_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698