Index: chrome/browser/extensions/extension_shelf_model.cc |
diff --git a/chrome/browser/extensions/extension_shelf_model.cc b/chrome/browser/extensions/extension_shelf_model.cc |
deleted file mode 100644 |
index 51a8ce11ea80bf219f4e3a8ba81c00ef871c0372..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/extension_shelf_model.cc |
+++ /dev/null |
@@ -1,282 +0,0 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/extensions/extension_shelf_model.h" |
- |
-#include "base/stl_util-inl.h" |
-#include "chrome/browser/browser.h" |
-#include "chrome/browser/profile.h" |
-#include "chrome/browser/extensions/extension_host.h" |
-#include "chrome/browser/extensions/extension_process_manager.h" |
-#include "chrome/browser/extensions/extension_toolstrip_api.h" |
-#include "chrome/browser/extensions/extensions_service.h" |
-#include "chrome/browser/renderer_host/render_view_host.h" |
-#include "chrome/common/extensions/extension.h" |
-#include "chrome/common/notification_service.h" |
- |
-ExtensionShelfModel::ExtensionShelfModel(Browser* browser) |
- : browser_(browser), ready_(false) { |
- // Watch extensions loaded and unloaded notifications. |
- registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, |
- NotificationService::AllSources()); |
- registrar_.Add(this, NotificationType::EXTENSION_LOADED, |
- NotificationService::AllSources()); |
- registrar_.Add(this, NotificationType::EXTENSIONS_READY, |
- NotificationService::AllSources()); |
- |
- // Add any already-loaded extensions now, since we missed the notification for |
- // those. |
- ExtensionsService* service = browser_->profile()->GetExtensionsService(); |
- if (service) { // This can be null in unit tests. |
- prefs_ = browser_->profile()->GetExtensionsService()->extension_prefs(); |
- registrar_.Add(this, NotificationType::EXTENSION_SHELF_MODEL_CHANGED, |
- Source<ExtensionPrefs>(prefs_)); |
- ready_ = service->is_ready(); |
- if (ready_) { |
- AddExtensions(service->extensions()); |
- SortToolstrips(); |
- } |
- } |
-} |
- |
-ExtensionShelfModel::~ExtensionShelfModel() { |
- FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
- ShelfModelDeleting()); |
- |
- observers_.Clear(); |
- |
- for (iterator t = toolstrips_.begin(); t != toolstrips_.end(); ++t) |
- delete t->host; |
- toolstrips_.clear(); |
-} |
- |
-void ExtensionShelfModel::AddObserver(ExtensionShelfModelObserver* observer) { |
- observers_.AddObserver(observer); |
-} |
- |
-void ExtensionShelfModel::RemoveObserver( |
- ExtensionShelfModelObserver* observer) { |
- observers_.RemoveObserver(observer); |
-} |
- |
-void ExtensionShelfModel::AppendToolstrip(const ToolstripItem& toolstrip) { |
- InsertToolstripAt(count(), toolstrip); |
-} |
- |
-void ExtensionShelfModel::InsertToolstripAt(int index, |
- const ToolstripItem& toolstrip) { |
- toolstrips_.insert(toolstrips_.begin() + index, toolstrip); |
- if (ready_) { |
- FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
- ToolstripInsertedAt(toolstrip.host, index)); |
- } |
-} |
- |
-void ExtensionShelfModel::RemoveToolstripAt(int index) { |
- ExtensionHost* host = ToolstripAt(index).host; |
- FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
- ToolstripRemovingAt(host, index)); |
- toolstrips_.erase(toolstrips_.begin() + index); |
- delete host; |
-} |
- |
-void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { |
- DCHECK(index >= 0); |
- DCHECK(to_index >= 0); |
- if (index == to_index) |
- return; |
- |
- ToolstripItem toolstrip = toolstrips_[index]; |
- toolstrips_.erase(toolstrips_.begin() + index); |
- toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip); |
- |
- FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
- ToolstripMoved(toolstrip.host, index, to_index)); |
- |
- UpdatePrefs(); |
-} |
- |
-int ExtensionShelfModel::IndexOfHost(ExtensionHost* host) { |
- for (iterator i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { |
- if (i->host == host) |
- return i - toolstrips_.begin(); |
- } |
- return -1; |
-} |
- |
-ExtensionShelfModel::iterator ExtensionShelfModel::ToolstripForHost( |
- ExtensionHost* host) { |
- for (iterator i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { |
- if (i->host == host) |
- return i; |
- } |
- return toolstrips_.end(); |
-} |
- |
-const ExtensionShelfModel::ToolstripItem& ExtensionShelfModel::ToolstripAt( |
- int index) { |
- DCHECK(index >= 0); |
- return toolstrips_[index]; |
-} |
- |
-void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) { |
- DCHECK(index >= 0); |
- toolstrips_[index].data = data; |
-} |
- |
-void ExtensionShelfModel::ExpandToolstrip(iterator toolstrip, |
- const GURL& url, int height) { |
- if (toolstrip == end()) |
- return; |
- toolstrip->height = height; |
- toolstrip->url = url; |
- FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
- ToolstripChanged(toolstrip)); |
- int routing_id = toolstrip->host->render_view_host()->routing_id(); |
- ToolstripEventRouter::OnToolstripExpanded(browser_->profile(), |
- routing_id, |
- url, height); |
- toolstrip->host->SetRenderViewType(ViewType::EXTENSION_MOLE); |
-} |
- |
-void ExtensionShelfModel::CollapseToolstrip(iterator toolstrip, |
- const GURL& url) { |
- if (toolstrip == end()) |
- return; |
- toolstrip->height = 0; |
- toolstrip->url = url; |
- FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
- ToolstripChanged(toolstrip)); |
- int routing_id = toolstrip->host->render_view_host()->routing_id(); |
- ToolstripEventRouter::OnToolstripCollapsed(browser_->profile(), |
- routing_id, |
- url); |
- toolstrip->host->SetRenderViewType(ViewType::EXTENSION_TOOLSTRIP); |
-} |
- |
-void ExtensionShelfModel::Observe(NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details) { |
- switch (type.value) { |
- case NotificationType::EXTENSION_LOADED: |
- if (ready_) |
- AddExtension(Details<Extension>(details).ptr()); |
- break; |
- case NotificationType::EXTENSION_UNLOADED: |
- RemoveExtension(Details<Extension>(details).ptr()); |
- break; |
- case NotificationType::EXTENSIONS_READY: |
- if (browser_->profile()->GetExtensionsService()) { |
- AddExtensions( |
- browser_->profile()->GetExtensionsService()->extensions()); |
- SortToolstrips(); |
- } |
- ready_ = true; |
- break; |
- case NotificationType::EXTENSION_SHELF_MODEL_CHANGED: |
- // Ignore changes that this model originated. |
- if (Details<ExtensionShelfModel>(details).ptr() != this) |
- SortToolstrips(); |
- break; |
- default: |
- DCHECK(false) << "Unhandled notification of type: " << type.value; |
- break; |
- } |
-} |
- |
-void ExtensionShelfModel::AddExtension(Extension* extension) { |
- ExtensionProcessManager* manager = |
- browser_->profile()->GetExtensionProcessManager(); |
- DCHECK(manager); |
- if (!manager) |
- return; |
- |
- for (std::vector<Extension::ToolstripInfo>::const_iterator toolstrip = |
- extension->toolstrips().begin(); |
- toolstrip != extension->toolstrips().end(); ++toolstrip) { |
- GURL url = toolstrip->toolstrip; |
- ToolstripItem item; |
- item.host = manager->CreateToolstrip(extension, url, browser_); |
- item.info = *toolstrip; |
- item.data = NULL; |
- item.height = 0; |
- AppendToolstrip(item); |
- } |
-} |
- |
-void ExtensionShelfModel::AddExtensions(const ExtensionList* extensions) { |
- if (extensions->size()) { |
- ExtensionList::const_iterator extension = extensions->begin(); |
- for (; extension != extensions->end(); ++extension) |
- AddExtension(*extension); |
- } |
-} |
- |
-void ExtensionShelfModel::RemoveExtension(Extension* extension) { |
- bool changed = false; |
- for (int i = count() - 1; i >= 0; --i) { |
- ExtensionHost* t = ToolstripAt(i).host; |
- if (t->extension()->id() == extension->id()) { |
- changed = true; |
- RemoveToolstripAt(i); |
- |
- // There can be more than one toolstrip per extension, so we have to keep |
- // looping even after finding a match. |
- } |
- } |
- if (changed) |
- UpdatePrefs(); |
-} |
- |
-void ExtensionShelfModel::UpdatePrefs() { |
- if (!prefs_) |
- return; |
- |
- // It's easiest to just rebuild the list each time. |
- ExtensionPrefs::URLList urls; |
- for (int i = 0; i < count(); ++i) |
- urls.push_back(ToolstripAt(i).host->GetURL()); |
- prefs_->SetShelfToolstripOrder(urls); |
- |
- NotificationService::current()->Notify( |
- NotificationType::EXTENSION_SHELF_MODEL_CHANGED, |
- Source<ExtensionPrefs>(prefs_), |
- Details<ExtensionShelfModel>(this)); |
-} |
- |
-void ExtensionShelfModel::SortToolstrips() { |
- ExtensionPrefs::URLList urls = prefs_->GetShelfToolstripOrder(); |
- ToolstripList copy = |
- ToolstripList(toolstrips_.begin(), toolstrips_.end()); |
- toolstrips_.clear(); |
- |
- // Go through the urls and find the matching toolstrip, re-adding it to the |
- // new list in the proper order. |
- for (size_t i = 0; i < urls.size(); ++i) { |
- GURL& url = urls[i]; |
- for (iterator toolstrip = copy.begin(); |
- toolstrip != copy.end(); ++toolstrip) { |
- if (url == toolstrip->host->GetURL()) { |
- // Note that it's technically possible for the same URL to appear in |
- // multiple toolstrips, so we don't do any testing for uniqueness. |
- toolstrips_.push_back(*toolstrip); |
- |
- // Remove the toolstrip from the list so we don't have to iterate over |
- // it next time. |
- copy.erase(toolstrip); |
- break; |
- } |
- } |
- } |
- |
- // Any toolstrips remaining in |copy| were somehow missing from the prefs, |
- // so just append them to the end. |
- for (iterator toolstrip = copy.begin(); |
- toolstrip != copy.end(); ++toolstrip) { |
- toolstrips_.push_back(*toolstrip); |
- } |
- |
- FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
- ShelfModelReloaded()); |
-} |