summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_toolbar_model.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-14 20:51:29 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-14 20:51:29 +0000
commit216e0bc0a053fe5939f829c877959f9a26a91e11 (patch)
tree3c9036938d87ee68ba69acc7ca0a9529a19202dd /chrome/browser/extensions/extension_toolbar_model.cc
parenta4ed6281fe6d6aad1366a8f6b03e35f6e1eadaa6 (diff)
downloadchromium_src-216e0bc0a053fe5939f829c877959f9a26a91e11.zip
chromium_src-216e0bc0a053fe5939f829c877959f9a26a91e11.tar.gz
chromium_src-216e0bc0a053fe5939f829c877959f9a26a91e11.tar.bz2
Persist the order of extensions in the browser action toolbar across sessions.
Very similar to what we did with the extension shelf. BUG=26990 Review URL: http://codereview.chromium.org/487021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34490 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_toolbar_model.cc')
-rw-r--r--chrome/browser/extensions/extension_toolbar_model.cc86
1 files changed, 77 insertions, 9 deletions
diff --git a/chrome/browser/extensions/extension_toolbar_model.cc b/chrome/browser/extensions/extension_toolbar_model.cc
index 5a9f2a8..d561120 100644
--- a/chrome/browser/extensions/extension_toolbar_model.cc
+++ b/chrome/browser/extensions/extension_toolbar_model.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/extension_toolbar_model.h"
+#include "chrome/browser/extensions/extension_prefs.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/notification_service.h"
@@ -46,7 +47,7 @@ void ExtensionToolbarModel::MoveBrowserAction(Extension* extension,
bool inserted = false;
for (ExtensionList::iterator iter = begin(); iter != end(); ++iter, ++i) {
if (i == index) {
- toolitems_.insert(pos, extension);
+ toolitems_.insert(iter, extension);
inserted = true;
break;
}
@@ -60,17 +61,15 @@ void ExtensionToolbarModel::MoveBrowserAction(Extension* extension,
}
FOR_EACH_OBSERVER(Observer, observers_, BrowserActionMoved(extension, index));
+
+ UpdatePrefs();
}
void ExtensionToolbarModel::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
if (type == NotificationType::EXTENSIONS_READY) {
- for (size_t i = 0; i < service_->extensions()->size(); ++i) {
- Extension* extension = service_->GetExtensionById(
- service_->extensions()->at(i)->id(), false);
- AddExtension(extension);
- }
+ InitializeExtensionList();
return;
}
@@ -96,13 +95,82 @@ void ExtensionToolbarModel::AddExtension(Extension* extension) {
toolitems_.push_back(extension);
FOR_EACH_OBSERVER(Observer, observers_,
BrowserActionAdded(extension, toolitems_.size() - 1));
+
+ UpdatePrefs();
}
void ExtensionToolbarModel::RemoveExtension(Extension* extension) {
ExtensionList::iterator pos = std::find(begin(), end(), extension);
- if (pos != end()) {
- toolitems_.erase(pos);
+ if (pos == end()) {
+ return;
+ }
+
+ toolitems_.erase(pos);
+ FOR_EACH_OBSERVER(Observer, observers_,
+ BrowserActionRemoved(extension));
+
+ UpdatePrefs();
+}
+
+// Combine the currently enabled extensions that have browser actions (which
+// we get from the ExtensionsService) with the ordering we get from the
+// pref service. For robustness we use a somewhat inefficient process:
+// 1. Create a vector of extensions sorted by their pref values. This vector may
+// have holes.
+// 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(service_->is_ready());
+
+ std::vector<std::string> pref_order = service_->extension_prefs()->
+ GetToolbarOrder();
+ // Items that have a pref for their position.
+ ExtensionList sorted;
+ sorted.resize(pref_order.size(), NULL);
+ // The items that don't have a pref for their position.
+ ExtensionList unsorted;
+
+ // Create the lists.
+ for (size_t i = 0; i < service_->extensions()->size(); ++i) {
+ Extension* extension = service_->extensions()->at(i);
+ if (!extension->browser_action())
+ continue;
+
+ std::vector<std::string>::iterator pos =
+ std::find(pref_order.begin(), pref_order.end(), extension->id());
+ if (pos != pref_order.end()) {
+ int index = std::distance(pref_order.begin(), pos);
+ sorted[index] = extension;
+ } else {
+ unsorted.push_back(extension);
+ }
+ }
+
+ // Merge the lists.
+ toolitems_.reserve(sorted.size() + unsorted.size());
+ for (ExtensionList::iterator iter = sorted.begin();
+ iter != sorted.end(); ++iter) {
+ if (*iter != NULL)
+ toolitems_.push_back(*iter);
+ }
+ toolitems_.insert(toolitems_.end(), unsorted.begin(), unsorted.end());
+
+ // Inform observers.
+ for (size_t i = 0; i < toolitems_.size(); i++) {
FOR_EACH_OBSERVER(Observer, observers_,
- BrowserActionRemoved(extension));
+ BrowserActionAdded(toolitems_[i], i));
}
+
+ UpdatePrefs();
+}
+
+void ExtensionToolbarModel::UpdatePrefs() {
+ if (!service_->extension_prefs())
+ return;
+
+ std::vector<std::string> ids;
+ ids.reserve(toolitems_.size());
+ for (ExtensionList::iterator iter = begin(); iter != end(); ++iter)
+ ids.push_back((*iter)->id());
+ service_->extension_prefs()->SetToolbarOrder(ids);
}