| OLD | NEW |
| 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/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/metrics/histogram_base.h" | 10 #include "base/metrics/histogram_base.h" |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 } | 368 } |
| 369 | 369 |
| 370 ExtensionIdList::const_iterator pos = | 370 ExtensionIdList::const_iterator pos = |
| 371 std::find(positions.begin(), positions.end(), extension->id()); | 371 std::find(positions.begin(), positions.end(), extension->id()); |
| 372 if (pos != positions.end()) | 372 if (pos != positions.end()) |
| 373 sorted[pos - positions.begin()] = extension; | 373 sorted[pos - positions.begin()] = extension; |
| 374 else | 374 else |
| 375 unsorted.push_back(make_scoped_refptr(extension)); | 375 unsorted.push_back(make_scoped_refptr(extension)); |
| 376 } | 376 } |
| 377 | 377 |
| 378 // Erase current icons. | 378 size_t items_count = toolbar_items_.size(); |
| 379 for (size_t i = 0; i < toolbar_items_.size(); i++) { | 379 for (size_t i = 0; i < items_count; i++) { |
| 380 const Extension* extension = toolbar_items_.back(); |
| 381 // By popping the extension here (before calling BrowserActionRemoved), |
| 382 // we will not shrink visible count by one after BrowserActionRemoved |
| 383 // calls SetVisibleCount. |
| 384 toolbar_items_.pop_back(); |
| 380 FOR_EACH_OBSERVER( | 385 FOR_EACH_OBSERVER( |
| 381 Observer, observers_, BrowserActionRemoved(toolbar_items_[i].get())); | 386 Observer, observers_, BrowserActionRemoved(extension)); |
| 382 } | 387 } |
| 383 toolbar_items_.clear(); | 388 DCHECK(toolbar_items_.empty()); |
| 384 | 389 |
| 385 // Merge the lists. | 390 // Merge the lists. |
| 386 toolbar_items_.reserve(sorted.size() + unsorted.size()); | 391 toolbar_items_.reserve(sorted.size() + unsorted.size()); |
| 392 |
| 387 for (ExtensionList::const_iterator iter = sorted.begin(); | 393 for (ExtensionList::const_iterator iter = sorted.begin(); |
| 388 iter != sorted.end(); ++iter) { | 394 iter != sorted.end(); ++iter) { |
| 389 // It's possible for the extension order to contain items that aren't | 395 // It's possible for the extension order to contain items that aren't |
| 390 // actually loaded on this machine. For example, when extension sync is on, | 396 // actually loaded on this machine. For example, when extension sync is on, |
| 391 // we sync the extension order as-is but double-check with the user before | 397 // we sync the extension order as-is but double-check with the user before |
| 392 // syncing NPAPI-containing extensions, so if one of those is not actually | 398 // syncing NPAPI-containing extensions, so if one of those is not actually |
| 393 // synced, we'll get a NULL in the list. This sort of case can also happen | 399 // synced, we'll get a NULL in the list. This sort of case can also happen |
| 394 // if some error prevents an extension from loading. | 400 // if some error prevents an extension from loading. |
| 395 if (iter->get() != NULL) | 401 if (iter->get() != NULL) { |
| 396 toolbar_items_.push_back(*iter); | 402 toolbar_items_.push_back(*iter); |
| 403 FOR_EACH_OBSERVER( |
| 404 Observer, observers_, BrowserActionAdded( |
| 405 *iter, toolbar_items_.size() - 1)); |
| 406 } |
| 397 } | 407 } |
| 398 toolbar_items_.insert(toolbar_items_.end(), unsorted.begin(), | 408 for (ExtensionList::const_iterator iter = unsorted.begin(); |
| 399 unsorted.end()); | 409 iter != unsorted.end(); ++iter) { |
| 410 if (iter->get() != NULL) { |
| 411 toolbar_items_.push_back(*iter); |
| 412 FOR_EACH_OBSERVER( |
| 413 Observer, observers_, BrowserActionAdded( |
| 414 *iter, toolbar_items_.size() - 1)); |
| 415 } |
| 416 } |
| 400 | 417 |
| 401 UMA_HISTOGRAM_COUNTS_100( | 418 UMA_HISTOGRAM_COUNTS_100( |
| 402 "ExtensionToolbarModel.BrowserActionsPermanentlyHidden", hidden); | 419 "ExtensionToolbarModel.BrowserActionsPermanentlyHidden", hidden); |
| 403 UMA_HISTOGRAM_COUNTS_100("ExtensionToolbarModel.BrowserActionsCount", | 420 UMA_HISTOGRAM_COUNTS_100("ExtensionToolbarModel.BrowserActionsCount", |
| 404 toolbar_items_.size()); | 421 toolbar_items_.size()); |
| 405 | 422 |
| 406 if (!toolbar_items_.empty()) { | 423 if (!toolbar_items_.empty()) { |
| 407 // Visible count can be -1, meaning: 'show all'. Since UMA converts negative | 424 // Visible count can be -1, meaning: 'show all'. Since UMA converts negative |
| 408 // values to 0, this would be counted as 'show none' unless we convert it to | 425 // values to 0, this would be counted as 'show none' unless we convert it to |
| 409 // max. | 426 // max. |
| 410 UMA_HISTOGRAM_COUNTS_100("ExtensionToolbarModel.BrowserActionsVisible", | 427 UMA_HISTOGRAM_COUNTS_100("ExtensionToolbarModel.BrowserActionsVisible", |
| 411 visible_icon_count_ == -1 ? | 428 visible_icon_count_ == -1 ? |
| 412 base::HistogramBase::kSampleType_MAX : | 429 base::HistogramBase::kSampleType_MAX : |
| 413 visible_icon_count_); | 430 visible_icon_count_); |
| 414 } | 431 } |
| 415 | |
| 416 // Inform observers. | |
| 417 for (size_t i = 0; i < toolbar_items_.size(); i++) { | |
| 418 FOR_EACH_OBSERVER( | |
| 419 Observer, observers_, BrowserActionAdded(toolbar_items_[i].get(), i)); | |
| 420 } | |
| 421 } | 432 } |
| 422 | 433 |
| 423 void ExtensionToolbarModel::UpdatePrefs() { | 434 void ExtensionToolbarModel::UpdatePrefs() { |
| 424 if (!extension_prefs_) | 435 if (!extension_prefs_) |
| 425 return; | 436 return; |
| 426 | 437 |
| 427 // Don't observe change caused by self. | 438 // Don't observe change caused by self. |
| 428 pref_change_registrar_.Remove(pref_names::kToolbar); | 439 pref_change_registrar_.Remove(pref_names::kToolbar); |
| 429 extension_prefs_->SetToolbarOrder(last_known_positions_); | 440 extension_prefs_->SetToolbarOrder(last_known_positions_); |
| 430 pref_change_registrar_.Add(pref_names::kToolbar, pref_change_callback_); | 441 pref_change_registrar_.Add(pref_names::kToolbar, pref_change_callback_); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 is_highlighting_ = false; | 584 is_highlighting_ = false; |
| 574 if (old_visible_icon_count_ != visible_icon_count_) { | 585 if (old_visible_icon_count_ != visible_icon_count_) { |
| 575 SetVisibleIconCount(old_visible_icon_count_); | 586 SetVisibleIconCount(old_visible_icon_count_); |
| 576 FOR_EACH_OBSERVER(Observer, observers_, VisibleCountChanged()); | 587 FOR_EACH_OBSERVER(Observer, observers_, VisibleCountChanged()); |
| 577 } | 588 } |
| 578 FOR_EACH_OBSERVER(Observer, observers_, HighlightModeChanged(false)); | 589 FOR_EACH_OBSERVER(Observer, observers_, HighlightModeChanged(false)); |
| 579 } | 590 } |
| 580 } | 591 } |
| 581 | 592 |
| 582 } // namespace extensions | 593 } // namespace extensions |
| OLD | NEW |