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