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 required_size) { | |
51 // Create StringOrdinal values as required to ensure |ntp_ordinal_map_| has at | |
52 // least |required_size| entries. | |
53 if (ntp_ordinal_map_.empty() && required_size > 0) | |
54 ntp_ordinal_map_[StringOrdinal::CreateInitialOrdinal()]; | |
55 | |
56 while (ntp_ordinal_map_.size() <= required_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)); |
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)) { | |
Dan Beam
2012/04/12 04:51:01
I think this might've been off by 1 (index is 0-ba
| |
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 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
386 int ExtensionSorting::PageStringOrdinalAsInteger( | 387 int ExtensionSorting::PageStringOrdinalAsInteger( |
387 const StringOrdinal& page_ordinal) const { | 388 const StringOrdinal& page_ordinal) const { |
388 if (!page_ordinal.IsValid()) | 389 if (!page_ordinal.IsValid()) |
389 return -1; | 390 return -1; |
390 | 391 |
391 PageOrdinalMap::const_iterator it = ntp_ordinal_map_.find(page_ordinal); | 392 PageOrdinalMap::const_iterator it = ntp_ordinal_map_.find(page_ordinal); |
392 return it != ntp_ordinal_map_.end() ? | 393 return it != ntp_ordinal_map_.end() ? |
393 std::distance(ntp_ordinal_map_.begin(), it) : -1; | 394 std::distance(ntp_ordinal_map_.begin(), it) : -1; |
394 } | 395 } |
395 | 396 |
396 StringOrdinal ExtensionSorting::PageIntegerAsStringOrdinal(size_t page_index) | 397 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( | 398 const DictionaryValue* extensions = pref_service_->GetDictionary( |
403 ExtensionPrefs::kExtensionsPref); | 399 ExtensionPrefs::kExtensionsPref); |
400 | |
404 if (!extensions) | 401 if (!extensions) |
405 return StringOrdinal(); | 402 return StringOrdinal(); |
406 | 403 |
407 if (page_index < ntp_ordinal_map_.size()) { | 404 if (page_index < ntp_ordinal_map_.size()) { |
408 PageOrdinalMap::const_iterator it = ntp_ordinal_map_.begin(); | 405 PageOrdinalMap::const_iterator it = ntp_ordinal_map_.begin(); |
409 std::advance(it, page_index); | 406 std::advance(it, page_index); |
407 return it->first; | |
408 } | |
410 | 409 |
411 return it->first; | 410 CreateOrdinalsIfNecessary(page_index); |
412 | 411 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 } | 412 } |
420 | 413 |
421 StringOrdinal ExtensionSorting::GetMinOrMaxAppLaunchOrdinalsOnPage( | 414 StringOrdinal ExtensionSorting::GetMinOrMaxAppLaunchOrdinalsOnPage( |
422 const StringOrdinal& target_page_ordinal, | 415 const StringOrdinal& target_page_ordinal, |
423 AppLaunchOrdinalReturn return_type) const { | 416 AppLaunchOrdinalReturn return_type) const { |
424 CHECK(target_page_ordinal.IsValid()); | 417 CHECK(target_page_ordinal.IsValid()); |
425 | 418 |
426 StringOrdinal return_value; | 419 StringOrdinal return_value; |
427 | 420 |
428 PageOrdinalMap::const_iterator page = | 421 PageOrdinalMap::const_iterator page = |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
507 if (ext) { | 500 if (ext) { |
508 // It is possible for old extension to have ordinal values, but they | 501 // It is possible for old extension to have ordinal values, but they |
509 // shouldn't so we clear them. | 502 // shouldn't so we clear them. |
510 if (!ext->is_app()) | 503 if (!ext->is_app()) |
511 ClearOrdinals(extension_id); | 504 ClearOrdinals(extension_id); |
512 | 505 |
513 extension_service_->SyncExtensionChangeIfNeeded(*ext); | 506 extension_service_->SyncExtensionChangeIfNeeded(*ext); |
514 } | 507 } |
515 } | 508 } |
516 } | 509 } |
OLD | NEW |