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 ExtensionToolstrips::iterator t; | 45 for (iterator t = toolstrips_.begin(); t != toolstrips_.end(); ++t) |
46 for (t = toolstrips_.begin(); t != toolstrips_.end(); ++t) | |
47 delete t->host; | 46 delete t->host; |
48 toolstrips_.clear(); | 47 toolstrips_.clear(); |
49 } | 48 } |
50 | 49 |
51 void ExtensionShelfModel::AddObserver(ExtensionShelfModelObserver* observer) { | 50 void ExtensionShelfModel::AddObserver(ExtensionShelfModelObserver* observer) { |
52 observers_.AddObserver(observer); | 51 observers_.AddObserver(observer); |
53 } | 52 } |
54 | 53 |
55 void ExtensionShelfModel::RemoveObserver( | 54 void ExtensionShelfModel::RemoveObserver( |
56 ExtensionShelfModelObserver* observer) { | 55 ExtensionShelfModelObserver* observer) { |
57 observers_.RemoveObserver(observer); | 56 observers_.RemoveObserver(observer); |
58 } | 57 } |
59 | 58 |
60 void ExtensionShelfModel::AppendToolstrip(const ToolstripItem& toolstrip) { | 59 void ExtensionShelfModel::AppendToolstrip(const ToolstripItem& toolstrip) { |
61 InsertToolstripAt(count(), toolstrip); | 60 InsertToolstripAt(count(), toolstrip); |
62 } | 61 } |
63 | 62 |
64 void ExtensionShelfModel::InsertToolstripAt(int index, | 63 void ExtensionShelfModel::InsertToolstripAt(int index, |
65 const ToolstripItem& toolstrip) { | 64 const ToolstripItem& toolstrip) { |
66 toolstrips_.insert(toolstrips_.begin() + index, toolstrip); | 65 toolstrips_.insert(toolstrips_.begin() + index, toolstrip); |
67 if (ready_) { | 66 if (ready_) { |
68 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, | 67 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
69 ToolstripInsertedAt(toolstrip.host, index)); | 68 ToolstripInsertedAt(toolstrip.host, index)); |
70 } | 69 } |
71 } | 70 } |
72 | 71 |
73 void ExtensionShelfModel::RemoveToolstripAt(int index) { | 72 void ExtensionShelfModel::RemoveToolstripAt(int index) { |
74 ExtensionHost* host = ToolstripAt(index); | 73 ExtensionHost* host = ToolstripAt(index).host; |
75 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, | 74 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
76 ToolstripRemovingAt(host, index)); | 75 ToolstripRemovingAt(host, index)); |
77 toolstrips_.erase(toolstrips_.begin() + index); | 76 toolstrips_.erase(toolstrips_.begin() + index); |
78 delete host; | 77 delete host; |
79 } | 78 } |
80 | 79 |
81 void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { | 80 void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { |
82 DCHECK(index >= 0); | 81 DCHECK(index >= 0); |
83 DCHECK(to_index >= 0); | 82 DCHECK(to_index >= 0); |
84 if (index == to_index) | 83 if (index == to_index) |
85 return; | 84 return; |
86 | 85 |
87 ToolstripItem toolstrip = toolstrips_[index]; | 86 ToolstripItem toolstrip = toolstrips_[index]; |
88 toolstrips_.erase(toolstrips_.begin() + index); | 87 toolstrips_.erase(toolstrips_.begin() + index); |
89 toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip); | 88 toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip); |
90 | 89 |
91 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, | 90 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
92 ToolstripMoved(toolstrip.host, index, to_index)); | 91 ToolstripMoved(toolstrip.host, index, to_index)); |
93 | 92 |
94 UpdatePrefs(); | 93 UpdatePrefs(); |
95 } | 94 } |
96 | 95 |
97 int ExtensionShelfModel::IndexOfToolstrip(ExtensionHost* toolstrip) { | 96 int ExtensionShelfModel::IndexOfHost(ExtensionHost* host) { |
98 ExtensionToolstrips::iterator i; | 97 for (iterator i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { |
99 for (i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { | 98 if (i->host == host) |
100 if (i->host == toolstrip) | |
101 return i - toolstrips_.begin(); | 99 return i - toolstrips_.begin(); |
102 } | 100 } |
103 return -1; | 101 return -1; |
104 } | 102 } |
105 | 103 |
106 ExtensionHost* ExtensionShelfModel::ToolstripAt(int index) { | 104 ExtensionShelfModel::iterator ExtensionShelfModel::ToolstripForHost( |
107 DCHECK(index >= 0); | 105 ExtensionHost* host) { |
108 return toolstrips_[index].host; | 106 for (iterator i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { |
| 107 if (i->host == host) |
| 108 return i; |
| 109 } |
| 110 return toolstrips_.end(); |
109 } | 111 } |
110 | 112 |
111 Extension::ToolstripInfo& ExtensionShelfModel::ToolstripInfoAt(int index) { | 113 const ExtensionShelfModel::ToolstripItem& ExtensionShelfModel::ToolstripAt( |
| 114 int index) { |
112 DCHECK(index >= 0); | 115 DCHECK(index >= 0); |
113 return toolstrips_[index].info; | 116 return toolstrips_[index]; |
114 } | |
115 | |
116 void* ExtensionShelfModel::ToolstripDataAt(int index) { | |
117 DCHECK(index >= 0); | |
118 return toolstrips_[index].data; | |
119 } | 117 } |
120 | 118 |
121 void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) { | 119 void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) { |
122 DCHECK(index >= 0); | 120 DCHECK(index >= 0); |
123 toolstrips_[index].data = data; | 121 toolstrips_[index].data = data; |
124 } | 122 } |
125 | 123 |
| 124 void ExtensionShelfModel::ExpandToolstrip(iterator toolstrip, const GURL& url, i
nt height) { |
| 125 (*toolstrip).height = height; |
| 126 (*toolstrip).url = url; |
| 127 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
| 128 ToolstripChanged(toolstrip)); |
| 129 } |
| 130 |
| 131 void ExtensionShelfModel::CollapseToolstrip(iterator toolstrip, const GURL& url)
{ |
| 132 (*toolstrip).height = 0; |
| 133 (*toolstrip).url = url; |
| 134 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
| 135 ToolstripChanged(toolstrip)); |
| 136 } |
| 137 |
126 void ExtensionShelfModel::Observe(NotificationType type, | 138 void ExtensionShelfModel::Observe(NotificationType type, |
127 const NotificationSource& source, | 139 const NotificationSource& source, |
128 const NotificationDetails& details) { | 140 const NotificationDetails& details) { |
129 switch (type.value) { | 141 switch (type.value) { |
130 case NotificationType::EXTENSIONS_LOADED: | 142 case NotificationType::EXTENSIONS_LOADED: |
131 if (ready_) | 143 if (ready_) |
132 AddExtensions(Details<ExtensionList>(details).ptr()); | 144 AddExtensions(Details<ExtensionList>(details).ptr()); |
133 break; | 145 break; |
134 case NotificationType::EXTENSION_UNLOADED: | 146 case NotificationType::EXTENSION_UNLOADED: |
135 RemoveExtension(Details<Extension>(details).ptr()); | 147 RemoveExtension(Details<Extension>(details).ptr()); |
(...skipping 24 matching lines...) Expand all Loading... |
160 return; | 172 return; |
161 | 173 |
162 for (std::vector<Extension::ToolstripInfo>::const_iterator toolstrip = | 174 for (std::vector<Extension::ToolstripInfo>::const_iterator toolstrip = |
163 extension->toolstrips().begin(); | 175 extension->toolstrips().begin(); |
164 toolstrip != extension->toolstrips().end(); ++toolstrip) { | 176 toolstrip != extension->toolstrips().end(); ++toolstrip) { |
165 GURL url = toolstrip->toolstrip; | 177 GURL url = toolstrip->toolstrip; |
166 ToolstripItem item; | 178 ToolstripItem item; |
167 item.host = manager->CreateView(extension, url, browser_); | 179 item.host = manager->CreateView(extension, url, browser_); |
168 item.info = *toolstrip; | 180 item.info = *toolstrip; |
169 item.data = NULL; | 181 item.data = NULL; |
| 182 item.height = 0; |
170 AppendToolstrip(item); | 183 AppendToolstrip(item); |
171 } | 184 } |
172 } | 185 } |
173 | 186 |
174 void ExtensionShelfModel::AddExtensions(const ExtensionList* extensions) { | 187 void ExtensionShelfModel::AddExtensions(const ExtensionList* extensions) { |
175 if (extensions->size()) { | 188 if (extensions->size()) { |
176 ExtensionList::const_iterator extension = extensions->begin(); | 189 ExtensionList::const_iterator extension = extensions->begin(); |
177 for (; extension != extensions->end(); ++extension) | 190 for (; extension != extensions->end(); ++extension) |
178 AddExtension(*extension); | 191 AddExtension(*extension); |
179 } | 192 } |
180 } | 193 } |
181 | 194 |
182 void ExtensionShelfModel::RemoveExtension(Extension* extension) { | 195 void ExtensionShelfModel::RemoveExtension(Extension* extension) { |
183 bool changed = false; | 196 bool changed = false; |
184 for (int i = count() - 1; i >= 0; --i) { | 197 for (int i = count() - 1; i >= 0; --i) { |
185 ExtensionHost* t = ToolstripAt(i); | 198 ExtensionHost* t = ToolstripAt(i).host; |
186 if (t->extension()->id() == extension->id()) { | 199 if (t->extension()->id() == extension->id()) { |
187 changed = true; | 200 changed = true; |
188 RemoveToolstripAt(i); | 201 RemoveToolstripAt(i); |
189 | 202 |
190 // There can be more than one toolstrip per extension, so we have to keep | 203 // There can be more than one toolstrip per extension, so we have to keep |
191 // looping even after finding a match. | 204 // looping even after finding a match. |
192 } | 205 } |
193 } | 206 } |
194 if (changed) | 207 if (changed) |
195 UpdatePrefs(); | 208 UpdatePrefs(); |
196 } | 209 } |
197 | 210 |
198 void ExtensionShelfModel::UpdatePrefs() { | 211 void ExtensionShelfModel::UpdatePrefs() { |
199 if (!prefs_) | 212 if (!prefs_) |
200 return; | 213 return; |
201 | 214 |
202 // It's easiest to just rebuild the list each time. | 215 // It's easiest to just rebuild the list each time. |
203 ExtensionPrefs::URLList urls; | 216 ExtensionPrefs::URLList urls; |
204 for (int i = 0; i < count(); ++i) | 217 for (int i = 0; i < count(); ++i) |
205 urls.push_back(ToolstripAt(i)->GetURL()); | 218 urls.push_back(ToolstripAt(i).host->GetURL()); |
206 prefs_->SetShelfToolstripOrder(urls); | 219 prefs_->SetShelfToolstripOrder(urls); |
207 | 220 |
208 NotificationService::current()->Notify( | 221 NotificationService::current()->Notify( |
209 NotificationType::EXTENSION_SHELF_MODEL_CHANGED, | 222 NotificationType::EXTENSION_SHELF_MODEL_CHANGED, |
210 Source<ExtensionPrefs>(prefs_), | 223 Source<ExtensionPrefs>(prefs_), |
211 Details<ExtensionShelfModel>(this)); | 224 Details<ExtensionShelfModel>(this)); |
212 } | 225 } |
213 | 226 |
214 void ExtensionShelfModel::SortToolstrips() { | 227 void ExtensionShelfModel::SortToolstrips() { |
215 ExtensionPrefs::URLList urls = prefs_->GetShelfToolstripOrder(); | 228 ExtensionPrefs::URLList urls = prefs_->GetShelfToolstripOrder(); |
216 ExtensionToolstrips copy = | 229 ToolstripList copy = |
217 ExtensionToolstrips(toolstrips_.begin(), toolstrips_.end()); | 230 ToolstripList(toolstrips_.begin(), toolstrips_.end()); |
218 toolstrips_.clear(); | 231 toolstrips_.clear(); |
219 | 232 |
220 // Go through the urls and find the matching toolstrip, re-adding it to the | 233 // Go through the urls and find the matching toolstrip, re-adding it to the |
221 // new list in the proper order. | 234 // new list in the proper order. |
222 for (size_t i = 0; i < urls.size(); ++i) { | 235 for (size_t i = 0; i < urls.size(); ++i) { |
223 GURL& url = urls[i]; | 236 GURL& url = urls[i]; |
224 for (ExtensionToolstrips::iterator toolstrip = copy.begin(); | 237 for (iterator toolstrip = copy.begin(); |
225 toolstrip != copy.end(); ++toolstrip) { | 238 toolstrip != copy.end(); ++toolstrip) { |
226 if (url == toolstrip->host->GetURL()) { | 239 if (url == toolstrip->host->GetURL()) { |
227 // Note that it's technically possible for the same URL to appear in | 240 // Note that it's technically possible for the same URL to appear in |
228 // multiple toolstrips, so we don't do any testing for uniqueness. | 241 // multiple toolstrips, so we don't do any testing for uniqueness. |
229 toolstrips_.push_back(*toolstrip); | 242 toolstrips_.push_back(*toolstrip); |
230 | 243 |
231 // Remove the toolstrip from the list so we don't have to iterate over | 244 // Remove the toolstrip from the list so we don't have to iterate over |
232 // it next time. | 245 // it next time. |
233 copy.erase(toolstrip); | 246 copy.erase(toolstrip); |
234 break; | 247 break; |
235 } | 248 } |
236 } | 249 } |
237 } | 250 } |
238 | 251 |
239 // Any toolstrips remaining in |copy| were somehow missing from the prefs, | 252 // Any toolstrips remaining in |copy| were somehow missing from the prefs, |
240 // so just append them to the end. | 253 // so just append them to the end. |
241 for (ExtensionToolstrips::iterator toolstrip = copy.begin(); | 254 for (iterator toolstrip = copy.begin(); |
242 toolstrip != copy.end(); ++toolstrip) { | 255 toolstrip != copy.end(); ++toolstrip) { |
243 toolstrips_.push_back(*toolstrip); | 256 toolstrips_.push_back(*toolstrip); |
244 } | 257 } |
245 | 258 |
246 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, | 259 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, |
247 ShelfModelReloaded()); | 260 ShelfModelReloaded()); |
248 } | 261 } |
OLD | NEW |