| 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 d10dc721fbc76818f9d9482366ee13b391a9b3be..10549c092a83bfda1f16634e2bfd0b55db87d35c 100644
|
| --- a/chrome/browser/extensions/extension_toolbar_model.cc
|
| +++ b/chrome/browser/extensions/extension_toolbar_model.cc
|
| @@ -121,9 +121,8 @@ void ExtensionToolbarModel::MoveExtensionIcon(const std::string& id,
|
| UpdatePrefs();
|
| }
|
|
|
| -void ExtensionToolbarModel::SetVisibleIconCount(int count) {
|
| - visible_icon_count_ =
|
| - count == static_cast<int>(toolbar_items_.size()) ? -1 : count;
|
| +void ExtensionToolbarModel::SetVisibleIconCount(size_t 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
|
| @@ -152,11 +151,18 @@ void ExtensionToolbarModel::OnExtensionActionUpdated(
|
| ExtensionRegistry::Get(profile_)->enabled_extensions().GetByID(
|
| extension_action->extension_id());
|
| // Notify observers if the extension exists and is in the model.
|
| - if (extension &&
|
| - std::find(toolbar_items_.begin(),
|
| - toolbar_items_.end(),
|
| - extension) != toolbar_items_.end()) {
|
| - FOR_EACH_OBSERVER(Observer, observers_, ToolbarExtensionUpdated(extension));
|
| + ExtensionList::const_iterator iter =
|
| + std::find(toolbar_items_.begin(), toolbar_items_.end(), extension);
|
| + if (iter != toolbar_items_.end()) {
|
| + FOR_EACH_OBSERVER(
|
| + Observer, observers_, ToolbarExtensionUpdated(extension));
|
| + // If the action was in the overflow menu, we have to alert observers that
|
| + // the toolbar needs to be reordered (to show the action).
|
| + if (static_cast<size_t>(iter - toolbar_items_.begin()) >=
|
| + visible_icon_count()) {
|
| + FOR_EACH_OBSERVER(
|
| + Observer, observers_, OnToolbarReorderNecessary(web_contents));
|
| + }
|
| }
|
| }
|
|
|
| @@ -500,9 +506,7 @@ void ExtensionToolbarModel::IncognitoPopulate() {
|
| ExtensionToolbarModel::Get(profile_->GetOriginalProfile());
|
|
|
| // Find the absolute value of the original model's count.
|
| - int original_visible = original_model->GetVisibleIconCount();
|
| - if (original_visible == -1)
|
| - original_visible = original_model->toolbar_items_.size();
|
| + int original_visible = original_model->visible_icon_count();
|
|
|
| // In incognito mode, we show only those extensions that are
|
| // incognito-enabled. Further, any actions that were overflowed in regular
|
| @@ -599,6 +603,49 @@ void ExtensionToolbarModel::OnExtensionToolbarPrefChange() {
|
| }
|
| }
|
|
|
| +size_t ExtensionToolbarModel::GetVisibleIconCountForTab(
|
| + content::WebContents* web_contents) const {
|
| + if (all_icons_visible())
|
| + return visible_icon_count(); // Already displaying all actions.
|
| +
|
| + ExtensionActionAPI* extension_action_api = ExtensionActionAPI::Get(profile_);
|
| + 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))
|
| + ++total_icons;
|
| + }
|
| + return total_icons;
|
| +}
|
| +
|
| +ExtensionList ExtensionToolbarModel::GetItemOrderForTab(
|
| + content::WebContents* web_contents) const {
|
| + // If we're highlighting, the items are always the same.
|
| + if (is_highlighting_)
|
| + return highlighted_items_;
|
| +
|
| + // Start by initializing the array to be the same as toolbar items (this isn't
|
| + // any more expensive than initializing it to be of the same size with all
|
| + // nulls, and saves us time at the end).
|
| + ExtensionList result = toolbar_items_;
|
| + if (toolbar_items_.empty())
|
| + return result;
|
| +
|
| + ExtensionList overflowed_actions_wanting_to_run;
|
| + ExtensionActionAPI* extension_action_api = ExtensionActionAPI::Get(profile_);
|
| + size_t boundary = visible_icon_count();
|
| + // Rotate any actions that want to run to the boundary between visible and
|
| + // overflowed actions.
|
| + for (ExtensionList::iterator iter = result.begin() + boundary;
|
| + iter != result.end(); ++iter) {
|
| + if (extension_action_api->ExtensionWantsToRun(iter->get(), web_contents)) {
|
| + std::rotate(result.begin() + boundary, iter, iter + 1);
|
| + ++boundary;
|
| + }
|
| + }
|
| + return result;
|
| +}
|
| +
|
| bool ExtensionToolbarModel::ShowExtensionActionPopup(
|
| const Extension* extension,
|
| Browser* browser,
|
|
|