| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/extension_shelf_model.h" | 5 #include "chrome/browser/extensions/extension_shelf_model.h" |
| 6 | 6 |
| 7 #include "base/stl_util-inl.h" | 7 #include "base/stl_util-inl.h" |
| 8 #include "chrome/browser/browser.h" | 8 #include "chrome/browser/browser.h" |
| 9 #include "chrome/browser/profile.h" | 9 #include "chrome/browser/profile.h" |
| 10 #include "chrome/browser/extensions/extension_host.h" | 10 #include "chrome/browser/extensions/extension_host.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 AddExtensions(service->extensions()); | 35 AddExtensions(service->extensions()); |
| 36 SortToolstrips(); | 36 SortToolstrips(); |
| 37 } | 37 } |
| 38 } | 38 } |
| 39 } | 39 } |
| 40 | 40 |
| 41 ExtensionShelfModel::~ExtensionShelfModel() { | 41 ExtensionShelfModel::~ExtensionShelfModel() { |
| 42 while (observers_.size()) | 42 while (observers_.size()) |
| 43 observers_.RemoveObserver(observers_.GetElementAt(0)); | 43 observers_.RemoveObserver(observers_.GetElementAt(0)); |
| 44 | 44 |
| 45 STLDeleteContainerPairFirstPointers(toolstrips_.begin(), toolstrips_.end()); | 45 ExtensionToolstrips::iterator t; |
| 46 for (t = toolstrips_.begin(); t != toolstrips_.end(); ++t) |
| 47 delete t->host; |
| 46 toolstrips_.clear(); | 48 toolstrips_.clear(); |
| 47 } | 49 } |
| 48 | 50 |
| 49 void ExtensionShelfModel::AddObserver(ExtensionShelfModelObserver* observer) { | 51 void ExtensionShelfModel::AddObserver(ExtensionShelfModelObserver* observer) { |
| 50 observers_.AddObserver(observer); | 52 observers_.AddObserver(observer); |
| 51 } | 53 } |
| 52 | 54 |
| 53 void ExtensionShelfModel::RemoveObserver( | 55 void ExtensionShelfModel::RemoveObserver( |
| 54 ExtensionShelfModelObserver* observer) { | 56 ExtensionShelfModelObserver* observer) { |
| 55 observers_.RemoveObserver(observer); | 57 observers_.RemoveObserver(observer); |
| 56 } | 58 } |
| 57 | 59 |
| 58 void ExtensionShelfModel::AppendToolstrip(ExtensionHost* toolstrip) { | 60 void ExtensionShelfModel::AppendToolstrip(const ToolstripItem& toolstrip) { |
| 59 InsertToolstripAt(count(), toolstrip, NULL); | 61 InsertToolstripAt(count(), toolstrip); |
| 60 } | 62 } |
| 61 | 63 |
| 62 void ExtensionShelfModel::InsertToolstripAt(int index, | 64 void ExtensionShelfModel::InsertToolstripAt(int index, |
| 63 ExtensionHost* toolstrip, | 65 const ToolstripItem& toolstrip) { |
| 64 void* data) { | 66 toolstrips_.insert(toolstrips_.begin() + index, toolstrip); |
| 65 toolstrips_.insert(toolstrips_.begin() + index, | |
| 66 ToolstripItem(toolstrip, data)); | |
| 67 if (ready_) { | 67 if (ready_) { |
| 68 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, | 68 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
| 69 ToolstripInsertedAt(toolstrip, index)); | 69 ToolstripInsertedAt(toolstrip.host, index)); |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 | 72 |
| 73 void ExtensionShelfModel::RemoveToolstripAt(int index) { | 73 void ExtensionShelfModel::RemoveToolstripAt(int index) { |
| 74 ExtensionHost* toolstrip = ToolstripAt(index); | 74 ExtensionHost* host = ToolstripAt(index); |
| 75 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, | 75 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
| 76 ToolstripRemovingAt(toolstrip, index)); | 76 ToolstripRemovingAt(host, index)); |
| 77 toolstrips_.erase(toolstrips_.begin() + index); | 77 toolstrips_.erase(toolstrips_.begin() + index); |
| 78 delete toolstrip; | 78 delete host; |
| 79 } | 79 } |
| 80 | 80 |
| 81 void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { | 81 void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { |
| 82 DCHECK(index >= 0); | 82 DCHECK(index >= 0); |
| 83 DCHECK(to_index >= 0); | 83 DCHECK(to_index >= 0); |
| 84 if (index == to_index) | 84 if (index == to_index) |
| 85 return; | 85 return; |
| 86 | 86 |
| 87 ToolstripItem toolstrip = toolstrips_[index]; | 87 ToolstripItem toolstrip = toolstrips_[index]; |
| 88 toolstrips_.erase(toolstrips_.begin() + index); | 88 toolstrips_.erase(toolstrips_.begin() + index); |
| 89 toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip); | 89 toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip); |
| 90 | 90 |
| 91 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, | 91 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
| 92 ToolstripMoved(toolstrip.first, index, to_index)); | 92 ToolstripMoved(toolstrip.host, index, to_index)); |
| 93 | 93 |
| 94 UpdatePrefs(); | 94 UpdatePrefs(); |
| 95 } | 95 } |
| 96 | 96 |
| 97 int ExtensionShelfModel::IndexOfToolstrip(ExtensionHost* toolstrip) { | 97 int ExtensionShelfModel::IndexOfToolstrip(ExtensionHost* toolstrip) { |
| 98 ExtensionToolstrips::iterator i; | 98 ExtensionToolstrips::iterator i; |
| 99 for (i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { | 99 for (i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { |
| 100 if (i->first == toolstrip) | 100 if (i->host == toolstrip) |
| 101 return i - toolstrips_.begin(); | 101 return i - toolstrips_.begin(); |
| 102 } | 102 } |
| 103 return -1; | 103 return -1; |
| 104 } | 104 } |
| 105 | 105 |
| 106 ExtensionHost* ExtensionShelfModel::ToolstripAt(int index) { | 106 ExtensionHost* ExtensionShelfModel::ToolstripAt(int index) { |
| 107 DCHECK(index >= 0); | 107 DCHECK(index >= 0); |
| 108 return toolstrips_[index].first; | 108 return toolstrips_[index].host; |
| 109 } |
| 110 |
| 111 Extension::ToolstripInfo* ExtensionShelfModel::ToolstripInfoAt(int index) { |
| 112 DCHECK(index >= 0); |
| 113 return &(toolstrips_[index].info); |
| 109 } | 114 } |
| 110 | 115 |
| 111 void* ExtensionShelfModel::ToolstripDataAt(int index) { | 116 void* ExtensionShelfModel::ToolstripDataAt(int index) { |
| 112 DCHECK(index >= 0); | 117 DCHECK(index >= 0); |
| 113 return toolstrips_[index].second; | 118 return toolstrips_[index].data; |
| 114 } | 119 } |
| 115 | 120 |
| 116 void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) { | 121 void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) { |
| 117 DCHECK(index >= 0); | 122 DCHECK(index >= 0); |
| 118 toolstrips_[index].second = data; | 123 toolstrips_[index].data = data; |
| 119 } | 124 } |
| 120 | 125 |
| 121 void ExtensionShelfModel::Observe(NotificationType type, | 126 void ExtensionShelfModel::Observe(NotificationType type, |
| 122 const NotificationSource& source, | 127 const NotificationSource& source, |
| 123 const NotificationDetails& details) { | 128 const NotificationDetails& details) { |
| 124 switch (type.value) { | 129 switch (type.value) { |
| 125 case NotificationType::EXTENSIONS_LOADED: | 130 case NotificationType::EXTENSIONS_LOADED: |
| 126 if (ready_) | 131 if (ready_) |
| 127 AddExtensions(Details<ExtensionList>(details).ptr()); | 132 AddExtensions(Details<ExtensionList>(details).ptr()); |
| 128 break; | 133 break; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 147 } | 152 } |
| 148 } | 153 } |
| 149 | 154 |
| 150 void ExtensionShelfModel::AddExtension(Extension* extension) { | 155 void ExtensionShelfModel::AddExtension(Extension* extension) { |
| 151 ExtensionProcessManager* manager = | 156 ExtensionProcessManager* manager = |
| 152 browser_->profile()->GetExtensionProcessManager(); | 157 browser_->profile()->GetExtensionProcessManager(); |
| 153 DCHECK(manager); | 158 DCHECK(manager); |
| 154 if (!manager) | 159 if (!manager) |
| 155 return; | 160 return; |
| 156 | 161 |
| 157 for (std::vector<std::string>::const_iterator toolstrip_path = | 162 for (std::vector<Extension::ToolstripInfo>::const_iterator toolstrip = |
| 158 extension->toolstrips().begin(); | 163 extension->toolstrips().begin(); |
| 159 toolstrip_path != extension->toolstrips().end(); ++toolstrip_path) { | 164 toolstrip != extension->toolstrips().end(); ++toolstrip) { |
| 160 GURL url = extension->GetResourceURL(*toolstrip_path); | 165 GURL url = toolstrip->toolstrip; |
| 161 ExtensionHost* host = manager->CreateView(extension, url, browser_); | 166 ToolstripItem item; |
| 162 AppendToolstrip(host); | 167 item.host = manager->CreateView(extension, url, browser_); |
| 168 item.info = *toolstrip; |
| 169 item.data = NULL; |
| 170 AppendToolstrip(item); |
| 163 } | 171 } |
| 164 } | 172 } |
| 165 | 173 |
| 166 void ExtensionShelfModel::AddExtensions(const ExtensionList* extensions) { | 174 void ExtensionShelfModel::AddExtensions(const ExtensionList* extensions) { |
| 167 if (extensions->size()) { | 175 if (extensions->size()) { |
| 168 ExtensionList::const_iterator extension = extensions->begin(); | 176 ExtensionList::const_iterator extension = extensions->begin(); |
| 169 for (; extension != extensions->end(); ++extension) | 177 for (; extension != extensions->end(); ++extension) |
| 170 AddExtension(*extension); | 178 AddExtension(*extension); |
| 171 } | 179 } |
| 172 } | 180 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 208 ExtensionToolstrips copy = | 216 ExtensionToolstrips copy = |
| 209 ExtensionToolstrips(toolstrips_.begin(), toolstrips_.end()); | 217 ExtensionToolstrips(toolstrips_.begin(), toolstrips_.end()); |
| 210 toolstrips_.clear(); | 218 toolstrips_.clear(); |
| 211 | 219 |
| 212 // Go through the urls and find the matching toolstrip, re-adding it to the | 220 // Go through the urls and find the matching toolstrip, re-adding it to the |
| 213 // new list in the proper order. | 221 // new list in the proper order. |
| 214 for (size_t i = 0; i < urls.size(); ++i) { | 222 for (size_t i = 0; i < urls.size(); ++i) { |
| 215 GURL& url = urls[i]; | 223 GURL& url = urls[i]; |
| 216 for (ExtensionToolstrips::iterator toolstrip = copy.begin(); | 224 for (ExtensionToolstrips::iterator toolstrip = copy.begin(); |
| 217 toolstrip != copy.end(); ++toolstrip) { | 225 toolstrip != copy.end(); ++toolstrip) { |
| 218 if (url == (*toolstrip).first->GetURL()) { | 226 if (url == toolstrip->host->GetURL()) { |
| 219 // Note that it's technically possible for the same URL to appear in | 227 // Note that it's technically possible for the same URL to appear in |
| 220 // multiple toolstrips, so we don't do any testing for uniqueness. | 228 // multiple toolstrips, so we don't do any testing for uniqueness. |
| 221 toolstrips_.push_back(*toolstrip); | 229 toolstrips_.push_back(*toolstrip); |
| 222 | 230 |
| 223 // Remove the toolstrip from the list so we don't have to iterate over | 231 // Remove the toolstrip from the list so we don't have to iterate over |
| 224 // it next time. | 232 // it next time. |
| 225 copy.erase(toolstrip); | 233 copy.erase(toolstrip); |
| 226 break; | 234 break; |
| 227 } | 235 } |
| 228 } | 236 } |
| 229 } | 237 } |
| 230 | 238 |
| 231 // Any toolstrips remaining in |copy| were somehow missing from the prefs, | 239 // Any toolstrips remaining in |copy| were somehow missing from the prefs, |
| 232 // so just append them to the end. | 240 // so just append them to the end. |
| 233 for (ExtensionToolstrips::iterator toolstrip = copy.begin(); | 241 for (ExtensionToolstrips::iterator toolstrip = copy.begin(); |
| 234 toolstrip != copy.end(); ++toolstrip) { | 242 toolstrip != copy.end(); ++toolstrip) { |
| 235 toolstrips_.push_back(*toolstrip); | 243 toolstrips_.push_back(*toolstrip); |
| 236 } | 244 } |
| 237 | 245 |
| 238 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, | 246 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
| 239 ShelfModelReloaded()); | 247 ShelfModelReloaded()); |
| 240 } | 248 } |
| OLD | NEW |