12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/views/outdated_upgrade_bubble_view.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/path_service.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/prefs/pref_service.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/browser_process.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/views/elevation_icon_setter.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/upgrade_detector.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/pref_names.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/browser/browser_thread.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/page_navigator.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/user_metrics.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/image_view.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/label.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/grid_layout.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/layout/layout_constants.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget.h"
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_WIN)
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/installer/util/google_update_util.h"
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fixed width of the column holding the description label of the bubble.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(mad): Make sure there is enough room for all languages.
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kWidthOfDescriptionText = 330;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We subtract 2 to account for the natural button padding, and
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to bring the separation visually in line with the row separation
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// height.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kButtonPadding = views::kRelatedButtonHSpacing - 2;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The URL to be used to re-install Chrome when auto-update failed for too long.
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDownloadChromeUrl[] = "https://www.google.com/chrome/?&brand=CHWL"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    "&utm_campaign=en&utm_source=en-et-na-us-chrome-bubble&utm_medium=et";
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The maximum number of ignored bubble we track in the NumLaterPerReinstall
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// histogram.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kMaxIgnored = 50;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The number of buckets we want the NumLaterPerReinstall histogram to use.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kNumIgnoredBuckets = 5;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OutdatedUpgradeBubbleView ---------------------------------------------------
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OutdatedUpgradeBubbleView* OutdatedUpgradeBubbleView::upgrade_bubble_ = NULL;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int OutdatedUpgradeBubbleView::num_ignored_bubbles_ = 0;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OutdatedUpgradeBubbleView::ShowBubble(views::View* anchor_view,
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                           content::PageNavigator* navigator,
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                           bool auto_update_enabled) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (IsShowing())
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  upgrade_bubble_ = new OutdatedUpgradeBubbleView(
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      anchor_view, navigator, auto_update_enabled);
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  views::BubbleDelegateView::CreateBubble(upgrade_bubble_)->Show();
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  content::RecordAction(base::UserMetricsAction(
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      auto_update_enabled ? "OutdatedUpgradeBubble.Show"
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                          : "OutdatedUpgradeBubble.ShowNoAU"));
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool OutdatedUpgradeBubbleView::IsAvailable() {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This should only work on non-Chrome OS desktop platforms.
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX) || \
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    (defined(OS_LINUX) && !defined(OS_CHROMEOS))
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OutdatedUpgradeBubbleView::~OutdatedUpgradeBubbleView() {
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!accepted_ && num_ignored_bubbles_ < kMaxIgnored)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_ignored_bubbles_;
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Ensure |elevation_icon_setter_| is destroyed before |accept_button_|.
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  elevation_icon_setter_.reset();
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::View* OutdatedUpgradeBubbleView::GetInitiallyFocusedView() {
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return accept_button_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OutdatedUpgradeBubbleView::WindowClosing() {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reset |upgrade_bubble_| here, not in destructor, because destruction is
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // asynchronous and ShowBubble may be called before full destruction and
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // would attempt to show a bubble that is closing.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(upgrade_bubble_, this);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  upgrade_bubble_ = NULL;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OutdatedUpgradeBubbleView::Init() {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  accept_button_ = new views::LabelButton(
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      this, l10n_util::GetStringUTF16(
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          auto_update_enabled_ ? IDS_REINSTALL_APP : IDS_REENABLE_UPDATES));
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  accept_button_->SetStyle(views::Button::STYLE_BUTTON);
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  accept_button_->SetIsDefault(true);
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  accept_button_->SetFontList(rb.GetFontList(ui::ResourceBundle::BoldFont));
1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  elevation_icon_setter_.reset(new ElevationIconSetter(accept_button_));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  later_button_ = new views::LabelButton(
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      this, l10n_util::GetStringUTF16(IDS_LATER));
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  later_button_->SetStyle(views::Button::STYLE_BUTTON);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Label* title_label = new views::Label(
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      l10n_util::GetStringUTF16(IDS_UPGRADE_BUBBLE_TITLE));
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  title_label->SetFontList(rb.GetFontList(ui::ResourceBundle::MediumFont));
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  views::Label* text_label = new views::Label(l10n_util::GetStringUTF16(
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      auto_update_enabled_ ? IDS_UPGRADE_BUBBLE_TEXT
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                           : IDS_UPGRADE_BUBBLE_REENABLE_TEXT));
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  text_label->SetMultiLine(true);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  text_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ImageView* image_view = new views::ImageView();
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  image_view->SetImage(rb.GetImageSkiaNamed(IDR_UPDATE_MENU_SEVERITY_HIGH));
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  views::GridLayout* layout = new views::GridLayout(this);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetLayoutManager(layout);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kIconTitleColumnSetId = 0;
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::ColumnSet* cs = layout->AddColumnSet(kIconTitleColumnSetId);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Top (icon-title) row.
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::CENTER, 0,
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                views::GridLayout::USE_PREF, 0, 0);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cs->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 0,
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                views::GridLayout::USE_PREF, 0, 0);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs->AddPaddingColumn(1, views::kUnrelatedControlHorizontalSpacing);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Middle (text) row.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kTextColumnSetId = 1;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs = layout->AddColumnSet(kTextColumnSetId);
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cs->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                views::GridLayout::FIXED, kWidthOfDescriptionText, 0);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Bottom (buttons) row.
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kButtonsColumnSetId = 2;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs = layout->AddColumnSet(kButtonsColumnSetId);
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs->AddPaddingColumn(1, views::kRelatedControlHorizontalSpacing);
1585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::TRAILING, 0,
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                views::GridLayout::USE_PREF, 0, 0);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cs->AddPaddingColumn(0, kButtonPadding);
1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  cs->AddColumn(views::GridLayout::LEADING, views::GridLayout::TRAILING, 0,
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                views::GridLayout::USE_PREF, 0, 0);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRow(0, kIconTitleColumnSetId);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddView(image_view);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddView(title_label);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRow(0, kTextColumnSetId);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddView(text_label);
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRow(0, kButtonsColumnSetId);
175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  layout->AddView(accept_button_);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->AddView(later_button_);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddAccelerator(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE));
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)OutdatedUpgradeBubbleView::OutdatedUpgradeBubbleView(
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    views::View* anchor_view,
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    content::PageNavigator* navigator,
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool auto_update_enabled)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT),
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      auto_update_enabled_(auto_update_enabled),
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      accepted_(false),
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      accept_button_(NULL),
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      later_button_(NULL),
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigator_(navigator) {
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Compensate for built-in vertical padding in the anchor view's image.
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  set_anchor_view_insets(gfx::Insets(5, 0, 5, 0));
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OutdatedUpgradeBubbleView::ButtonPressed(
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Button* sender, const ui::Event& event) {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event.IsMouseEvent() &&
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !(static_cast<const ui::MouseEvent*>(&event))->IsOnlyLeftMouseButton()) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HandleButtonPressed(sender);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OutdatedUpgradeBubbleView::HandleButtonPressed(views::Button* sender) {
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (sender == accept_button_) {
206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    accepted_ = true;
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (auto_update_enabled_) {
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      DCHECK(UpgradeDetector::GetInstance()->is_outdated_install());
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      UMA_HISTOGRAM_CUSTOM_COUNTS(
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          "OutdatedUpgradeBubble.NumLaterPerReinstall", num_ignored_bubbles_,
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          0, kMaxIgnored, kNumIgnoredBuckets);
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      content::RecordAction(
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          base::UserMetricsAction("OutdatedUpgradeBubble.Reinstall"));
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      navigator_->OpenURL(content::OpenURLParams(GURL(kDownloadChromeUrl),
215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                 content::Referrer(),
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                 NEW_FOREGROUND_TAB,
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 ui::PAGE_TRANSITION_LINK,
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                                 false));
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_WIN)
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    } else {
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      DCHECK(UpgradeDetector::GetInstance()->is_outdated_install_no_au());
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      UMA_HISTOGRAM_CUSTOM_COUNTS(
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          "OutdatedUpgradeBubble.NumLaterPerEnableAU", num_ignored_bubbles_,
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          0, kMaxIgnored, kNumIgnoredBuckets);
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      content::RecordAction(
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          base::UserMetricsAction("OutdatedUpgradeBubble.EnableAU"));
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      // Record that the autoupdate flavour of the dialog has been shown.
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (g_browser_process->local_state()) {
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        g_browser_process->local_state()->SetBoolean(
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            prefs::kAttemptedToEnableAutoupdate, true);
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      }
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      // Re-enable updates by shelling out to setup.exe in the blocking pool.
2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      content::BrowserThread::PostBlockingPoolTask(
2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu          FROM_HERE,
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          base::Bind(&google_update::ElevateIfNeededToReenableUpdates));
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // defined(OS_WIN)
238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(later_button_, sender);
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RecordAction(
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UserMetricsAction("OutdatedUpgradeBubble.Later"));
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GetWidget()->Close();
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
246