Chromium Code Reviews| Index: chrome/browser/extensions/extension_toolbar_model.cc |
| =================================================================== |
| --- chrome/browser/extensions/extension_toolbar_model.cc (revision 34323) |
| +++ chrome/browser/extensions/extension_toolbar_model.cc (working copy) |
| @@ -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 @@ |
| 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 @@ |
| } |
| 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,83 @@ |
| 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_->GetExtensionById( |
| + service_->extensions()->at(i)->id(), false); |
|
tony
2009/12/11 19:59:38
Nit: Doesn't at(i) return the extension you want?
Evan Stade
2009/12/11 20:04:20
hmm, so it does. Don't I feel stupid.
|
| + 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); |
| +} |