| 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 |