Index: chrome/browser/views/toolbar_view.cc |
=================================================================== |
--- chrome/browser/views/toolbar_view.cc (revision 65039) |
+++ chrome/browser/views/toolbar_view.cc (working copy) |
@@ -41,6 +41,10 @@ |
#endif |
#include "chrome/browser/views/wrench_menu.h" |
+#if defined(OS_WIN) |
+#include "chrome/browser/enumerate_modules_model_win.h" |
+#endif |
+ |
// The space between items is 4 px in general. |
const int ToolbarView::kStandardSpacing = 4; |
// The top of the toolbar has an edge we have to skip over in addition to the 4 |
@@ -102,6 +106,8 @@ |
registrar_.Add(this, NotificationType::UPGRADE_RECOMMENDED, |
NotificationService::AllSources()); |
} |
+ registrar_.Add(this, NotificationType::MODULE_INCOMPATIBILITY_DETECTED, |
+ NotificationService::AllSources()); |
} |
ToolbarView::~ToolbarView() { |
@@ -175,8 +181,8 @@ |
app_menu_->SetID(VIEW_ID_APP_MENU); |
// Catch the case where the window is created after we detect a new version. |
- if (IsUpgradeRecommended()) |
- ShowUpgradeReminder(); |
+ if (IsUpgradeRecommended() || ShouldShowIncompatibilityWarning()) |
+ ShowNotificationDot(); |
LoadImages(); |
@@ -317,8 +323,8 @@ |
return; |
destroyed_flag_ = NULL; |
- // Stop pulsating the upgrade reminder on the app menu, if active. |
- upgrade_reminder_pulse_timer_.Stop(); |
+ // Stop pulsating the notification dot on the app menu (if active). |
+ notification_dot_pulse_timer_.Stop(); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -401,7 +407,11 @@ |
SchedulePaint(); |
} |
} else if (type == NotificationType::UPGRADE_RECOMMENDED) { |
- ShowUpgradeReminder(); |
+ ShowNotificationDot(); |
+ } else if (type == NotificationType::MODULE_INCOMPATIBILITY_DETECTED) { |
+ bool confirmed_bad = *Details<bool>(details).ptr(); |
+ if (confirmed_bad) |
+ ShowNotificationDot(); |
} |
} |
@@ -580,6 +590,15 @@ |
#endif |
} |
+bool ToolbarView::ShouldShowIncompatibilityWarning() { |
+#if defined(OS_WIN) |
+ EnumerateModulesModel* loaded_modules = EnumerateModulesModel::GetSingleton(); |
+ return loaded_modules->confirmed_bad_modules_detected() > 0; |
+#else |
+ return false; |
+#endif |
+} |
+ |
int ToolbarView::PopupTopSpacing() const { |
return GetWindow()->GetNonClientView()->UseNativeFrame() ? |
0 : kPopupTopSpacingNonGlass; |
@@ -629,20 +648,21 @@ |
app_menu_->SetPushedIcon(GetAppMenuIcon(views::CustomButton::BS_PUSHED)); |
} |
-void ToolbarView::ShowUpgradeReminder() { |
- update_reminder_animation_.reset(new SlideAnimation(this)); |
- update_reminder_animation_->SetSlideDuration(kPulseDuration); |
+void ToolbarView::ShowNotificationDot() { |
+ notification_dot_animation_.reset(new SlideAnimation(this)); |
+ notification_dot_animation_->SetSlideDuration(kPulseDuration); |
// Then start the recurring timer for pulsating it. |
- upgrade_reminder_pulse_timer_.Start( |
+ notification_dot_pulse_timer_.Stop(); |
+ notification_dot_pulse_timer_.Start( |
base::TimeDelta::FromMilliseconds(kPulsateEveryMs), |
- this, &ToolbarView::PulsateUpgradeNotifier); |
+ this, &ToolbarView::PulsateNotificationDot); |
} |
-void ToolbarView::PulsateUpgradeNotifier() { |
+void ToolbarView::PulsateNotificationDot() { |
// Start the pulsating animation. |
- update_reminder_animation_->Reset(0.0); |
- update_reminder_animation_->Show(); |
+ notification_dot_animation_->Reset(0.0); |
+ notification_dot_animation_->Show(); |
} |
SkBitmap ToolbarView::GetAppMenuIcon(views::CustomButton::ButtonState state) { |
@@ -657,7 +677,8 @@ |
} |
SkBitmap icon = *tp->GetBitmapNamed(id); |
- if (!IsUpgradeRecommended()) |
+ bool add_badge = IsUpgradeRecommended() || ShouldShowIncompatibilityWarning(); |
+ if (!add_badge) |
return icon; |
// Draw the chrome app menu icon onto the canvas. |
@@ -668,27 +689,48 @@ |
SkBitmap badge; |
static bool has_faded_in = false; |
if (!has_faded_in) { |
- SkBitmap* dot = tp->GetBitmapNamed(IDR_UPGRADE_DOT_INACTIVE); |
+ SkBitmap* dot = NULL; |
+ if (ShouldShowIncompatibilityWarning()) { |
+#if defined(OS_WIN) |
+ dot = tp->GetBitmapNamed(IDR_INCOMPATIBILITY_DOT_INACTIVE); |
+#else |
+ NOTREACHED(); |
+#endif |
+ } else { |
+ dot = tp->GetBitmapNamed(IDR_UPGRADE_DOT_INACTIVE); |
+ } |
SkBitmap transparent; |
transparent.setConfig(dot->getConfig(), dot->width(), dot->height()); |
transparent.allocPixels(); |
transparent.eraseARGB(0, 0, 0, 0); |
badge = SkBitmapOperations::CreateBlendedBitmap( |
- *dot, transparent, 1.0 - update_reminder_animation_->GetCurrentValue()); |
- if (update_reminder_animation_->GetCurrentValue() == 1.0) |
+ *dot, transparent, |
+ 1.0 - notification_dot_animation_->GetCurrentValue()); |
+ if (notification_dot_animation_->GetCurrentValue() == 1.0) |
has_faded_in = true; |
} else { |
// Convert animation values that start from 0.0 and incrementally go |
// up to 1.0 into values that start in 0.0, go to 1.0 and then back |
// to 0.0 (to create a pulsing effect). |
double value = |
- 1.0 - abs(2.0 * update_reminder_animation_->GetCurrentValue() - 1.0); |
+ 1.0 - abs(2.0 * notification_dot_animation_->GetCurrentValue() - 1.0); |
// Add the badge to it. |
- badge = SkBitmapOperations::CreateBlendedBitmap( |
- *tp->GetBitmapNamed(IDR_UPGRADE_DOT_INACTIVE), |
- *tp->GetBitmapNamed(IDR_UPGRADE_DOT_ACTIVE), |
- value); |
+ if (ShouldShowIncompatibilityWarning()) { |
+#if defined(OS_WIN) |
+ badge = SkBitmapOperations::CreateBlendedBitmap( |
+ *tp->GetBitmapNamed(IDR_INCOMPATIBILITY_DOT_INACTIVE), |
+ *tp->GetBitmapNamed(IDR_INCOMPATIBILITY_DOT_ACTIVE), |
+ value); |
+#else |
+ NOTREACHED(); |
+#endif |
+ } else { |
+ badge = SkBitmapOperations::CreateBlendedBitmap( |
+ *tp->GetBitmapNamed(IDR_UPGRADE_DOT_INACTIVE), |
+ *tp->GetBitmapNamed(IDR_UPGRADE_DOT_ACTIVE), |
+ value); |
+ } |
} |
static const int kBadgeLeftSpacing = 8; |