OLD | NEW |
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_sorting.h" | 5 #include "chrome/browser/extensions/extension_sorting.h" |
6 | 6 |
7 #include "chrome/browser/extensions/extension_scoped_prefs.h" | 7 #include "chrome/browser/extensions/extension_scoped_prefs.h" |
8 #include "chrome/browser/extensions/extension_service.h" | 8 #include "chrome/browser/extensions/extension_service.h" |
9 #include "chrome/common/chrome_notification_types.h" | 9 #include "chrome/common/chrome_notification_types.h" |
10 #include "content/public/browser/notification_service.h" | 10 #include "content/public/browser/notification_service.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 extension_service_ = extension_service; | 40 extension_service_ = extension_service; |
41 } | 41 } |
42 | 42 |
43 void ExtensionSorting::Initialize( | 43 void ExtensionSorting::Initialize( |
44 const ExtensionPrefs::ExtensionIdSet& extension_ids) { | 44 const ExtensionPrefs::ExtensionIdSet& extension_ids) { |
45 InitializePageOrdinalMap(extension_ids); | 45 InitializePageOrdinalMap(extension_ids); |
46 | 46 |
47 MigrateAppIndex(extension_ids); | 47 MigrateAppIndex(extension_ids); |
48 } | 48 } |
49 | 49 |
| 50 void ExtensionSorting::CreateOrdinalsIfNecessary(size_t minimum_size) { |
| 51 // Create StringOrdinal values as required to ensure |ntp_ordinal_map_| has at |
| 52 // least |minimum_size| entries. |
| 53 if (ntp_ordinal_map_.empty() && minimum_size > 0) |
| 54 ntp_ordinal_map_[StringOrdinal::CreateInitialOrdinal()]; |
| 55 |
| 56 while (ntp_ordinal_map_.size() < minimum_size) { |
| 57 StringOrdinal filler = ntp_ordinal_map_.rbegin()->first.CreateAfter(); |
| 58 ntp_ordinal_map_[filler]; |
| 59 } |
| 60 } |
| 61 |
50 void ExtensionSorting::MigrateAppIndex( | 62 void ExtensionSorting::MigrateAppIndex( |
51 const ExtensionPrefs::ExtensionIdSet& extension_ids) { | 63 const ExtensionPrefs::ExtensionIdSet& extension_ids) { |
52 if (extension_ids.empty()) | 64 if (extension_ids.empty()) |
53 return; | 65 return; |
54 | 66 |
55 // Convert all the page index values to page ordinals. If there are any | 67 // Convert all the page index values to page ordinals. If there are any |
56 // app launch values that need to be migrated, inserted them into a sorted | 68 // app launch values that need to be migrated, inserted them into a sorted |
57 // set to be dealt with later. | 69 // set to be dealt with later. |
58 typedef std::map<StringOrdinal, std::map<int, const std::string*>, | 70 typedef std::map<StringOrdinal, std::map<int, const std::string*>, |
59 StringOrdinalLessThan> AppPositionToIdMapping; | 71 StringOrdinalLessThan> AppPositionToIdMapping; |
60 AppPositionToIdMapping app_launches_to_convert; | 72 AppPositionToIdMapping app_launches_to_convert; |
61 for (ExtensionPrefs::ExtensionIdSet::const_iterator ext_id = | 73 for (ExtensionPrefs::ExtensionIdSet::const_iterator ext_id = |
62 extension_ids.begin(); ext_id != extension_ids.end(); ++ext_id) { | 74 extension_ids.begin(); ext_id != extension_ids.end(); ++ext_id) { |
63 int old_page_index = 0; | 75 int old_page_index = 0; |
64 StringOrdinal page = GetPageOrdinal(*ext_id); | 76 StringOrdinal page = GetPageOrdinal(*ext_id); |
65 if (extension_scoped_prefs_->ReadExtensionPrefInteger( | 77 if (extension_scoped_prefs_->ReadExtensionPrefInteger( |
66 *ext_id, | 78 *ext_id, |
67 kPrefPageIndexDeprecated, | 79 kPrefPageIndexDeprecated, |
68 &old_page_index)) { | 80 &old_page_index)) { |
69 // Some extensions have invalid page index, so we don't | 81 // Some extensions have invalid page index, so we don't |
70 // attempt to convert them. | 82 // attempt to convert them. |
71 if (old_page_index < 0) { | 83 if (old_page_index < 0) { |
72 DLOG(WARNING) << "Extension " << *ext_id | 84 DLOG(WARNING) << "Extension " << *ext_id |
73 << " has an invalid page index " << old_page_index | 85 << " has an invalid page index " << old_page_index |
74 << ". Aborting attempt to convert its index."; | 86 << ". Aborting attempt to convert its index."; |
75 break; | 87 break; |
76 } | 88 } |
77 | 89 |
78 // Since we require all earlier StringOrdinals to already exist in order | 90 CreateOrdinalsIfNecessary(static_cast<size_t>(old_page_index) + 1); |
79 // to properly convert from integers and we are iterating though them in | |
80 // no given order, we create earlier StringOrdinal values as required. | |
81 // This should be filled in by the time we are done with this loop. | |
82 if (ntp_ordinal_map_.empty()) | |
83 ntp_ordinal_map_[StringOrdinal::CreateInitialOrdinal()]; | |
84 while (ntp_ordinal_map_.size() | |
85 <= static_cast<size_t>(old_page_index)) { | |
86 StringOrdinal earlier_page = | |
87 ntp_ordinal_map_.rbegin()->first.CreateAfter(); | |
88 ntp_ordinal_map_[earlier_page]; | |
89 } | |
90 | 91 |
91 page = PageIntegerAsStringOrdinal(old_page_index); | 92 page = PageIntegerAsStringOrdinal(old_page_index); |
92 SetPageOrdinal(*ext_id, page); | 93 SetPageOrdinal(*ext_id, page); |
93 extension_scoped_prefs_->UpdateExtensionPref( | 94 extension_scoped_prefs_->UpdateExtensionPref( |
94 *ext_id, kPrefPageIndexDeprecated, NULL); | 95 *ext_id, kPrefPageIndexDeprecated, NULL); |
95 } | 96 } |
96 | 97 |
97 int old_app_launch_index = 0; | 98 int old_app_launch_index = 0; |
98 if (extension_scoped_prefs_->ReadExtensionPrefInteger( | 99 if (extension_scoped_prefs_->ReadExtensionPrefInteger( |
99 *ext_id, | 100 *ext_id, |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 extension_scoped_prefs_->ReadExtensionPrefString( | 261 extension_scoped_prefs_->ReadExtensionPrefString( |
261 extension_id, kPrefAppLaunchOrdinal, &raw_value); | 262 extension_id, kPrefAppLaunchOrdinal, &raw_value); |
262 return StringOrdinal(raw_value); | 263 return StringOrdinal(raw_value); |
263 } | 264 } |
264 | 265 |
265 void ExtensionSorting::SetAppLaunchOrdinal( | 266 void ExtensionSorting::SetAppLaunchOrdinal( |
266 const std::string& extension_id, | 267 const std::string& extension_id, |
267 const StringOrdinal& new_app_launch_ordinal) { | 268 const StringOrdinal& new_app_launch_ordinal) { |
268 // No work is required if the old and new values are the same. | 269 // No work is required if the old and new values are the same. |
269 if (new_app_launch_ordinal.EqualOrBothInvalid( | 270 if (new_app_launch_ordinal.EqualOrBothInvalid( |
270 GetAppLaunchOrdinal(extension_id))) | 271 GetAppLaunchOrdinal(extension_id))) { |
271 return; | 272 return; |
| 273 } |
272 | 274 |
273 StringOrdinal page_ordinal = GetPageOrdinal(extension_id); | 275 StringOrdinal page_ordinal = GetPageOrdinal(extension_id); |
274 RemoveOrdinalMapping( | 276 RemoveOrdinalMapping( |
275 extension_id, page_ordinal, GetAppLaunchOrdinal(extension_id)); | 277 extension_id, page_ordinal, GetAppLaunchOrdinal(extension_id)); |
276 AddOrdinalMapping(extension_id, page_ordinal, new_app_launch_ordinal); | 278 AddOrdinalMapping(extension_id, page_ordinal, new_app_launch_ordinal); |
277 | 279 |
278 Value* new_value = new_app_launch_ordinal.IsValid() ? | 280 Value* new_value = new_app_launch_ordinal.IsValid() ? |
279 Value::CreateStringValue(new_app_launch_ordinal.ToString()) : | 281 Value::CreateStringValue(new_app_launch_ordinal.ToString()) : |
280 NULL; | 282 NULL; |
281 | 283 |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 int ExtensionSorting::PageStringOrdinalAsInteger( | 388 int ExtensionSorting::PageStringOrdinalAsInteger( |
387 const StringOrdinal& page_ordinal) const { | 389 const StringOrdinal& page_ordinal) const { |
388 if (!page_ordinal.IsValid()) | 390 if (!page_ordinal.IsValid()) |
389 return -1; | 391 return -1; |
390 | 392 |
391 PageOrdinalMap::const_iterator it = ntp_ordinal_map_.find(page_ordinal); | 393 PageOrdinalMap::const_iterator it = ntp_ordinal_map_.find(page_ordinal); |
392 return it != ntp_ordinal_map_.end() ? | 394 return it != ntp_ordinal_map_.end() ? |
393 std::distance(ntp_ordinal_map_.begin(), it) : -1; | 395 std::distance(ntp_ordinal_map_.begin(), it) : -1; |
394 } | 396 } |
395 | 397 |
396 StringOrdinal ExtensionSorting::PageIntegerAsStringOrdinal(size_t page_index) | 398 StringOrdinal ExtensionSorting::PageIntegerAsStringOrdinal(size_t page_index) { |
397 const { | |
398 // We shouldn't have a page_index that is more than 1 position away from the | |
399 // current end. | |
400 CHECK_LE(page_index, ntp_ordinal_map_.size()); | |
401 | |
402 const DictionaryValue* extensions = pref_service_->GetDictionary( | 399 const DictionaryValue* extensions = pref_service_->GetDictionary( |
403 ExtensionPrefs::kExtensionsPref); | 400 ExtensionPrefs::kExtensionsPref); |
| 401 |
404 if (!extensions) | 402 if (!extensions) |
405 return StringOrdinal(); | 403 return StringOrdinal(); |
406 | 404 |
407 if (page_index < ntp_ordinal_map_.size()) { | 405 if (page_index < ntp_ordinal_map_.size()) { |
408 PageOrdinalMap::const_iterator it = ntp_ordinal_map_.begin(); | 406 PageOrdinalMap::const_iterator it = ntp_ordinal_map_.begin(); |
409 std::advance(it, page_index); | 407 std::advance(it, page_index); |
| 408 return it->first; |
| 409 } |
410 | 410 |
411 return it->first; | 411 CreateOrdinalsIfNecessary(page_index + 1); |
412 | 412 return ntp_ordinal_map_.rbegin()->first; |
413 } else { | |
414 if (ntp_ordinal_map_.empty()) | |
415 return StringOrdinal::CreateInitialOrdinal(); | |
416 else | |
417 return ntp_ordinal_map_.rbegin()->first.CreateAfter(); | |
418 } | |
419 } | 413 } |
420 | 414 |
421 StringOrdinal ExtensionSorting::GetMinOrMaxAppLaunchOrdinalsOnPage( | 415 StringOrdinal ExtensionSorting::GetMinOrMaxAppLaunchOrdinalsOnPage( |
422 const StringOrdinal& target_page_ordinal, | 416 const StringOrdinal& target_page_ordinal, |
423 AppLaunchOrdinalReturn return_type) const { | 417 AppLaunchOrdinalReturn return_type) const { |
424 CHECK(target_page_ordinal.IsValid()); | 418 CHECK(target_page_ordinal.IsValid()); |
425 | 419 |
426 StringOrdinal return_value; | 420 StringOrdinal return_value; |
427 | 421 |
428 PageOrdinalMap::const_iterator page = | 422 PageOrdinalMap::const_iterator page = |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 if (ext) { | 501 if (ext) { |
508 // It is possible for old extension to have ordinal values, but they | 502 // It is possible for old extension to have ordinal values, but they |
509 // shouldn't so we clear them. | 503 // shouldn't so we clear them. |
510 if (!ext->is_app()) | 504 if (!ext->is_app()) |
511 ClearOrdinals(extension_id); | 505 ClearOrdinals(extension_id); |
512 | 506 |
513 extension_service_->SyncExtensionChangeIfNeeded(*ext); | 507 extension_service_->SyncExtensionChangeIfNeeded(*ext); |
514 } | 508 } |
515 } | 509 } |
516 } | 510 } |
OLD | NEW |