Index: chrome/browser/ui/browser_init.cc |
=================================================================== |
--- chrome/browser/ui/browser_init.cc (revision 111708) |
+++ chrome/browser/ui/browser_init.cc (working copy) |
@@ -20,6 +20,7 @@ |
#include "base/string_split.h" |
#include "base/threading/thread_restrictions.h" |
#include "base/utf_string_conversions.h" |
+#include "chrome/browser/auto_launch_trial.h" |
#include "chrome/browser/automation/automation_provider.h" |
#include "chrome/browser/automation/automation_provider_list.h" |
#include "chrome/browser/automation/chrome_frame_automation_provider.h" |
@@ -113,10 +114,121 @@ |
#include "ui/base/touch/touch_factory.h" |
#endif |
+#if defined(OS_WIN) |
+#include "chrome/installer/util/auto_launch_util.h" |
+#endif |
+ |
using content::BrowserThread; |
namespace { |
+static const int kMaxInfobarShown = 5; |
+ |
+#if defined(OS_WIN) |
+// The delegate for the infobar shown when Chrome was auto-launched. |
+class AutolaunchInfoBarDelegate : public ConfirmInfoBarDelegate { |
+ public: |
+ AutolaunchInfoBarDelegate(InfoBarTabHelper* infobar_helper, |
+ PrefService* prefs); |
+ virtual ~AutolaunchInfoBarDelegate(); |
+ |
+ private: |
+ void AllowExpiry() { should_expire_ = true; } |
+ |
+ // ConfirmInfoBarDelegate: |
+ virtual bool ShouldExpire( |
+ const content::LoadCommittedDetails& details) const OVERRIDE; |
+ virtual gfx::Image* GetIcon() const OVERRIDE; |
+ virtual string16 GetMessageText() const OVERRIDE; |
+ virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE; |
+ virtual bool Accept() OVERRIDE; |
+ virtual bool Cancel() OVERRIDE; |
+ |
+ // The prefs to use. |
+ PrefService* prefs_; |
+ |
+ // Whether the user clicked one of the buttons. |
+ bool action_taken_; |
+ |
+ // Whether the info-bar should be dismissed on the next navigation. |
+ bool should_expire_; |
+ |
+ // Used to delay the expiration of the info-bar. |
+ ScopedRunnableMethodFactory<AutolaunchInfoBarDelegate> method_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AutolaunchInfoBarDelegate); |
+}; |
+ |
+AutolaunchInfoBarDelegate::AutolaunchInfoBarDelegate( |
+ InfoBarTabHelper* infobar_helper, |
+ PrefService* prefs) |
+ : ConfirmInfoBarDelegate(infobar_helper), |
+ prefs_(prefs), |
+ action_taken_(false), |
+ should_expire_(false), |
+ ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { |
+ auto_launch_trial::UpdateInfobarShownMetric(); |
+ |
+ int count = prefs_->GetInteger(prefs::kShownAutoLaunchInfobar); |
+ prefs_->SetInteger(prefs::kShownAutoLaunchInfobar, count + 1); |
+ |
+ // We want the info-bar to stick-around for a few seconds and then be hidden |
+ // on the next navigation after that. |
+ MessageLoop::current()->PostDelayedTask(FROM_HERE, |
+ method_factory_.NewRunnableMethod( |
+ &AutolaunchInfoBarDelegate::AllowExpiry), 8000); // 8 seconds. |
+} |
+ |
+AutolaunchInfoBarDelegate::~AutolaunchInfoBarDelegate() { |
+ if (!action_taken_) |
+ auto_launch_trial::UpdateInfobarResponseMetric(2); |
+} |
+ |
+bool AutolaunchInfoBarDelegate::ShouldExpire( |
+ const content::LoadCommittedDetails& details) const { |
+ return details.is_navigation_to_different_page() && should_expire_; |
+} |
+ |
+gfx::Image* AutolaunchInfoBarDelegate::GetIcon() const { |
+ return &ResourceBundle::GetSharedInstance().GetNativeImageNamed( |
+ IDR_PRODUCT_LOGO_32); |
+} |
+ |
+string16 AutolaunchInfoBarDelegate::GetMessageText() const { |
+ return l10n_util::GetStringFUTF16(IDS_AUTO_LAUNCH_INFOBAR_TEXT, |
+ l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); |
+} |
+ |
+string16 AutolaunchInfoBarDelegate::GetButtonLabel( |
+ InfoBarButton button) const { |
+ return l10n_util::GetStringUTF16((button == BUTTON_OK) ? |
+ IDS_AUTO_LAUNCH_OK : IDS_AUTO_LAUNCH_REVERT); |
+} |
+ |
+bool AutolaunchInfoBarDelegate::Accept() { |
+ action_taken_ = true; |
+ auto_launch_trial::UpdateInfobarResponseMetric(1); |
+ return true; |
+} |
+ |
+bool AutolaunchInfoBarDelegate::Cancel() { |
+ action_taken_ = true; |
+ |
+ // Track infobar reponse. |
+ auto_launch_trial::UpdateInfobarResponseMetric(0); |
+ // Also make sure we keep track of how many disable and how many enable. |
+ bool auto_launch = false; |
+ auto_launch_trial::UpdateToggleAutoLaunchMetric(auto_launch); |
+ |
+ FilePath chrome_exe; |
grt (UTC plus 2)
2011/12/01 04:45:02
chrome_exe -> chrome_dir, or somesuch
|
+ if (!PathService::Get(base::DIR_EXE, &chrome_exe)) |
+ NOTREACHED(); |
+ auto_launch_util::SetWillLaunchAtLogin(auto_launch, chrome_exe); |
grt (UTC plus 2)
2011/12/01 04:45:02
this will hit the registry. is IO allowed from th
|
+ |
+ return true; |
+} |
+#endif // OS_WIN |
+ |
// DefaultBrowserInfoBarDelegate ---------------------------------------------- |
// The delegate for the infobar shown when Chrome is not the default browser. |
@@ -219,7 +331,44 @@ |
return true; |
} |
+// NotifyAutolaunchTask ------------------------------------------------ |
+#if defined(OS_WIN) |
+class NotifyAutolaunchTask : public Task { |
+ public: |
+ NotifyAutolaunchTask(); |
+ virtual ~NotifyAutolaunchTask(); |
+ private: |
+ virtual void Run() OVERRIDE; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(NotifyAutolaunchTask); |
+}; |
+ |
+NotifyAutolaunchTask::NotifyAutolaunchTask() { |
+} |
+ |
+NotifyAutolaunchTask::~NotifyAutolaunchTask() { |
+} |
+ |
+void NotifyAutolaunchTask::Run() { |
+ if (!auto_launch_trial::IsInAutoLaunchGroup()) |
+ return; |
+ |
+ Browser* browser = BrowserList::GetLastActive(); |
+ TabContentsWrapper* tab = browser->GetSelectedTabContentsWrapper(); |
+ |
+ int infobar_shown = |
+ tab->profile()->GetPrefs()->GetInteger(prefs::kShownAutoLaunchInfobar); |
+ if (infobar_shown >= kMaxInfobarShown) |
+ return; |
+ |
+ InfoBarTabHelper* infobar_helper = tab->infobar_tab_helper(); |
+ infobar_helper->AddInfoBar( |
+ new AutolaunchInfoBarDelegate(infobar_helper, |
+ tab->profile()->GetPrefs())); |
+} |
+#endif // OS_WIN |
+ |
// NotifyNotDefaultBrowserTask ------------------------------------------------ |
class NotifyNotDefaultBrowserTask : public Task { |
@@ -546,6 +695,12 @@ |
return in_startup; |
} |
+// static |
+void BrowserInit::RegisterUserPrefs(PrefService* prefs) { |
+ prefs->RegisterIntegerPref( |
+ prefs::kShownAutoLaunchInfobar, 0, PrefService::UNSYNCABLE_PREF); |
+} |
+ |
bool BrowserInit::LaunchBrowser(const CommandLine& command_line, |
Profile* profile, |
const FilePath& cur_dir, |
@@ -709,6 +864,7 @@ |
// Check whether we are the default browser. |
CheckDefaultBrowser(profile); |
} |
+ CheckIfAutoLaunched(profile); |
#if defined(OS_MACOSX) |
// Check whether the auto-update system needs to be promoted from user |
// to system. |
@@ -1316,6 +1472,19 @@ |
BrowserThread::FILE, FROM_HERE, new CheckDefaultBrowserTask()); |
} |
+void BrowserInit::LaunchWithProfile::CheckIfAutoLaunched(Profile* profile) { |
+#if defined(OS_WIN) |
+ if (!auto_launch_trial::IsInAutoLaunchGroup()) |
+ return; |
+ |
+ const CommandLine& command_line = *CommandLine::ForCurrentProcess(); |
+ if (command_line.HasSwitch(switches::kAutoLaunchAtStartup)) { |
+ BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
+ new NotifyAutolaunchTask()); |
+ } |
+#endif |
+} |
+ |
std::vector<GURL> BrowserInit::GetURLsFromCommandLine( |
const CommandLine& command_line, |
const FilePath& cur_dir, |