summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/browser_init.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/browser_init.cc')
-rw-r--r--chrome/browser/ui/browser_init.cc159
1 files changed, 159 insertions, 0 deletions
diff --git a/chrome/browser/ui/browser_init.cc b/chrome/browser/ui/browser_init.cc
index a6555eb..23c05e1 100644
--- a/chrome/browser/ui/browser_init.cc
+++ b/chrome/browser/ui/browser_init.cc
@@ -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"
@@ -116,10 +117,127 @@
#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.
+ base::WeakPtrFactory<AutolaunchInfoBarDelegate> weak_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(weak_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,
+ base::Bind(&AutolaunchInfoBarDelegate::AllowExpiry,
+ weak_factory_.GetWeakPtr()),
+ 8000); // 8 seconds.
+}
+
+AutolaunchInfoBarDelegate::~AutolaunchInfoBarDelegate() {
+ if (!action_taken_) {
+ auto_launch_trial::UpdateInfobarResponseMetric(
+ auto_launch_trial::INFOBAR_IGNORE);
+ }
+}
+
+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(
+ auto_launch_trial::INFOBAR_OK);
+ return true;
+}
+
+bool AutolaunchInfoBarDelegate::Cancel() {
+ action_taken_ = true;
+
+ // Track infobar reponse.
+ auto_launch_trial::UpdateInfobarResponseMetric(
+ auto_launch_trial::INFOBAR_CUT_IT_OUT);
+ // Also make sure we keep track of how many disable and how many enable.
+ const bool auto_launch = false;
+ auto_launch_trial::UpdateToggleAutoLaunchMetric(auto_launch);
+
+ content::BrowserThread::PostTask(
+ content::BrowserThread::FILE, FROM_HERE,
+ base::Bind(&auto_launch_util::SetWillLaunchAtLogin,
+ auto_launch, FilePath()));
+ return true;
+}
+
+#endif // OS_WIN
+
// DefaultBrowserInfoBarDelegate ----------------------------------------------
// The delegate for the infobar shown when Chrome is not the default browser.
@@ -223,6 +341,26 @@ bool DefaultBrowserInfoBarDelegate::Cancel() {
return true;
}
+#if defined(OS_WIN)
+void CheckAutoLaunchCallback() {
+ 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
+
void NotifyNotDefaultBrowserCallback() {
Browser* browser = BrowserList::GetLastActive();
if (!browser)
@@ -517,6 +655,12 @@ bool BrowserInit::InProcessStartup() {
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,
@@ -699,6 +843,8 @@ bool BrowserInit::LaunchWithProfile::Launch(
if (process_startup) {
if (browser_defaults::kOSSupportsOtherBrowsers &&
!command_line_.HasSwitch(switches::kNoDefaultBrowserCheck)) {
+ CheckIfAutoLaunched(profile);
+
// Check whether we are the default browser.
CheckDefaultBrowser(profile);
}
@@ -1309,6 +1455,19 @@ void BrowserInit::LaunchWithProfile::CheckDefaultBrowser(Profile* profile) {
BrowserThread::FILE, FROM_HERE, base::Bind(&CheckDefaultBrowserCallback));
}
+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,
+ base::Bind(&CheckAutoLaunchCallback));
+ }
+#endif
+}
+
std::vector<GURL> BrowserInit::GetURLsFromCommandLine(
const CommandLine& command_line,
const FilePath& cur_dir,