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

Unified Diff: chrome/browser/extensions/extension_toolbar_model.cc

Issue 476873002: Make hiding an extension action cause it to go to the overflow menu (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years, 4 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 side-by-side diff with in-line comments
Download patch
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 ae1dc1cb1491e251c2475e84348d1013e333a110..ab59e4f329c56432fa776b746300c9272dcc89dc 100644
--- a/chrome/browser/extensions/extension_toolbar_model.cc
+++ b/chrome/browser/extensions/extension_toolbar_model.cc
@@ -7,6 +7,7 @@
#include <algorithm>
#include <string>
+#include "base/message_loop/message_loop.h"
#include "base/metrics/histogram.h"
#include "base/metrics/histogram_base.h"
#include "base/prefs/pref_service.h"
@@ -117,7 +118,7 @@ void ExtensionToolbarModel::MoveExtensionIcon(const Extension* extension,
FOR_EACH_OBSERVER(
Observer, observers_, ToolbarExtensionMoved(extension, index));
-
+ MaybeUpdateVisibilityPref(extension, index);
UpdatePrefs();
}
@@ -158,11 +159,21 @@ ExtensionAction::ShowAction ExtensionToolbarModel::ExecuteBrowserAction(
void ExtensionToolbarModel::SetVisibleIconCount(int count) {
visible_icon_count_ =
count == static_cast<int>(toolbar_items_.size()) ? -1 : count;
+
// Only set the prefs if we're not in highlight mode. Highlight mode is
// designed to be a transitory state, and should not persist across browser
// restarts (though it may be re-entered).
- if (!is_highlighting_)
+ if (!is_highlighting_) {
+ // Additionally, if we are using the new toolbar, any icons which are in the
+ // overflow menu are considered "hidden". But it so happens that the times
+ // we are likely to call SetVisibleIconCount() are also those when we are
+ // in flux. So wait for things to cool down before setting the prefs.
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&ExtensionToolbarModel::MaybeUpdateVisibilityPrefs,
+ weak_ptr_factory_.GetWeakPtr()));
prefs_->SetInteger(pref_names::kToolbarSize, visible_icon_count_);
+ }
}
void ExtensionToolbarModel::OnExtensionActionUpdated(
@@ -222,18 +233,42 @@ void ExtensionToolbarModel::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
- DCHECK_EQ(
- extensions::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED,
- type);
+ DCHECK_EQ(NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED, type);
const Extension* extension =
ExtensionRegistry::Get(profile_)->GetExtensionById(
*content::Details<const std::string>(details).ptr(),
ExtensionRegistry::EVERYTHING);
- if (ExtensionActionAPI::GetBrowserActionVisibility(extension_prefs_,
- extension->id()))
- AddExtension(extension);
- else
- RemoveExtension(extension);
+
+ bool visible = ExtensionActionAPI::GetBrowserActionVisibility(
+ extension_prefs_, extension->id());
+ // Hiding works differently with the new and old toolbars.
+ if (include_all_extensions_) {
+ int new_size = 0;
+ int new_index = 0;
+ if (visible) {
+ // If this action used to be hidden, we can't possible be showing all.
+ DCHECK_NE(-1, visible_icon_count_);
+ // Grow the bar by one and move the extension to the end of the visibles.
+ 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);
+ // 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_index = new_size;
+ }
+ SetVisibleIconCount(new_size);
+ MoveExtensionIcon(extension, new_index);
+ FOR_EACH_OBSERVER(Observer, observers_, ToolbarVisibleCountChanged());
+ } else { // Don't include all extensions.
+ if (visible)
+ AddExtension(extension);
+ else
+ RemoveExtension(extension);
+ }
}
void ExtensionToolbarModel::OnReady() {
@@ -318,6 +353,8 @@ void ExtensionToolbarModel::AddExtension(const Extension* extension) {
UpdatePrefs();
}
+ MaybeUpdateVisibilityPref(extension, new_index);
+
// If we're currently highlighting, then even though we add a browser action
// to the full list (|toolbar_items_|, there won't be another *visible*
// browser action, which was what the observers care about.
@@ -369,6 +406,7 @@ void ExtensionToolbarModel::InitializeExtensionList(
Populate(last_known_positions_, extensions);
extensions_initialized_ = true;
+ MaybeUpdateVisibilityPrefs();
FOR_EACH_OBSERVER(Observer, observers_, ToolbarVisibleCountChanged());
}
@@ -469,6 +507,42 @@ void ExtensionToolbarModel::UpdatePrefs() {
pref_change_registrar_.Add(pref_names::kToolbar, pref_change_callback_);
}
+void ExtensionToolbarModel::MaybeUpdateVisibilityPref(
+ const Extension* extension, int 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_) {
+ bool visible = index < visible_icon_count_ || visible_icon_count_ == -1;
+ if (visible != ExtensionActionAPI::GetBrowserActionVisibility(
+ extension_prefs_, extension->id())) {
+ // Don't observe changes caused by ourselves.
+ bool was_registered = false;
+ if (registrar_.IsRegistered(
+ this,
+ NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED,
+ content::Source<ExtensionPrefs>(extension_prefs_))) {
+ was_registered = true;
+ registrar_.Remove(
+ this,
+ NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED,
+ content::Source<ExtensionPrefs>(extension_prefs_));
+ }
+ ExtensionActionAPI::SetBrowserActionVisibility(
+ extension_prefs_, extension->id(), visible);
+ if (was_registered) {
+ registrar_.Add(this,
+ NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED,
+ content::Source<ExtensionPrefs>(extension_prefs_));
+ }
+ }
+ }
+}
+
+void ExtensionToolbarModel::MaybeUpdateVisibilityPrefs() {
+ for (size_t i = 0u; i < toolbar_items_.size(); ++i)
+ MaybeUpdateVisibilityPref(toolbar_items_[i], i);
+}
+
int ExtensionToolbarModel::IncognitoIndexToOriginal(int incognito_index) {
int original_index = 0, i = 0;
for (ExtensionList::iterator iter = toolbar_items_.begin();
« no previous file with comments | « chrome/browser/extensions/extension_toolbar_model.h ('k') | chrome/browser/extensions/extension_toolbar_model_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698