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

Side by Side Diff: chrome/browser/ui/ash/chrome_launcher_prefs.cc

Issue 2366073002: Fix crash on item drag in shelf. (Closed)
Patch Set: Created 4 years, 3 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 (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/ui/ash/chrome_launcher_prefs.h" 5 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <set> 9 #include <set>
10 10
(...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 DCHECK(profile); 659 DCHECK(profile);
660 DCHECK(!app_id.empty()); 660 DCHECK(!app_id.empty());
661 app_list::AppListSyncableService* app_service = 661 app_list::AppListSyncableService* app_service =
662 app_list::AppListSyncableServiceFactory::GetForProfile(profile); 662 app_list::AppListSyncableServiceFactory::GetForProfile(profile);
663 app_service->SetPinPosition(app_id, syncer::StringOrdinal()); 663 app_service->SetPinPosition(app_id, syncer::StringOrdinal());
664 } 664 }
665 665
666 void SetPinPosition(Profile* profile, 666 void SetPinPosition(Profile* profile,
667 const std::string& app_id, 667 const std::string& app_id,
668 const std::string& app_id_before, 668 const std::string& app_id_before,
669 const std::string& app_id_after) { 669 const std::vector<std::string>& app_ids_after) {
670 DCHECK(profile); 670 DCHECK(profile);
671 DCHECK(!app_id.empty()); 671 DCHECK(!app_id.empty());
672 DCHECK_NE(app_id, app_id_before); 672 DCHECK_NE(app_id, app_id_before);
673 const std::string app_id_after =
674 app_ids_after.empty() ? std::string() : app_ids_after.front();
673 DCHECK_NE(app_id, app_id_after); 675 DCHECK_NE(app_id, app_id_after);
674 DCHECK(app_id_before.empty() || app_id_before != app_id_after); 676 DCHECK(app_id_before.empty() || app_id_before != app_id_after);
stevenjb 2016/09/23 23:05:01 Elim app_id_after and the checks from here and mov
khmel 2016/09/26 16:43:36 Done.
675 677
676 app_list::AppListSyncableService* app_service = 678 app_list::AppListSyncableService* app_service =
677 app_list::AppListSyncableServiceFactory::GetForProfile(profile); 679 app_list::AppListSyncableServiceFactory::GetForProfile(profile);
678 // Some unit tests may not have this service. 680 // Some unit tests may not have this service.
679 if (!app_service) 681 if (!app_service)
680 return; 682 return;
681 683
682 syncer::StringOrdinal position_before = 684 syncer::StringOrdinal position_before =
683 app_id_before.empty() ? syncer::StringOrdinal() 685 app_id_before.empty() ? syncer::StringOrdinal()
684 : app_service->GetPinPosition(app_id_before); 686 : app_service->GetPinPosition(app_id_before);
685 syncer::StringOrdinal position_after = 687 syncer::StringOrdinal position_after = syncer::StringOrdinal();
686 app_id_after.empty() ? syncer::StringOrdinal() 688 if (position_before.IsValid() && !app_ids_after.empty()) {
687 : app_service->GetPinPosition(app_id_after); 689 // We have an element before and at least one after. Find the first element
690 // from after elements that differs from position_before.
691 std::vector<syncer::StringOrdinal> positions_after;
692 for (const auto& app_id_after_it : app_ids_after) {
693 syncer::StringOrdinal position =
694 app_service->GetPinPosition(app_id_after_it);
695 if (!position.IsValid()) {
696 NOTREACHED();
697 break;
698 }
699 positions_after.push_back(position);
700 if (!position_before.Equals(position)) {
701 DCHECK(position_before.LessThan(position));
702 break;
703 }
704 }
705 if (!positions_after.empty()) {
706 if (positions_after[0].Equals(position_before)) {
707 size_t index = positions_after.size() - 1;
708 if (positions_after[index].Equals(position_before)) {
709 // Last after element is still the same as before element. Update it.
710 positions_after[index] = position_before.CreateAfter();
711 app_service->SetPinPosition(app_ids_after[index],
712 positions_after[index]);
713 }
714 // Now update the rest of after elements.
715 while (index) {
716 --index;
717 DCHECK(positions_after[index].Equals(position_before));
718 positions_after[index] =
719 position_before.CreateBetween(positions_after[index + 1]);
720 app_service->SetPinPosition(app_ids_after[index],
721 positions_after[index]);
722 }
723 }
724 position_after = positions_after[0];
725 DCHECK(position_after.GreaterThan(position_before));
726 }
stevenjb 2016/09/23 23:05:01 I think this is more complicated than necessary. A
khmel 2016/09/26 16:43:36 My initial intention was to implemented something
stevenjb 2016/09/26 17:34:07 Acknowledged. While I agree that is less than idea
727 } else {
728 // No before or after position.
729 if (!app_id_after.empty())
stevenjb 2016/09/23 23:05:01 } else if (!app_ids_after.empty()) { string app_
khmel 2016/09/26 16:43:36 Done.
730 position_after = app_service->GetPinPosition(app_id_after);
731 }
688 732
689 syncer::StringOrdinal pin_position; 733 syncer::StringOrdinal pin_position;
690 if (position_before.IsValid() && position_after.IsValid()) 734 if (position_before.IsValid() && position_after.IsValid())
691 pin_position = position_before.CreateBetween(position_after); 735 pin_position = position_before.CreateBetween(position_after);
692 else if (position_before.IsValid()) 736 else if (position_before.IsValid())
693 pin_position = position_before.CreateAfter(); 737 pin_position = position_before.CreateAfter();
694 else if (position_after.IsValid()) 738 else if (position_after.IsValid())
695 pin_position = position_after.CreateBefore(); 739 pin_position = position_after.CreateBefore();
696 else 740 else
697 pin_position = syncer::StringOrdinal::CreateInitialOrdinal(); 741 pin_position = syncer::StringOrdinal::CreateInitialOrdinal();
698 app_service->SetPinPosition(app_id, pin_position); 742 app_service->SetPinPosition(app_id, pin_position);
699 } 743 }
700 744
701 } // namespace launcher 745 } // namespace launcher
702 } // namespace ash 746 } // namespace ash
OLDNEW
« no previous file with comments | « chrome/browser/ui/ash/chrome_launcher_prefs.h ('k') | chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698