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

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

Issue 10105019: Merge 132468 - [NTP4] Fix empty apps page crash. (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1084/src/
Patch Set: Created 8 years, 8 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 | Annotate | Revision Log
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_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
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
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
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
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 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_sorting.h ('k') | chrome/browser/extensions/extension_sorting_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698