Chromium Code Reviews| 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 c8e110d38d3fe44e95c7c2c3aacf7f3a3ea36b44..82f209e415a1182c94705ac3dd9635a4592a850e 100644 |
| --- a/chrome/browser/extensions/extension_toolbar_model.cc |
| +++ b/chrome/browser/extensions/extension_toolbar_model.cc |
| @@ -153,11 +153,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 && |
|
Finnur
2014/10/25 14:09:58
Is the extension check unnecessary now? Not saying
Devlin
2014/10/29 20:29:27
I think it actually always was - if extension is n
|
| - 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()) >= |
| + GetAbsoluteVisibleIconCount()) { |
| + FOR_EACH_OBSERVER( |
| + Observer, observers_, ToolbarReorderNecessary(web_contents)); |
| + } |
| } |
| } |
| @@ -568,6 +575,63 @@ void ExtensionToolbarModel::OnExtensionToolbarPrefChange() { |
| } |
| } |
| +int ExtensionToolbarModel::GetVisibleIconCountForTab( |
| + content::WebContents* web_contents) const { |
| + int base_visible = visible_icon_count_; |
| + if (base_visible == -1) |
| + return base_visible; // Already displaying all actions. |
| + |
| + ExtensionActionAPI* extension_action_api = ExtensionActionAPI::Get(profile_); |
| + size_t overflowed_actions_to_run = 0u; |
|
Finnur
2014/10/25 14:09:58
nit: to run? Seems a bit weird to use that phrase
Devlin
2014/10/29 20:29:27
Done.
|
| + for (size_t i = base_visible; i < toolbar_items_.size(); ++i) { |
| + if (extension_action_api->ExtensionWantsToRun(toolbar_items_[i].get(), |
| + web_contents)) |
| + ++overflowed_actions_to_run; |
| + } |
| + return base_visible + overflowed_actions_to_run; |
| +} |
| + |
| +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_to_run; |
| + ExtensionActionAPI* extension_action_api = ExtensionActionAPI::Get(profile_); |
| + size_t base_visible = GetAbsoluteVisibleIconCount(); |
| + size_t index = toolbar_items_.size() - 1; |
| + |
| + // We need to pop out any extensions that are overflowed, but want to act. |
| + // Iterate over the overflowed extensions in reverse, and append those that |
| + // don't want to act, while storing those that do separately. |
| + for (size_t i = toolbar_items_.size() - 1; i >= base_visible; --i) { |
| + if (extension_action_api->ExtensionWantsToRun(toolbar_items_[i].get(), |
| + web_contents)) |
| + overflowed_actions_to_run.push_back(toolbar_items_[i]); |
| + else |
| + result[index--] = toolbar_items_[i]; |
| + } |
| + // Now, append any that do want to act but were otherwise overflowed. |
| + for (const scoped_refptr<const Extension>& extension : |
| + overflowed_actions_to_run) { |
| + result[index--] = extension; |
| + } |
| + // We should have appended all of (and only) those items that were in |
| + // overflow. |
| + DCHECK_EQ(base_visible, index + 1); |
| + // The rest of the vector should be fine, since we don't need to reorder any |
| + // of the already-visible extensions. |
| + return result; |
| +} |
| + |
| bool ExtensionToolbarModel::ShowExtensionActionPopup( |
| const Extension* extension, |
| Browser* browser, |