Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: chrome/browser/extensions/extension_shelf_model.cc

Issue 159763: Rolling back change 22245. (Closed) Base URL: svn://chrome-svn.corp.google.com/chrome/trunk/src/
Patch Set: Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 21 matching lines...) Expand all
32 Source<ExtensionPrefs>(prefs_)); 32 Source<ExtensionPrefs>(prefs_));
33 ready_ = service->is_ready(); 33 ready_ = service->is_ready();
34 if (ready_) { 34 if (ready_) {
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 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
43 ShelfModelDeleting());
44
45 while (observers_.size()) 42 while (observers_.size())
46 observers_.RemoveObserver(observers_.GetElementAt(0)); 43 observers_.RemoveObserver(observers_.GetElementAt(0));
47 44
48 for (iterator t = toolstrips_.begin(); t != toolstrips_.end(); ++t) 45 ExtensionToolstrips::iterator t;
46 for (t = toolstrips_.begin(); t != toolstrips_.end(); ++t)
49 delete t->host; 47 delete t->host;
50 toolstrips_.clear(); 48 toolstrips_.clear();
51 } 49 }
52 50
53 void ExtensionShelfModel::AddObserver(ExtensionShelfModelObserver* observer) { 51 void ExtensionShelfModel::AddObserver(ExtensionShelfModelObserver* observer) {
54 observers_.AddObserver(observer); 52 observers_.AddObserver(observer);
55 } 53 }
56 54
57 void ExtensionShelfModel::RemoveObserver( 55 void ExtensionShelfModel::RemoveObserver(
58 ExtensionShelfModelObserver* observer) { 56 ExtensionShelfModelObserver* observer) {
59 observers_.RemoveObserver(observer); 57 observers_.RemoveObserver(observer);
60 } 58 }
61 59
62 void ExtensionShelfModel::AppendToolstrip(const ToolstripItem& toolstrip) { 60 void ExtensionShelfModel::AppendToolstrip(const ToolstripItem& toolstrip) {
63 InsertToolstripAt(count(), toolstrip); 61 InsertToolstripAt(count(), toolstrip);
64 } 62 }
65 63
66 void ExtensionShelfModel::InsertToolstripAt(int index, 64 void ExtensionShelfModel::InsertToolstripAt(int index,
67 const ToolstripItem& toolstrip) { 65 const ToolstripItem& toolstrip) {
68 toolstrips_.insert(toolstrips_.begin() + index, toolstrip); 66 toolstrips_.insert(toolstrips_.begin() + index, toolstrip);
69 if (ready_) { 67 if (ready_) {
70 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, 68 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
71 ToolstripInsertedAt(toolstrip.host, index)); 69 ToolstripInsertedAt(toolstrip.host, index));
72 } 70 }
73 } 71 }
74 72
75 void ExtensionShelfModel::RemoveToolstripAt(int index) { 73 void ExtensionShelfModel::RemoveToolstripAt(int index) {
76 ExtensionHost* host = ToolstripAt(index).host; 74 ExtensionHost* host = ToolstripAt(index);
77 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, 75 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
78 ToolstripRemovingAt(host, index)); 76 ToolstripRemovingAt(host, index));
79 toolstrips_.erase(toolstrips_.begin() + index); 77 toolstrips_.erase(toolstrips_.begin() + index);
80 delete host; 78 delete host;
81 } 79 }
82 80
83 void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) { 81 void ExtensionShelfModel::MoveToolstripAt(int index, int to_index) {
84 DCHECK(index >= 0); 82 DCHECK(index >= 0);
85 DCHECK(to_index >= 0); 83 DCHECK(to_index >= 0);
86 if (index == to_index) 84 if (index == to_index)
87 return; 85 return;
88 86
89 ToolstripItem toolstrip = toolstrips_[index]; 87 ToolstripItem toolstrip = toolstrips_[index];
90 toolstrips_.erase(toolstrips_.begin() + index); 88 toolstrips_.erase(toolstrips_.begin() + index);
91 toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip); 89 toolstrips_.insert(toolstrips_.begin() + to_index, toolstrip);
92 90
93 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, 91 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
94 ToolstripMoved(toolstrip.host, index, to_index)); 92 ToolstripMoved(toolstrip.host, index, to_index));
95 93
96 UpdatePrefs(); 94 UpdatePrefs();
97 } 95 }
98 96
99 int ExtensionShelfModel::IndexOfHost(ExtensionHost* host) { 97 int ExtensionShelfModel::IndexOfToolstrip(ExtensionHost* toolstrip) {
100 for (iterator i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { 98 ExtensionToolstrips::iterator i;
101 if (i->host == host) 99 for (i = toolstrips_.begin(); i != toolstrips_.end(); ++i) {
100 if (i->host == toolstrip)
102 return i - toolstrips_.begin(); 101 return i - toolstrips_.begin();
103 } 102 }
104 return -1; 103 return -1;
105 } 104 }
106 105
107 ExtensionShelfModel::iterator ExtensionShelfModel::ToolstripForHost( 106 ExtensionHost* ExtensionShelfModel::ToolstripAt(int index) {
108 ExtensionHost* host) { 107 DCHECK(index >= 0);
109 for (iterator i = toolstrips_.begin(); i != toolstrips_.end(); ++i) { 108 return toolstrips_[index].host;
110 if (i->host == host)
111 return i;
112 }
113 return toolstrips_.end();
114 } 109 }
115 110
116 const ExtensionShelfModel::ToolstripItem& ExtensionShelfModel::ToolstripAt( 111 Extension::ToolstripInfo& ExtensionShelfModel::ToolstripInfoAt(int index) {
117 int index) {
118 DCHECK(index >= 0); 112 DCHECK(index >= 0);
119 return toolstrips_[index]; 113 return toolstrips_[index].info;
114 }
115
116 void* ExtensionShelfModel::ToolstripDataAt(int index) {
117 DCHECK(index >= 0);
118 return toolstrips_[index].data;
120 } 119 }
121 120
122 void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) { 121 void ExtensionShelfModel::SetToolstripDataAt(int index, void* data) {
123 DCHECK(index >= 0); 122 DCHECK(index >= 0);
124 toolstrips_[index].data = data; 123 toolstrips_[index].data = data;
125 } 124 }
126 125
127 void ExtensionShelfModel::ExpandToolstrip(iterator toolstrip,
128 const GURL& url, int height) {
129 if (toolstrip == end())
130 return;
131 toolstrip->height = height;
132 toolstrip->url = url;
133 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
134 ToolstripChanged(toolstrip));
135 }
136
137 void ExtensionShelfModel::CollapseToolstrip(iterator toolstrip,
138 const GURL& url) {
139 if (toolstrip == end())
140 return;
141 toolstrip->height = 0;
142 toolstrip->url = url;
143 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
144 ToolstripChanged(toolstrip));
145 }
146
147 void ExtensionShelfModel::Observe(NotificationType type, 126 void ExtensionShelfModel::Observe(NotificationType type,
148 const NotificationSource& source, 127 const NotificationSource& source,
149 const NotificationDetails& details) { 128 const NotificationDetails& details) {
150 switch (type.value) { 129 switch (type.value) {
151 case NotificationType::EXTENSIONS_LOADED: 130 case NotificationType::EXTENSIONS_LOADED:
152 if (ready_) 131 if (ready_)
153 AddExtensions(Details<ExtensionList>(details).ptr()); 132 AddExtensions(Details<ExtensionList>(details).ptr());
154 break; 133 break;
155 case NotificationType::EXTENSION_UNLOADED: 134 case NotificationType::EXTENSION_UNLOADED:
156 RemoveExtension(Details<Extension>(details).ptr()); 135 RemoveExtension(Details<Extension>(details).ptr());
157 break; 136 break;
158 case NotificationType::EXTENSIONS_READY: 137 case NotificationType::EXTENSIONS_READY:
159 if (browser_->profile()->GetExtensionsService()) { 138 if (browser_->profile()->GetExtensionsService()) {
160 AddExtensions( 139 AddExtensions(browser_->profile()->GetExtensionsService()->extensions()) ;
161 browser_->profile()->GetExtensionsService()->extensions());
162 SortToolstrips(); 140 SortToolstrips();
163 } 141 }
164 ready_ = true; 142 ready_ = true;
165 break; 143 break;
166 case NotificationType::EXTENSION_SHELF_MODEL_CHANGED: 144 case NotificationType::EXTENSION_SHELF_MODEL_CHANGED:
167 // Ignore changes that this model originated. 145 // Ignore changes that this model originated.
168 if (Details<ExtensionShelfModel>(details).ptr() != this) 146 if (Details<ExtensionShelfModel>(details).ptr() != this)
169 SortToolstrips(); 147 SortToolstrips();
170 break; 148 break;
171 default: 149 default:
(...skipping 10 matching lines...) Expand all
182 return; 160 return;
183 161
184 for (std::vector<Extension::ToolstripInfo>::const_iterator toolstrip = 162 for (std::vector<Extension::ToolstripInfo>::const_iterator toolstrip =
185 extension->toolstrips().begin(); 163 extension->toolstrips().begin();
186 toolstrip != extension->toolstrips().end(); ++toolstrip) { 164 toolstrip != extension->toolstrips().end(); ++toolstrip) {
187 GURL url = toolstrip->toolstrip; 165 GURL url = toolstrip->toolstrip;
188 ToolstripItem item; 166 ToolstripItem item;
189 item.host = manager->CreateView(extension, url, browser_); 167 item.host = manager->CreateView(extension, url, browser_);
190 item.info = *toolstrip; 168 item.info = *toolstrip;
191 item.data = NULL; 169 item.data = NULL;
192 item.height = 0;
193 AppendToolstrip(item); 170 AppendToolstrip(item);
194 } 171 }
195 } 172 }
196 173
197 void ExtensionShelfModel::AddExtensions(const ExtensionList* extensions) { 174 void ExtensionShelfModel::AddExtensions(const ExtensionList* extensions) {
198 if (extensions->size()) { 175 if (extensions->size()) {
199 ExtensionList::const_iterator extension = extensions->begin(); 176 ExtensionList::const_iterator extension = extensions->begin();
200 for (; extension != extensions->end(); ++extension) 177 for (; extension != extensions->end(); ++extension)
201 AddExtension(*extension); 178 AddExtension(*extension);
202 } 179 }
203 } 180 }
204 181
205 void ExtensionShelfModel::RemoveExtension(Extension* extension) { 182 void ExtensionShelfModel::RemoveExtension(Extension* extension) {
206 bool changed = false; 183 bool changed = false;
207 for (int i = count() - 1; i >= 0; --i) { 184 for (int i = count() - 1; i >= 0; --i) {
208 ExtensionHost* t = ToolstripAt(i).host; 185 ExtensionHost* t = ToolstripAt(i);
209 if (t->extension()->id() == extension->id()) { 186 if (t->extension()->id() == extension->id()) {
210 changed = true; 187 changed = true;
211 RemoveToolstripAt(i); 188 RemoveToolstripAt(i);
212 189
213 // There can be more than one toolstrip per extension, so we have to keep 190 // There can be more than one toolstrip per extension, so we have to keep
214 // looping even after finding a match. 191 // looping even after finding a match.
215 } 192 }
216 } 193 }
217 if (changed) 194 if (changed)
218 UpdatePrefs(); 195 UpdatePrefs();
219 } 196 }
220 197
221 void ExtensionShelfModel::UpdatePrefs() { 198 void ExtensionShelfModel::UpdatePrefs() {
222 if (!prefs_) 199 if (!prefs_)
223 return; 200 return;
224 201
225 // It's easiest to just rebuild the list each time. 202 // It's easiest to just rebuild the list each time.
226 ExtensionPrefs::URLList urls; 203 ExtensionPrefs::URLList urls;
227 for (int i = 0; i < count(); ++i) 204 for (int i = 0; i < count(); ++i)
228 urls.push_back(ToolstripAt(i).host->GetURL()); 205 urls.push_back(ToolstripAt(i)->GetURL());
229 prefs_->SetShelfToolstripOrder(urls); 206 prefs_->SetShelfToolstripOrder(urls);
230 207
231 NotificationService::current()->Notify( 208 NotificationService::current()->Notify(
232 NotificationType::EXTENSION_SHELF_MODEL_CHANGED, 209 NotificationType::EXTENSION_SHELF_MODEL_CHANGED,
233 Source<ExtensionPrefs>(prefs_), 210 Source<ExtensionPrefs>(prefs_),
234 Details<ExtensionShelfModel>(this)); 211 Details<ExtensionShelfModel>(this));
235 } 212 }
236 213
237 void ExtensionShelfModel::SortToolstrips() { 214 void ExtensionShelfModel::SortToolstrips() {
238 ExtensionPrefs::URLList urls = prefs_->GetShelfToolstripOrder(); 215 ExtensionPrefs::URLList urls = prefs_->GetShelfToolstripOrder();
239 ToolstripList copy = 216 ExtensionToolstrips copy =
240 ToolstripList(toolstrips_.begin(), toolstrips_.end()); 217 ExtensionToolstrips(toolstrips_.begin(), toolstrips_.end());
241 toolstrips_.clear(); 218 toolstrips_.clear();
242 219
243 // 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
244 // new list in the proper order. 221 // new list in the proper order.
245 for (size_t i = 0; i < urls.size(); ++i) { 222 for (size_t i = 0; i < urls.size(); ++i) {
246 GURL& url = urls[i]; 223 GURL& url = urls[i];
247 for (iterator toolstrip = copy.begin(); 224 for (ExtensionToolstrips::iterator toolstrip = copy.begin();
248 toolstrip != copy.end(); ++toolstrip) { 225 toolstrip != copy.end(); ++toolstrip) {
249 if (url == toolstrip->host->GetURL()) { 226 if (url == toolstrip->host->GetURL()) {
250 // 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
251 // multiple toolstrips, so we don't do any testing for uniqueness. 228 // multiple toolstrips, so we don't do any testing for uniqueness.
252 toolstrips_.push_back(*toolstrip); 229 toolstrips_.push_back(*toolstrip);
253 230
254 // 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
255 // it next time. 232 // it next time.
256 copy.erase(toolstrip); 233 copy.erase(toolstrip);
257 break; 234 break;
258 } 235 }
259 } 236 }
260 } 237 }
261 238
262 // Any toolstrips remaining in |copy| were somehow missing from the prefs, 239 // Any toolstrips remaining in |copy| were somehow missing from the prefs,
263 // so just append them to the end. 240 // so just append them to the end.
264 for (iterator toolstrip = copy.begin(); 241 for (ExtensionToolstrips::iterator toolstrip = copy.begin();
265 toolstrip != copy.end(); ++toolstrip) { 242 toolstrip != copy.end(); ++toolstrip) {
266 toolstrips_.push_back(*toolstrip); 243 toolstrips_.push_back(*toolstrip);
267 } 244 }
268 245
269 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_, 246 FOR_EACH_OBSERVER(ExtensionShelfModelObserver, observers_,
270 ShelfModelReloaded()); 247 ShelfModelReloaded());
271 } 248 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_shelf_model.h ('k') | chrome/browser/extensions/extension_shelf_model_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698