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

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

Issue 48853005: Remove ExtensionToolbarModel from ExtensionService. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Compile after rebase Created 7 years, 1 month 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_toolbar_model.h" 5 #include "chrome/browser/extensions/extension_toolbar_model.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/prefs/pref_service.h" 9 #include "base/prefs/pref_service.h"
10 #include "chrome/browser/chrome_notification_types.h" 10 #include "chrome/browser/chrome_notification_types.h"
11 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" 11 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
12 #include "chrome/browser/extensions/extension_action.h" 12 #include "chrome/browser/extensions/extension_action.h"
13 #include "chrome/browser/extensions/extension_action_manager.h" 13 #include "chrome/browser/extensions/extension_action_manager.h"
14 #include "chrome/browser/extensions/extension_prefs.h" 14 #include "chrome/browser/extensions/extension_prefs.h"
15 #include "chrome/browser/extensions/extension_service.h" 15 #include "chrome/browser/extensions/extension_service.h"
16 #include "chrome/browser/extensions/extension_tab_util.h" 16 #include "chrome/browser/extensions/extension_tab_util.h"
17 #include "chrome/browser/extensions/extension_toolbar_model_factory.h"
17 #include "chrome/browser/extensions/extension_util.h" 18 #include "chrome/browser/extensions/extension_util.h"
18 #include "chrome/browser/extensions/tab_helper.h" 19 #include "chrome/browser/extensions/tab_helper.h"
19 #include "chrome/browser/profiles/profile.h" 20 #include "chrome/browser/profiles/profile.h"
20 #include "chrome/browser/ui/browser.h" 21 #include "chrome/browser/ui/browser.h"
21 #include "chrome/browser/ui/tabs/tab_strip_model.h" 22 #include "chrome/browser/ui/tabs/tab_strip_model.h"
22 #include "chrome/common/extensions/extension.h" 23 #include "chrome/common/extensions/extension.h"
23 #include "chrome/common/extensions/feature_switch.h" 24 #include "chrome/common/extensions/feature_switch.h"
24 #include "chrome/common/pref_names.h" 25 #include "chrome/common/pref_names.h"
25 #include "content/public/browser/notification_details.h" 26 #include "content/public/browser/notification_details.h"
26 #include "content/public/browser/notification_source.h" 27 #include "content/public/browser/notification_source.h"
(...skipping 15 matching lines...) Expand all
42 return false; 43 return false;
43 } 44 }
44 45
45 } // namespace 46 } // namespace
46 47
47 bool ExtensionToolbarModel::Observer::BrowserActionShowPopup( 48 bool ExtensionToolbarModel::Observer::BrowserActionShowPopup(
48 const extensions::Extension* extension) { 49 const extensions::Extension* extension) {
49 return false; 50 return false;
50 } 51 }
51 52
52 ExtensionToolbarModel::ExtensionToolbarModel(ExtensionService* service) 53 ExtensionToolbarModel::ExtensionToolbarModel(
53 : service_(service), 54 Profile* profile,
54 prefs_(service->profile()->GetPrefs()), 55 extensions::ExtensionPrefs* extension_prefs)
56 : profile_(profile),
57 extension_prefs_(extension_prefs),
58 prefs_(profile_->GetPrefs()),
55 extensions_initialized_(false), 59 extensions_initialized_(false),
56 weak_ptr_factory_(this) { 60 weak_ptr_factory_(this) {
57 DCHECK(service_);
58
59 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, 61 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
60 content::Source<Profile>(service_->profile())); 62 content::Source<Profile>(profile_));
61 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, 63 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
62 content::Source<Profile>(service_->profile())); 64 content::Source<Profile>(profile_));
63 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, 65 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY,
64 content::Source<Profile>(service_->profile())); 66 content::Source<Profile>(profile_));
65 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, 67 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED,
66 content::Source<Profile>(service_->profile())); 68 content::Source<Profile>(profile_));
67 registrar_.Add( 69 registrar_.Add(
68 this, chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED, 70 this, chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED,
69 content::Source<extensions::ExtensionPrefs>(service_->extension_prefs())); 71 content::Source<extensions::ExtensionPrefs>(extension_prefs_));
70 72
71 visible_icon_count_ = prefs_->GetInteger(prefs::kExtensionToolbarSize); 73 visible_icon_count_ = prefs_->GetInteger(prefs::kExtensionToolbarSize);
72 74
73 pref_change_registrar_.Init(prefs_); 75 pref_change_registrar_.Init(prefs_);
74 pref_change_callback_ = 76 pref_change_callback_ =
75 base::Bind(&ExtensionToolbarModel::OnExtensionToolbarPrefChange, 77 base::Bind(&ExtensionToolbarModel::OnExtensionToolbarPrefChange,
76 base::Unretained(this)); 78 base::Unretained(this));
77 pref_change_registrar_.Add(prefs::kExtensionToolbar, pref_change_callback_); 79 pref_change_registrar_.Add(prefs::kExtensionToolbar, pref_change_callback_);
78 } 80 }
79 81
80 ExtensionToolbarModel::~ExtensionToolbarModel() { 82 ExtensionToolbarModel::~ExtensionToolbarModel() {
81 } 83 }
82 84
85 // static
86 ExtensionToolbarModel* ExtensionToolbarModel::Get(Profile* profile) {
87 return ExtensionToolbarModelFactory::GetForProfile(profile);
88 }
89
83 void ExtensionToolbarModel::AddObserver(Observer* observer) { 90 void ExtensionToolbarModel::AddObserver(Observer* observer) {
84 observers_.AddObserver(observer); 91 observers_.AddObserver(observer);
85 } 92 }
86 93
87 void ExtensionToolbarModel::RemoveObserver(Observer* observer) { 94 void ExtensionToolbarModel::RemoveObserver(Observer* observer) {
88 observers_.RemoveObserver(observer); 95 observers_.RemoveObserver(observer);
89 } 96 }
90 97
91 void ExtensionToolbarModel::MoveBrowserAction(const Extension* extension, 98 void ExtensionToolbarModel::MoveBrowserAction(const Extension* extension,
92 int index) { 99 int index) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 const Extension* extension, 144 const Extension* extension,
138 Browser* browser, 145 Browser* browser,
139 GURL* popup_url_out, 146 GURL* popup_url_out,
140 bool should_grant) { 147 bool should_grant) {
141 content::WebContents* web_contents = NULL; 148 content::WebContents* web_contents = NULL;
142 int tab_id = 0; 149 int tab_id = 0;
143 if (!ExtensionTabUtil::GetDefaultTab(browser, &web_contents, &tab_id)) 150 if (!ExtensionTabUtil::GetDefaultTab(browser, &web_contents, &tab_id))
144 return ACTION_NONE; 151 return ACTION_NONE;
145 152
146 ExtensionAction* browser_action = 153 ExtensionAction* browser_action =
147 extensions::ExtensionActionManager::Get(service_->profile())-> 154 extensions::ExtensionActionManager::Get(profile_)->
148 GetBrowserAction(*extension); 155 GetBrowserAction(*extension);
149 156
150 // For browser actions, visibility == enabledness. 157 // For browser actions, visibility == enabledness.
151 if (!browser_action->GetIsVisible(tab_id)) 158 if (!browser_action->GetIsVisible(tab_id))
152 return ACTION_NONE; 159 return ACTION_NONE;
153 160
154 if (should_grant) { 161 if (should_grant) {
155 extensions::TabHelper::FromWebContents(web_contents)-> 162 extensions::TabHelper::FromWebContents(web_contents)->
156 active_tab_permission_granter()->GrantIfRequested(extension); 163 active_tab_permission_granter()->GrantIfRequested(extension);
157 } 164 }
(...skipping 12 matching lines...) Expand all
170 void ExtensionToolbarModel::SetVisibleIconCount(int count) { 177 void ExtensionToolbarModel::SetVisibleIconCount(int count) {
171 visible_icon_count_ = 178 visible_icon_count_ =
172 count == static_cast<int>(toolbar_items_.size()) ? -1 : count; 179 count == static_cast<int>(toolbar_items_.size()) ? -1 : count;
173 prefs_->SetInteger(prefs::kExtensionToolbarSize, visible_icon_count_); 180 prefs_->SetInteger(prefs::kExtensionToolbarSize, visible_icon_count_);
174 } 181 }
175 182
176 void ExtensionToolbarModel::Observe( 183 void ExtensionToolbarModel::Observe(
177 int type, 184 int type,
178 const content::NotificationSource& source, 185 const content::NotificationSource& source,
179 const content::NotificationDetails& details) { 186 const content::NotificationDetails& details) {
187 ExtensionService* extension_service =
188 extensions::ExtensionSystem::Get(profile_)->extension_service();
189 if (!extension_service || !extension_service->is_ready())
190 return;
191
180 if (type == chrome::NOTIFICATION_EXTENSIONS_READY) { 192 if (type == chrome::NOTIFICATION_EXTENSIONS_READY) {
181 InitializeExtensionList(); 193 InitializeExtensionList(extension_service);
182 return; 194 return;
183 } 195 }
184 196
185 if (!service_->is_ready())
186 return;
187
188 const Extension* extension = NULL; 197 const Extension* extension = NULL;
189 if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) { 198 if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) {
190 extension = content::Details<extensions::UnloadedExtensionInfo>( 199 extension = content::Details<extensions::UnloadedExtensionInfo>(
191 details)->extension; 200 details)->extension;
192 } else if (type == 201 } else if (type ==
193 chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED) { 202 chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED) {
194 extension = service_->GetExtensionById( 203 extension = extension_service->GetExtensionById(
195 *content::Details<const std::string>(details).ptr(), true); 204 *content::Details<const std::string>(details).ptr(), true);
196 } else { 205 } else {
197 extension = content::Details<const Extension>(details).ptr(); 206 extension = content::Details<const Extension>(details).ptr();
198 } 207 }
199 if (type == chrome::NOTIFICATION_EXTENSION_LOADED) { 208 if (type == chrome::NOTIFICATION_EXTENSION_LOADED) {
200 // We don't want to add the same extension twice. It may have already been 209 // We don't want to add the same extension twice. It may have already been
201 // added by EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED below, if the user 210 // added by EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED below, if the user
202 // hides the browser action and then disables and enables the extension. 211 // hides the browser action and then disables and enables the extension.
203 for (size_t i = 0; i < toolbar_items_.size(); i++) { 212 for (size_t i = 0; i < toolbar_items_.size(); i++) {
204 if (toolbar_items_[i].get() == extension) 213 if (toolbar_items_[i].get() == extension)
205 return; // Already exists. 214 return; // Already exists.
206 } 215 }
207 if (extensions::ExtensionActionAPI::GetBrowserActionVisibility( 216 if (extensions::ExtensionActionAPI::GetBrowserActionVisibility(
208 service_->extension_prefs(), extension->id())) { 217 extension_prefs_, extension->id())) {
209 AddExtension(extension); 218 AddExtension(extension);
210 } 219 }
211 } else if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) { 220 } else if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) {
212 RemoveExtension(extension); 221 RemoveExtension(extension);
213 } else if (type == chrome::NOTIFICATION_EXTENSION_UNINSTALLED) { 222 } else if (type == chrome::NOTIFICATION_EXTENSION_UNINSTALLED) {
214 UninstalledExtension(extension); 223 UninstalledExtension(extension);
215 } else if (type == 224 } else if (type ==
216 chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED) { 225 chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED) {
217 if (extensions::ExtensionActionAPI::GetBrowserActionVisibility( 226 if (extensions::ExtensionActionAPI::GetBrowserActionVisibility(
218 service_->extension_prefs(), extension->id())) { 227 extension_prefs_, extension->id())) {
219 AddExtension(extension); 228 AddExtension(extension);
220 } else { 229 } else {
221 RemoveExtension(extension); 230 RemoveExtension(extension);
222 } 231 }
223 } else { 232 } else {
224 NOTREACHED() << "Received unexpected notification"; 233 NOTREACHED() << "Received unexpected notification";
225 } 234 }
226 } 235 }
227 236
228 size_t ExtensionToolbarModel::FindNewPositionFromLastKnownGood( 237 size_t ExtensionToolbarModel::FindNewPositionFromLastKnownGood(
(...skipping 15 matching lines...) Expand all
244 break; 253 break;
245 } 254 }
246 } 255 }
247 } 256 }
248 257
249 return -1; 258 return -1;
250 } 259 }
251 260
252 void ExtensionToolbarModel::AddExtension(const Extension* extension) { 261 void ExtensionToolbarModel::AddExtension(const Extension* extension) {
253 // We only care about extensions with browser actions. 262 // We only care about extensions with browser actions.
254 if (!extensions::ExtensionActionManager::Get(service_->profile())-> 263 if (!extensions::ExtensionActionManager::Get(profile_)->
255 GetBrowserAction(*extension)) { 264 GetBrowserAction(*extension)) {
256 return; 265 return;
257 } 266 }
258 267
259 size_t new_index = -1; 268 size_t new_index = -1;
260 269
261 // See if we have a last known good position for this extension. 270 // See if we have a last known good position for this extension.
262 ExtensionIdList::iterator last_pos = std::find(last_known_positions_.begin(), 271 ExtensionIdList::iterator last_pos = std::find(last_known_positions_.begin(),
263 last_known_positions_.end(), 272 last_known_positions_.end(),
264 extension->id()); 273 extension->id());
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 } 318 }
310 } 319 }
311 320
312 // Combine the currently enabled extensions that have browser actions (which 321 // Combine the currently enabled extensions that have browser actions (which
313 // we get from the ExtensionService) with the ordering we get from the 322 // we get from the ExtensionService) with the ordering we get from the
314 // pref service. For robustness we use a somewhat inefficient process: 323 // pref service. For robustness we use a somewhat inefficient process:
315 // 1. Create a vector of extensions sorted by their pref values. This vector may 324 // 1. Create a vector of extensions sorted by their pref values. This vector may
316 // have holes. 325 // have holes.
317 // 2. Create a vector of extensions that did not have a pref value. 326 // 2. Create a vector of extensions that did not have a pref value.
318 // 3. Remove holes from the sorted vector and append the unsorted vector. 327 // 3. Remove holes from the sorted vector and append the unsorted vector.
319 void ExtensionToolbarModel::InitializeExtensionList() { 328 void ExtensionToolbarModel::InitializeExtensionList(ExtensionService* service) {
320 DCHECK(service_->is_ready()); 329 DCHECK(service->is_ready());
321 330
322 last_known_positions_ = service_->extension_prefs()->GetToolbarOrder(); 331 last_known_positions_ = extension_prefs_->GetToolbarOrder();
323 Populate(last_known_positions_); 332 Populate(last_known_positions_, service);
324 333
325 extensions_initialized_ = true; 334 extensions_initialized_ = true;
326 FOR_EACH_OBSERVER(Observer, observers_, ModelLoaded()); 335 FOR_EACH_OBSERVER(Observer, observers_, ModelLoaded());
327 } 336 }
328 337
329 void ExtensionToolbarModel::Populate( 338 void ExtensionToolbarModel::Populate(
330 const extensions::ExtensionIdList& positions) { 339 const extensions::ExtensionIdList& positions,
340 ExtensionService* service) {
331 // Items that have explicit positions. 341 // Items that have explicit positions.
332 ExtensionList sorted; 342 ExtensionList sorted;
333 sorted.resize(positions.size(), NULL); 343 sorted.resize(positions.size(), NULL);
334 // The items that don't have explicit positions. 344 // The items that don't have explicit positions.
335 ExtensionList unsorted; 345 ExtensionList unsorted;
336 346
337 extensions::ExtensionActionManager* extension_action_manager = 347 extensions::ExtensionActionManager* extension_action_manager =
338 extensions::ExtensionActionManager::Get(service_->profile()); 348 extensions::ExtensionActionManager::Get(profile_);
339 349
340 // Create the lists. 350 // Create the lists.
341 for (ExtensionSet::const_iterator it = service_->extensions()->begin(); 351 for (ExtensionSet::const_iterator it = service->extensions()->begin();
342 it != service_->extensions()->end(); ++it) { 352 it != service->extensions()->end(); ++it) {
343 const Extension* extension = it->get(); 353 const Extension* extension = it->get();
344 if (!extension_action_manager->GetBrowserAction(*extension)) 354 if (!extension_action_manager->GetBrowserAction(*extension))
345 continue; 355 continue;
346 if (!extensions::ExtensionActionAPI::GetBrowserActionVisibility( 356 if (!extensions::ExtensionActionAPI::GetBrowserActionVisibility(
347 service_->extension_prefs(), extension->id())) { 357 extension_prefs_, extension->id())) {
348 continue; 358 continue;
349 } 359 }
350 360
351 extensions::ExtensionIdList::const_iterator pos = 361 extensions::ExtensionIdList::const_iterator pos =
352 std::find(positions.begin(), positions.end(), extension->id()); 362 std::find(positions.begin(), positions.end(), extension->id());
353 if (pos != positions.end()) 363 if (pos != positions.end())
354 sorted[pos - positions.begin()] = extension; 364 sorted[pos - positions.begin()] = extension;
355 else 365 else
356 unsorted.push_back(make_scoped_refptr(extension)); 366 unsorted.push_back(make_scoped_refptr(extension));
357 } 367 }
(...skipping 21 matching lines...) Expand all
379 toolbar_items_.insert(toolbar_items_.end(), unsorted.begin(), 389 toolbar_items_.insert(toolbar_items_.end(), unsorted.begin(),
380 unsorted.end()); 390 unsorted.end());
381 391
382 // Inform observers. 392 // Inform observers.
383 for (size_t i = 0; i < toolbar_items_.size(); i++) { 393 for (size_t i = 0; i < toolbar_items_.size(); i++) {
384 FOR_EACH_OBSERVER( 394 FOR_EACH_OBSERVER(
385 Observer, observers_, BrowserActionAdded(toolbar_items_[i].get(), i)); 395 Observer, observers_, BrowserActionAdded(toolbar_items_[i].get(), i));
386 } 396 }
387 } 397 }
388 398
389 void ExtensionToolbarModel::FillExtensionList(
390 const extensions::ExtensionIdList& order) {
391 toolbar_items_.clear();
392 toolbar_items_.reserve(order.size());
393 for (size_t i = 0; i < order.size(); ++i) {
394 const extensions::Extension* extension =
395 service_->GetExtensionById(order[i], false);
396 if (extension)
397 AddExtension(extension);
398 }
399 }
400
401 void ExtensionToolbarModel::UpdatePrefs() { 399 void ExtensionToolbarModel::UpdatePrefs() {
402 if (!service_->extension_prefs()) 400 if (!extension_prefs_)
403 return; 401 return;
404 402
405 // Don't observe change caused by self. 403 // Don't observe change caused by self.
406 pref_change_registrar_.Remove(prefs::kExtensionToolbar); 404 pref_change_registrar_.Remove(prefs::kExtensionToolbar);
407 service_->extension_prefs()->SetToolbarOrder(last_known_positions_); 405 extension_prefs_->SetToolbarOrder(last_known_positions_);
408 pref_change_registrar_.Add(prefs::kExtensionToolbar, pref_change_callback_); 406 pref_change_registrar_.Add(prefs::kExtensionToolbar, pref_change_callback_);
409 } 407 }
410 408
411 int ExtensionToolbarModel::IncognitoIndexToOriginal(int incognito_index) { 409 int ExtensionToolbarModel::IncognitoIndexToOriginal(int incognito_index) {
412 int original_index = 0, i = 0; 410 int original_index = 0, i = 0;
411 ExtensionService* extension_service =
412 extensions::ExtensionSystem::Get(profile_)->extension_service();
413 for (ExtensionList::iterator iter = toolbar_items_.begin(); 413 for (ExtensionList::iterator iter = toolbar_items_.begin();
414 iter != toolbar_items_.end(); 414 iter != toolbar_items_.end();
415 ++iter, ++original_index) { 415 ++iter, ++original_index) {
416 if (extension_util::IsIncognitoEnabled((*iter)->id(), service_)) { 416 if (extension_util::IsIncognitoEnabled((*iter)->id(), extension_service)) {
417 if (incognito_index == i) 417 if (incognito_index == i)
418 break; 418 break;
419 ++i; 419 ++i;
420 } 420 }
421 } 421 }
422 return original_index; 422 return original_index;
423 } 423 }
424 424
425 int ExtensionToolbarModel::OriginalIndexToIncognito(int original_index) { 425 int ExtensionToolbarModel::OriginalIndexToIncognito(int original_index) {
426 int incognito_index = 0, i = 0; 426 int incognito_index = 0, i = 0;
427 ExtensionService* extension_service =
428 extensions::ExtensionSystem::Get(profile_)->extension_service();
427 for (ExtensionList::iterator iter = toolbar_items_.begin(); 429 for (ExtensionList::iterator iter = toolbar_items_.begin();
428 iter != toolbar_items_.end(); 430 iter != toolbar_items_.end();
429 ++iter, ++i) { 431 ++iter, ++i) {
430 if (original_index == i) 432 if (original_index == i)
431 break; 433 break;
432 if (extension_util::IsIncognitoEnabled((*iter)->id(), service_)) 434 if (extension_util::IsIncognitoEnabled((*iter)->id(), extension_service))
433 ++incognito_index; 435 ++incognito_index;
434 } 436 }
435 return incognito_index; 437 return incognito_index;
436 } 438 }
437 439
438 void ExtensionToolbarModel::OnExtensionToolbarPrefChange() { 440 void ExtensionToolbarModel::OnExtensionToolbarPrefChange() {
439 // If extensions are not ready, defer to later Populate() call. 441 // If extensions are not ready, defer to later Populate() call.
440 if (!extensions_initialized_) 442 if (!extensions_initialized_)
441 return; 443 return;
442 444
443 // Recalculate |last_known_positions_| to be |pref_positions| followed by 445 // Recalculate |last_known_positions_| to be |pref_positions| followed by
444 // ones that are only in |last_known_positions_|. 446 // ones that are only in |last_known_positions_|.
445 extensions::ExtensionIdList pref_positions = 447 extensions::ExtensionIdList pref_positions =
446 service_->extension_prefs()->GetToolbarOrder(); 448 extension_prefs_->GetToolbarOrder();
447 size_t pref_position_size = pref_positions.size(); 449 size_t pref_position_size = pref_positions.size();
448 for (size_t i = 0; i < last_known_positions_.size(); ++i) { 450 for (size_t i = 0; i < last_known_positions_.size(); ++i) {
449 if (std::find(pref_positions.begin(), pref_positions.end(), 451 if (std::find(pref_positions.begin(), pref_positions.end(),
450 last_known_positions_[i]) == pref_positions.end()) { 452 last_known_positions_[i]) == pref_positions.end()) {
451 pref_positions.push_back(last_known_positions_[i]); 453 pref_positions.push_back(last_known_positions_[i]);
452 } 454 }
453 } 455 }
454 last_known_positions_.swap(pref_positions); 456 last_known_positions_.swap(pref_positions);
455 457
456 // Re-populate. 458 // Re-populate.
457 Populate(last_known_positions_); 459 Populate(last_known_positions_,
460 extensions::ExtensionSystem::Get(profile_)->extension_service());
458 461
459 if (last_known_positions_.size() > pref_position_size) { 462 if (last_known_positions_.size() > pref_position_size) {
460 // Need to update pref because we have extra icons. But can't call 463 // Need to update pref because we have extra icons. But can't call
461 // UpdatePrefs() directly within observation closure. 464 // UpdatePrefs() directly within observation closure.
462 base::MessageLoop::current()->PostTask( 465 base::MessageLoop::current()->PostTask(
463 FROM_HERE, 466 FROM_HERE,
464 base::Bind(&ExtensionToolbarModel::UpdatePrefs, 467 base::Bind(&ExtensionToolbarModel::UpdatePrefs,
465 weak_ptr_factory_.GetWeakPtr())); 468 weak_ptr_factory_.GetWeakPtr()));
466 } 469 }
467 } 470 }
468 471
469 bool ExtensionToolbarModel::ShowBrowserActionPopup( 472 bool ExtensionToolbarModel::ShowBrowserActionPopup(
470 const extensions::Extension* extension) { 473 const extensions::Extension* extension) {
471 ObserverListBase<Observer>::Iterator it(observers_); 474 ObserverListBase<Observer>::Iterator it(observers_);
472 Observer* obs = NULL; 475 Observer* obs = NULL;
473 while ((obs = it.GetNext()) != NULL) { 476 while ((obs = it.GetNext()) != NULL) {
474 // Stop after first popup since it should only show in the active window. 477 // Stop after first popup since it should only show in the active window.
475 if (obs->BrowserActionShowPopup(extension)) 478 if (obs->BrowserActionShowPopup(extension))
476 return true; 479 return true;
477 } 480 }
478 return false; 481 return false;
479 } 482 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_toolbar_model.h ('k') | chrome/browser/extensions/extension_toolbar_model_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698