Index: chrome/browser/ui/views/outdated_upgrade_bubble_view.cc |
diff --git a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc |
index 5c741b9040d4f3f6eea2abf3f81a77bb92cd88d5..fcb1ebb162241af85ccf64be749a00a8525e2fbc 100644 |
--- a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc |
+++ b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc |
@@ -4,8 +4,16 @@ |
#include "chrome/browser/ui/views/outdated_upgrade_bubble_view.h" |
+#if defined(OS_WIN) |
+#include <shellapi.h> |
+#endif |
+ |
#include "base/metrics/histogram.h" |
+#include "base/path_service.h" |
+#include "base/prefs/pref_service.h" |
+#include "chrome/browser/browser_process.h" |
#include "chrome/browser/upgrade_detector.h" |
+#include "chrome/common/pref_names.h" |
#include "content/public/browser/page_navigator.h" |
#include "content/public/browser/user_metrics.h" |
#include "grit/chromium_strings.h" |
@@ -21,6 +29,13 @@ |
#include "ui/views/widget/widget.h" |
#include "url/gurl.h" |
+#if defined(OS_WIN) |
+#include "base/win/win_util.h" |
+#include "base/win/windows_version.h" |
+#include "chrome/installer/util/install_util.h" |
+#include "ui/gfx/icon_util.h" |
+#endif |
+ |
using views::GridLayout; |
namespace { |
@@ -44,6 +59,41 @@ const int kMaxIgnored = 50; |
// The number of buckets we want the NumLaterPerReinstall histogram to use. |
const int kNumIgnoredBuckets = 5; |
+// Adds an elevation icon to |button| when running a system level install. |
+void AddElevationIconIfNeeded(views::LabelButton* button) { |
+#if defined(OS_WIN) |
+ if ((base::win::GetVersion() >= base::win::VERSION_VISTA) && |
+ base::win::UserAccountControlIsEnabled()) { |
+ base::FilePath exe_path; |
+ PathService::Get(base::FILE_EXE, &exe_path); |
+ if (InstallUtil::IsPerUserInstall(exe_path.value().c_str())) |
+ return; |
+ |
+ // This code was lifted from chrome/browser/ui/views/infobars/infobar_view. |
+ // TODO(mad): Investigate the possibility of moving it to a common place. |
+ SHSTOCKICONINFO icon_info = { sizeof(SHSTOCKICONINFO) }; |
+ // Even with the runtime guard above, we have to use GetProcAddress() here, |
+ // because otherwise the loader will try to resolve the function address on |
+ // startup, which will break on XP. |
+ typedef HRESULT (STDAPICALLTYPE *GetStockIconInfo)(SHSTOCKICONID, UINT, |
+ SHSTOCKICONINFO*); |
+ GetStockIconInfo func = reinterpret_cast<GetStockIconInfo>( |
+ GetProcAddress(GetModuleHandle(L"shell32.dll"), "SHGetStockIconInfo")); |
+ if (SUCCEEDED((*func)(SIID_SHIELD, SHGSI_ICON | SHGSI_SMALLICON, |
+ &icon_info))) { |
+ scoped_ptr<SkBitmap> icon(IconUtil::CreateSkBitmapFromHICON( |
+ icon_info.hIcon, gfx::Size(GetSystemMetrics(SM_CXSMICON), |
+ GetSystemMetrics(SM_CYSMICON)))); |
+ if (icon.get()) { |
+ button->SetImage(views::Button::STATE_NORMAL, |
+ gfx::ImageSkia::CreateFrom1xBitmap(*icon)); |
+ } |
+ DestroyIcon(icon_info.hIcon); |
+ } |
+ } |
+#endif |
+} |
+ |
} // namespace |
// OutdatedUpgradeBubbleView --------------------------------------------------- |
@@ -53,13 +103,16 @@ int OutdatedUpgradeBubbleView::num_ignored_bubbles_ = 0; |
// static |
void OutdatedUpgradeBubbleView::ShowBubble(views::View* anchor_view, |
- content::PageNavigator* navigator) { |
+ content::PageNavigator* navigator, |
+ bool auto_update_enabled) { |
if (IsShowing()) |
return; |
- upgrade_bubble_ = new OutdatedUpgradeBubbleView(anchor_view, navigator); |
+ upgrade_bubble_ = new OutdatedUpgradeBubbleView( |
+ anchor_view, navigator, auto_update_enabled); |
views::BubbleDelegateView::CreateBubble(upgrade_bubble_)->Show(); |
- content::RecordAction( |
- base::UserMetricsAction("OutdatedUpgradeBubble.Show")); |
+ content::RecordAction(base::UserMetricsAction( |
+ auto_update_enabled ? "OutdatedUpgradeBubble.Show" |
+ : "OutdatedUpgradeBubble.ShowNoAU")); |
} |
bool OutdatedUpgradeBubbleView::IsAvailable() { |
@@ -73,12 +126,12 @@ bool OutdatedUpgradeBubbleView::IsAvailable() { |
} |
OutdatedUpgradeBubbleView::~OutdatedUpgradeBubbleView() { |
- if (!chose_to_reinstall_ && num_ignored_bubbles_ < kMaxIgnored) |
+ if (!accepted_ && num_ignored_bubbles_ < kMaxIgnored) |
++num_ignored_bubbles_; |
} |
views::View* OutdatedUpgradeBubbleView::GetInitiallyFocusedView() { |
- return reinstall_button_; |
+ return accept_button_; |
} |
void OutdatedUpgradeBubbleView::WindowClosing() { |
@@ -90,26 +143,27 @@ void OutdatedUpgradeBubbleView::WindowClosing() { |
} |
void OutdatedUpgradeBubbleView::Init() { |
- base::string16 product_name( |
- l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)); |
ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
- reinstall_button_ = new views::LabelButton( |
- this, l10n_util::GetStringFUTF16(IDS_REINSTALL_APP, product_name)); |
- reinstall_button_->SetStyle(views::Button::STYLE_BUTTON); |
- reinstall_button_->SetIsDefault(true); |
- reinstall_button_->SetFontList(rb.GetFontList(ui::ResourceBundle::BoldFont)); |
+ accept_button_ = new views::LabelButton( |
+ this, l10n_util::GetStringUTF16( |
+ auto_update_enabled_ ? IDS_REINSTALL_APP : IDS_REENABLE_UPDATES)); |
+ accept_button_->SetStyle(views::Button::STYLE_BUTTON); |
+ accept_button_->SetIsDefault(true); |
+ accept_button_->SetFontList(rb.GetFontList(ui::ResourceBundle::BoldFont)); |
+ AddElevationIconIfNeeded(accept_button_); |
later_button_ = new views::LabelButton( |
this, l10n_util::GetStringUTF16(IDS_LATER)); |
later_button_->SetStyle(views::Button::STYLE_BUTTON); |
views::Label* title_label = new views::Label( |
- l10n_util::GetStringFUTF16(IDS_UPGRADE_BUBBLE_TITLE, product_name)); |
+ l10n_util::GetStringUTF16(IDS_UPGRADE_BUBBLE_TITLE)); |
title_label->SetFontList(rb.GetFontList(ui::ResourceBundle::MediumFont)); |
title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
- views::Label* text_label = new views::Label( |
- l10n_util::GetStringFUTF16(IDS_UPGRADE_BUBBLE_TEXT, product_name)); |
+ views::Label* text_label = new views::Label(l10n_util::GetStringUTF16( |
+ auto_update_enabled_ ? IDS_UPGRADE_BUBBLE_TEXT |
+ : IDS_UPGRADE_BUBBLE_REENABLE_TEXT)); |
text_label->SetMultiLine(true); |
text_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
@@ -157,17 +211,20 @@ void OutdatedUpgradeBubbleView::Init() { |
layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); |
layout->StartRow(0, kButtonsColumnSetId); |
- layout->AddView(reinstall_button_); |
+ layout->AddView(accept_button_); |
layout->AddView(later_button_); |
AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE)); |
} |
OutdatedUpgradeBubbleView::OutdatedUpgradeBubbleView( |
- views::View* anchor_view, content::PageNavigator* navigator) |
+ views::View* anchor_view, |
+ content::PageNavigator* navigator, |
+ bool auto_update_enabled) |
: BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT), |
- chose_to_reinstall_(false), |
- reinstall_button_(NULL), |
+ auto_update_enabled_(auto_update_enabled), |
+ accepted_(false), |
+ accept_button_(NULL), |
later_button_(NULL), |
navigator_(navigator) { |
// Compensate for built-in vertical padding in the anchor view's image. |
@@ -184,19 +241,34 @@ void OutdatedUpgradeBubbleView::ButtonPressed( |
} |
void OutdatedUpgradeBubbleView::HandleButtonPressed(views::Button* sender) { |
- if (sender == reinstall_button_) { |
- DCHECK(UpgradeDetector::GetInstance()->is_outdated_install()); |
- chose_to_reinstall_ = true; |
- UMA_HISTOGRAM_CUSTOM_COUNTS( |
- "OutdatedUpgradeBubble.NumLaterPerReinstall", num_ignored_bubbles_, |
- 0, kMaxIgnored, kNumIgnoredBuckets); |
- content::RecordAction( |
- base::UserMetricsAction("OutdatedUpgradeBubble.Reinstall")); |
- navigator_->OpenURL(content::OpenURLParams(GURL(kDownloadChromeUrl), |
- content::Referrer(), |
- NEW_FOREGROUND_TAB, |
- content::PAGE_TRANSITION_LINK, |
- false)); |
+ if (sender == accept_button_) { |
+ accepted_ = true; |
+ if (auto_update_enabled_) { |
+ DCHECK(UpgradeDetector::GetInstance()->is_outdated_install()); |
+ UMA_HISTOGRAM_CUSTOM_COUNTS( |
+ "OutdatedUpgradeBubble.NumLaterPerReinstall", num_ignored_bubbles_, |
+ 0, kMaxIgnored, kNumIgnoredBuckets); |
+ content::RecordAction( |
+ base::UserMetricsAction("OutdatedUpgradeBubble.Reinstall")); |
+ navigator_->OpenURL(content::OpenURLParams(GURL(kDownloadChromeUrl), |
+ content::Referrer(), |
+ NEW_FOREGROUND_TAB, |
+ content::PAGE_TRANSITION_LINK, |
+ false)); |
+ } else { |
+ DCHECK(UpgradeDetector::GetInstance()->is_outdated_install_no_au()); |
+ UMA_HISTOGRAM_CUSTOM_COUNTS( |
+ "OutdatedUpgradeBubble.NumLaterPerEnableAU", num_ignored_bubbles_, |
+ 0, kMaxIgnored, kNumIgnoredBuckets); |
+ content::RecordAction( |
+ base::UserMetricsAction("OutdatedUpgradeBubble.EnableAU")); |
+ // TODO(robertshield): Make a call to GoogleUpdateSettings to enable |
+ // auto-update. |
+ if (g_browser_process->local_state()) { |
+ g_browser_process->local_state()->SetBoolean( |
+ prefs::kAttemptedToEnableAutoupdate, true); |
+ } |
+ } |
} else { |
DCHECK_EQ(later_button_, sender); |
content::RecordAction( |