Index: chrome/browser/extensions/extension_toolbar_model.cc |
diff --git a/chrome/browser/extensions/extension_toolbar_model.cc b/chrome/browser/extensions/extension_toolbar_model.cc |
index 588909c53989873330790faf886a5276d9ce9b2e..cc3f817e686d92bca05ed88a08d09dd4b0f3e363 100644 |
--- a/chrome/browser/extensions/extension_toolbar_model.cc |
+++ b/chrome/browser/extensions/extension_toolbar_model.cc |
@@ -122,7 +122,7 @@ void ExtensionToolbarModel::MoveExtensionIcon(const std::string& id, |
} |
void ExtensionToolbarModel::SetVisibleIconCount(size_t count) { |
- visible_icon_count_ = (count == toolbar_items_.size()) ? -1 : count; |
+ visible_icon_count_ = (count >= toolbar_items_.size()) ? -1 : count; |
// Only set the prefs if we're not in highlight mode and the profile is not |
// incognito. Highlight mode is designed to be a transitory state, and should |
@@ -227,17 +227,16 @@ void ExtensionToolbarModel::Observe( |
int new_index = 0; |
if (visible) { |
// If this action used to be hidden, we can't possibly be showing all. |
- DCHECK_NE(-1, visible_icon_count_); |
+ DCHECK_LT(visible_icon_count(), toolbar_items_.size()); |
// Grow the bar by one and move the extension to the end of the visibles. |
- new_size = visible_icon_count_ + 1; |
+ new_size = visible_icon_count() + 1; |
new_index = new_size - 1; |
} else { |
// If we're hiding one, we must be showing at least one. |
- DCHECK_NE(visible_icon_count_, 0); |
+ DCHECK_GE(visible_icon_count(), 0u); |
// Shrink the bar by one and move the extension to the beginning of the |
// overflow menu. |
- new_size = visible_icon_count_ == -1 ? |
- toolbar_items_.size() - 1 : visible_icon_count_ - 1; |
+ new_size = visible_icon_count() - 1; |
new_index = new_size; |
} |
SetVisibleIconCount(new_size); |
@@ -311,6 +310,8 @@ bool ExtensionToolbarModel::ShouldAddExtension(const Extension* extension) { |
} |
void ExtensionToolbarModel::AddExtension(const Extension* extension) { |
+ // We only use AddExtension() once the system is initialized. |
+ DCHECK(extensions_initialized_); |
if (!ShouldAddExtension(extension)) |
return; |
@@ -345,18 +346,17 @@ void ExtensionToolbarModel::AddExtension(const Extension* extension) { |
// Find what the index will be in the main bar. Because Observer calls are |
// nondeterministic, we can't just assume the main bar will have the |
// extension and look it up. |
- int main_index = is_new_extension ? |
+ size_t main_index = is_new_extension ? |
main_model->toolbar_items_.size() : |
main_model->FindNewPositionFromLastKnownGood(extension); |
- bool visible = main_index < main_model->visible_icon_count_ || |
- main_model->visible_icon_count_ == -1; |
+ bool visible = main_index < main_model->visible_icon_count(); |
// We may need to adjust the visible count if the incognito bar isn't |
// showing all icons and this one is visible, or if it is showing all |
// icons and this is hidden. |
- if (visible && visible_icon_count_ != -1) |
- SetVisibleIconCount(visible_icon_count_ + 1); |
- else if (!visible && visible_icon_count_ == -1) |
- SetVisibleIconCount(toolbar_items_.size() - 1); |
+ if (visible && !all_icons_visible()) |
+ SetVisibleIconCount(visible_icon_count() + 1); |
+ else if (!visible && all_icons_visible()) |
+ SetVisibleIconCount(visible_icon_count() - 1); |
} |
} |
} |
@@ -412,6 +412,8 @@ void ExtensionToolbarModel::ClearItems() { |
// 2. Create a vector of extensions that did not have a pref value. |
// 3. Remove holes from the sorted vector and append the unsorted vector. |
void ExtensionToolbarModel::InitializeExtensionList() { |
+ DCHECK(toolbar_items_.empty()); // We shouldn't have any items yet. |
+ |
last_known_positions_ = extension_prefs_->GetToolbarOrder(); |
if (profile_->IsOffTheRecord()) |
IncognitoPopulate(); |
@@ -450,11 +452,9 @@ void ExtensionToolbarModel::Populate(const ExtensionIdList& positions) { |
unsorted.push_back(extension); |
} |
- // Clear the current items, if any. |
- ClearItems(); |
- |
// Merge the lists. |
- toolbar_items_.reserve(sorted.size() + unsorted.size()); |
+ sorted.insert(sorted.end(), unsorted.begin(), unsorted.end()); |
+ toolbar_items_.reserve(sorted.size()); |
for (const scoped_refptr<const Extension>& extension : sorted) { |
// It's possible for the extension order to contain items that aren't |
@@ -463,21 +463,13 @@ void ExtensionToolbarModel::Populate(const ExtensionIdList& positions) { |
// syncing NPAPI-containing extensions, so if one of those is not actually |
// synced, we'll get a NULL in the list. This sort of case can also happen |
// if some error prevents an extension from loading. |
- if (extension.get() != NULL) { |
- toolbar_items_.push_back(extension); |
- FOR_EACH_OBSERVER( |
- Observer, |
- observers_, |
- ToolbarExtensionAdded(extension.get(), toolbar_items_.size() - 1)); |
- } |
- } |
- for (const scoped_refptr<const Extension>& extension : unsorted) { |
- if (extension.get() != NULL) { |
+ if (extension.get()) { |
+ // We don't notify observers of the added extension yet. Rather, observers |
+ // should wait for the "OnToolbarModelInitialized" notification, and then |
+ // bulk-update. (This saves a lot of bouncing-back-and-forth here, and |
+ // allows observers to ensure that the extension system is always |
+ // initialized before using the extensions). |
toolbar_items_.push_back(extension); |
- FOR_EACH_OBSERVER( |
- Observer, |
- observers_, |
- ToolbarExtensionAdded(extension.get(), toolbar_items_.size() - 1)); |
} |
} |
@@ -499,9 +491,6 @@ void ExtensionToolbarModel::Populate(const ExtensionIdList& positions) { |
void ExtensionToolbarModel::IncognitoPopulate() { |
DCHECK(profile_->IsOffTheRecord()); |
- // Clear the current items, if any. |
- ClearItems(); |
- |
const ExtensionToolbarModel* original_model = |
ExtensionToolbarModel::Get(profile_->GetOriginalProfile()); |
@@ -519,10 +508,6 @@ void ExtensionToolbarModel::IncognitoPopulate() { |
toolbar_items_.push_back(*iter); |
if (iter - original_model->toolbar_items_.begin() < original_visible) |
++visible_icon_count_; |
- FOR_EACH_OBSERVER( |
- Observer, |
- observers_, |
- ToolbarExtensionAdded(iter->get(), toolbar_items_.size() - 1)); |
} |
} |
} |
@@ -538,11 +523,11 @@ void ExtensionToolbarModel::UpdatePrefs() { |
} |
void ExtensionToolbarModel::MaybeUpdateVisibilityPref( |
- const Extension* extension, int index) { |
+ const Extension* extension, size_t index) { |
// We only update the visibility pref for hidden/not hidden based on the |
// overflow menu with the new toolbar design. |
if (include_all_extensions_ && !profile_->IsOffTheRecord()) { |
- bool visible = index < visible_icon_count_ || visible_icon_count_ == -1; |
+ bool visible = index < visible_icon_count(); |
if (visible != ExtensionActionAPI::GetBrowserActionVisibility( |
extension_prefs_, extension->id())) { |
// Don't observe changes caused by ourselves. |
@@ -590,6 +575,8 @@ void ExtensionToolbarModel::OnExtensionToolbarPrefChange() { |
} |
last_known_positions_.swap(pref_positions); |
+ ClearItems(); |
+ |
// Re-populate. |
Populate(last_known_positions_); |
@@ -609,7 +596,7 @@ size_t ExtensionToolbarModel::GetVisibleIconCountForTab( |
return visible_icon_count(); // Already displaying all actions. |
ExtensionActionAPI* extension_action_api = ExtensionActionAPI::Get(profile_); |
- size_t total_icons = visible_icon_count_; |
+ size_t total_icons = visible_icon_count(); |
for (size_t i = total_icons; i < toolbar_items_.size(); ++i) { |
if (extension_action_api->ExtensionWantsToRun(toolbar_items_[i].get(), |
web_contents)) |
@@ -664,15 +651,15 @@ bool ExtensionToolbarModel::ShowExtensionActionPopup( |
void ExtensionToolbarModel::EnsureVisibility( |
const ExtensionIdList& extension_ids) { |
- if (visible_icon_count_ == -1) |
+ if (all_icons_visible()) |
return; // Already showing all. |
// Otherwise, make sure we have enough room to show all the extensions |
// requested. |
- if (visible_icon_count_ < static_cast<int>(extension_ids.size())) |
+ if (visible_icon_count() < extension_ids.size()) |
SetVisibleIconCount(extension_ids.size()); |
- if (visible_icon_count_ == -1) |
+ if (all_icons_visible()) |
return; // May have been set to max by SetVisibleIconCount. |
// Guillotine's Delight: Move an orange noble to the front of the line. |
@@ -681,7 +668,8 @@ void ExtensionToolbarModel::EnsureVisibility( |
for (ExtensionList::const_iterator extension = toolbar_items_.begin(); |
extension != toolbar_items_.end(); ++extension) { |
if ((*extension)->id() == (*it)) { |
- if (extension - toolbar_items_.begin() >= visible_icon_count_) |
+ if (extension - toolbar_items_.begin() >= |
+ static_cast<int>(visible_icon_count())) |
MoveExtensionIcon((*extension)->id(), 0); |
break; |
} |
@@ -709,10 +697,8 @@ bool ExtensionToolbarModel::HighlightExtensions( |
if (highlighted_items_.size()) { |
old_visible_icon_count_ = visible_icon_count_; |
is_highlighting_ = true; |
- if (visible_icon_count_ != -1 && |
- visible_icon_count_ < static_cast<int>(extension_ids.size())) { |
+ if (visible_icon_count() < extension_ids.size()) |
SetVisibleIconCount(extension_ids.size()); |
- } |
FOR_EACH_OBSERVER(Observer, observers_, ToolbarHighlightModeChanged(true)); |
return true; |