Chromium Code Reviews| 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_toolbar_model.h" | 5 #include "chrome/browser/extensions/extension_toolbar_model.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 321 // For the last-known position, we use the index of the extension that is | 321 // For the last-known position, we use the index of the extension that is |
| 322 // just before this extension, plus one. (Note that this isn't the same | 322 // just before this extension, plus one. (Note that this isn't the same |
| 323 // as new_index + 1, because last_known_positions_ can include disabled | 323 // as new_index + 1, because last_known_positions_ can include disabled |
| 324 // extensions.) | 324 // extensions.) |
| 325 int new_last_known_index = | 325 int new_last_known_index = |
| 326 new_index == 0 ? 0 : | 326 new_index == 0 ? 0 : |
| 327 std::find(last_known_positions_.begin(), | 327 std::find(last_known_positions_.begin(), |
| 328 last_known_positions_.end(), | 328 last_known_positions_.end(), |
| 329 toolbar_items_[new_index - 1]->id()) - | 329 toolbar_items_[new_index - 1]->id()) - |
| 330 last_known_positions_.begin() + 1; | 330 last_known_positions_.begin() + 1; |
| 331 // In theory, the extension before this one should always | |
| 332 // be in last known positions, but if something funny happened with prefs, | |
| 333 // make sure we handle it. | |
| 334 // TODO(devlin): Track down these cases so we can CHECK this. | |
| 335 new_last_known_index = | |
| 336 std::min(new_last_known_index, | |
| 337 static_cast<int>(last_known_positions_.size())); | |
|
Marijn Kruisselbrink
2015/02/20 18:26:41
I personally prefer std::min<int>(a, b) over std::
Devlin
2015/02/20 21:50:00
Done.
| |
| 331 last_known_positions_.insert( | 338 last_known_positions_.insert( |
| 332 last_known_positions_.begin() + new_last_known_index, extension->id()); | 339 last_known_positions_.begin() + new_last_known_index, extension->id()); |
| 333 UpdatePrefs(); | 340 UpdatePrefs(); |
| 334 } else { | 341 } else { |
| 335 new_index = FindNewPositionFromLastKnownGood(extension); | 342 new_index = FindNewPositionFromLastKnownGood(extension); |
| 336 } | 343 } |
| 337 | 344 |
| 338 toolbar_items_.insert(toolbar_items_.begin() + new_index, extension); | 345 toolbar_items_.insert(toolbar_items_.begin() + new_index, extension); |
| 339 | 346 |
| 340 // If we're currently highlighting, then even though we add a browser action | 347 // If we're currently highlighting, then even though we add a browser action |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 416 // have holes. | 423 // have holes. |
| 417 // 2. Create a vector of extensions that did not have a pref value. | 424 // 2. Create a vector of extensions that did not have a pref value. |
| 418 // 3. Remove holes from the sorted vector and append the unsorted vector. | 425 // 3. Remove holes from the sorted vector and append the unsorted vector. |
| 419 void ExtensionToolbarModel::InitializeExtensionList() { | 426 void ExtensionToolbarModel::InitializeExtensionList() { |
| 420 DCHECK(toolbar_items_.empty()); // We shouldn't have any items yet. | 427 DCHECK(toolbar_items_.empty()); // We shouldn't have any items yet. |
| 421 | 428 |
| 422 last_known_positions_ = extension_prefs_->GetToolbarOrder(); | 429 last_known_positions_ = extension_prefs_->GetToolbarOrder(); |
| 423 if (profile_->IsOffTheRecord()) | 430 if (profile_->IsOffTheRecord()) |
| 424 IncognitoPopulate(); | 431 IncognitoPopulate(); |
| 425 else | 432 else |
| 426 Populate(last_known_positions_); | 433 Populate(&last_known_positions_); |
| 427 | 434 |
| 428 extensions_initialized_ = true; | 435 extensions_initialized_ = true; |
| 429 MaybeUpdateVisibilityPrefs(); | 436 MaybeUpdateVisibilityPrefs(); |
| 430 FOR_EACH_OBSERVER(Observer, observers_, OnToolbarModelInitialized()); | 437 FOR_EACH_OBSERVER(Observer, observers_, OnToolbarModelInitialized()); |
| 431 } | 438 } |
| 432 | 439 |
| 433 void ExtensionToolbarModel::Populate(const ExtensionIdList& positions) { | 440 void ExtensionToolbarModel::Populate(ExtensionIdList* positions) { |
| 434 DCHECK(!profile_->IsOffTheRecord()); | 441 DCHECK(!profile_->IsOffTheRecord()); |
| 435 const ExtensionSet& extensions = | 442 const ExtensionSet& extensions = |
| 436 ExtensionRegistry::Get(profile_)->enabled_extensions(); | 443 ExtensionRegistry::Get(profile_)->enabled_extensions(); |
| 437 // Items that have explicit positions. | 444 // Items that have explicit positions. |
| 438 ExtensionList sorted(positions.size(), NULL); | 445 ExtensionList sorted(positions->size(), NULL); |
| 439 // The items that don't have explicit positions. | 446 // The items that don't have explicit positions. |
| 440 ExtensionList unsorted; | 447 ExtensionList unsorted; |
| 441 | 448 |
| 442 // Create the lists. | 449 // Create the lists. |
| 443 int hidden = 0; | 450 int hidden = 0; |
| 444 for (const scoped_refptr<const Extension>& extension : extensions) { | 451 for (const scoped_refptr<const Extension>& extension : extensions) { |
| 445 if (!ShouldAddExtension(extension.get())) { | 452 if (!ShouldAddExtension(extension.get())) { |
| 446 if (!ExtensionActionAPI::GetBrowserActionVisibility(extension_prefs_, | 453 if (!ExtensionActionAPI::GetBrowserActionVisibility(extension_prefs_, |
| 447 extension->id())) | 454 extension->id())) |
| 448 ++hidden; | 455 ++hidden; |
| 449 continue; | 456 continue; |
| 450 } | 457 } |
| 451 | 458 |
| 452 ExtensionIdList::const_iterator pos = | 459 ExtensionIdList::const_iterator pos = |
| 453 std::find(positions.begin(), positions.end(), extension->id()); | 460 std::find(positions->begin(), positions->end(), extension->id()); |
| 454 if (pos != positions.end()) | 461 if (pos != positions->end()) { |
| 455 sorted[pos - positions.begin()] = extension; | 462 sorted[pos - positions->begin()] = extension; |
| 456 else | 463 } else { |
| 464 // Unknown extension - push it to the back of unsorted, and add it to the | |
| 465 // of ids at the end. | |
|
Marijn Kruisselbrink
2015/02/20 18:26:41
"and add it to the of ids at the end"?
I think yo
Devlin
2015/02/20 21:50:00
Done.
| |
| 457 unsorted.push_back(extension); | 466 unsorted.push_back(extension); |
| 467 positions->push_back(extension->id()); | |
| 468 } | |
| 458 } | 469 } |
| 459 | 470 |
| 460 // Merge the lists. | 471 // Merge the lists. |
| 461 sorted.insert(sorted.end(), unsorted.begin(), unsorted.end()); | 472 sorted.insert(sorted.end(), unsorted.begin(), unsorted.end()); |
| 462 toolbar_items_.reserve(sorted.size()); | 473 toolbar_items_.reserve(sorted.size()); |
| 463 | 474 |
| 464 for (const scoped_refptr<const Extension>& extension : sorted) { | 475 for (const scoped_refptr<const Extension>& extension : sorted) { |
| 465 // It's possible for the extension order to contain items that aren't | 476 // It's possible for the extension order to contain items that aren't |
| 466 // actually loaded on this machine. For example, when extension sync is on, | 477 // actually loaded on this machine. For example, when extension sync is on, |
| 467 // we sync the extension order as-is but double-check with the user before | 478 // we sync the extension order as-is but double-check with the user before |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 583 // Clear out the old... | 594 // Clear out the old... |
| 584 while (!toolbar_items_.empty()) { | 595 while (!toolbar_items_.empty()) { |
| 585 scoped_refptr<const Extension> extension = toolbar_items_.back(); | 596 scoped_refptr<const Extension> extension = toolbar_items_.back(); |
| 586 toolbar_items_.pop_back(); | 597 toolbar_items_.pop_back(); |
| 587 FOR_EACH_OBSERVER( | 598 FOR_EACH_OBSERVER( |
| 588 Observer, observers_, ToolbarExtensionRemoved(extension.get())); | 599 Observer, observers_, ToolbarExtensionRemoved(extension.get())); |
| 589 } | 600 } |
| 590 DCHECK(toolbar_items_.empty()); | 601 DCHECK(toolbar_items_.empty()); |
| 591 | 602 |
| 592 // ...Add the new... | 603 // ...Add the new... |
| 593 Populate(last_known_positions_); | 604 Populate(&last_known_positions_); |
| 594 | 605 |
| 595 // ...And notify. | 606 // ...And notify. |
| 596 for (size_t i = 0; i < toolbar_items().size(); ++i) { | 607 for (size_t i = 0; i < toolbar_items().size(); ++i) { |
| 597 FOR_EACH_OBSERVER(Observer, | 608 FOR_EACH_OBSERVER(Observer, |
| 598 observers_, | 609 observers_, |
| 599 ToolbarExtensionAdded(toolbar_items()[i].get(), i)); | 610 ToolbarExtensionAdded(toolbar_items()[i].get(), i)); |
| 600 } | 611 } |
| 601 | 612 |
| 602 if (last_known_positions_.size() > pref_position_size) { | 613 if (last_known_positions_.size() > pref_position_size) { |
| 603 // Need to update pref because we have extra icons. But can't call | 614 // Need to update pref because we have extra icons. But can't call |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 699 if (is_highlighting_) { | 710 if (is_highlighting_) { |
| 700 highlighted_items_.clear(); | 711 highlighted_items_.clear(); |
| 701 is_highlighting_ = false; | 712 is_highlighting_ = false; |
| 702 if (old_visible_icon_count_ != visible_icon_count_) | 713 if (old_visible_icon_count_ != visible_icon_count_) |
| 703 SetVisibleIconCount(old_visible_icon_count_); | 714 SetVisibleIconCount(old_visible_icon_count_); |
| 704 FOR_EACH_OBSERVER(Observer, observers_, ToolbarHighlightModeChanged(false)); | 715 FOR_EACH_OBSERVER(Observer, observers_, ToolbarHighlightModeChanged(false)); |
| 705 } | 716 } |
| 706 } | 717 } |
| 707 | 718 |
| 708 } // namespace extensions | 719 } // namespace extensions |
| OLD | NEW |