Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1020)

Side by Side Diff: chrome/browser/ui/browser_init.cc

Issue 8729009: Implement an AutoLaunch experiment for Chrome for certain brand codes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/browser_init.h" 5 #include "chrome/browser/ui/browser_init.h"
6 6
7 #include <algorithm> // For max(). 7 #include <algorithm> // For max().
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
12 #include "base/environment.h" 12 #include "base/environment.h"
13 #include "base/event_recorder.h" 13 #include "base/event_recorder.h"
14 #include "base/file_path.h" 14 #include "base/file_path.h"
15 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/scoped_ptr.h"
16 #include "base/memory/weak_ptr.h" 16 #include "base/memory/weak_ptr.h"
17 #include "base/metrics/histogram.h" 17 #include "base/metrics/histogram.h"
18 #include "base/path_service.h" 18 #include "base/path_service.h"
19 #include "base/string_number_conversions.h" 19 #include "base/string_number_conversions.h"
20 #include "base/string_split.h" 20 #include "base/string_split.h"
21 #include "base/threading/thread_restrictions.h" 21 #include "base/threading/thread_restrictions.h"
22 #include "base/utf_string_conversions.h" 22 #include "base/utf_string_conversions.h"
23 #include "chrome/browser/auto_launch_trial.h"
23 #include "chrome/browser/automation/automation_provider.h" 24 #include "chrome/browser/automation/automation_provider.h"
24 #include "chrome/browser/automation/automation_provider_list.h" 25 #include "chrome/browser/automation/automation_provider_list.h"
25 #include "chrome/browser/automation/chrome_frame_automation_provider.h" 26 #include "chrome/browser/automation/chrome_frame_automation_provider.h"
26 #include "chrome/browser/automation/testing_automation_provider.h" 27 #include "chrome/browser/automation/testing_automation_provider.h"
27 #include "chrome/browser/browser_process.h" 28 #include "chrome/browser/browser_process.h"
28 #include "chrome/browser/component_updater/component_updater_service.h" 29 #include "chrome/browser/component_updater/component_updater_service.h"
29 #include "chrome/browser/component_updater/flash_component_installer.h" 30 #include "chrome/browser/component_updater/flash_component_installer.h"
30 #include "chrome/browser/component_updater/recovery_component_installer.h" 31 #include "chrome/browser/component_updater/recovery_component_installer.h"
31 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" 32 #include "chrome/browser/custom_handlers/protocol_handler_registry.h"
32 #include "chrome/browser/defaults.h" 33 #include "chrome/browser/defaults.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 #include "chrome/browser/chromeos/sms_observer.h" 107 #include "chrome/browser/chromeos/sms_observer.h"
107 #if defined(TOOLKIT_USES_GTK) 108 #if defined(TOOLKIT_USES_GTK)
108 #include "chrome/browser/chromeos/legacy_window_manager/wm_message_listener.h" 109 #include "chrome/browser/chromeos/legacy_window_manager/wm_message_listener.h"
109 #endif 110 #endif
110 #endif 111 #endif
111 112
112 #if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) 113 #if defined(TOOLKIT_VIEWS) && defined(OS_LINUX)
113 #include "ui/base/touch/touch_factory.h" 114 #include "ui/base/touch/touch_factory.h"
114 #endif 115 #endif
115 116
117 #if defined(OS_WIN)
118 #include "chrome/installer/util/auto_launch_util.h"
119 #endif
120
116 using content::BrowserThread; 121 using content::BrowserThread;
117 122
118 namespace { 123 namespace {
119 124
125 static const int kMaxInfobarShown = 5;
126
127 #if defined(OS_WIN)
128 // The delegate for the infobar shown when Chrome was auto-launched.
129 class AutolaunchInfoBarDelegate : public ConfirmInfoBarDelegate {
130 public:
131 AutolaunchInfoBarDelegate(InfoBarTabHelper* infobar_helper,
132 PrefService* prefs);
133 virtual ~AutolaunchInfoBarDelegate();
134
135 private:
136 void AllowExpiry() { should_expire_ = true; }
137
138 // ConfirmInfoBarDelegate:
139 virtual bool ShouldExpire(
140 const content::LoadCommittedDetails& details) const OVERRIDE;
141 virtual gfx::Image* GetIcon() const OVERRIDE;
142 virtual string16 GetMessageText() const OVERRIDE;
143 virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
144 virtual bool Accept() OVERRIDE;
145 virtual bool Cancel() OVERRIDE;
146
147 // The prefs to use.
148 PrefService* prefs_;
149
150 // Whether the user clicked one of the buttons.
151 bool action_taken_;
152
153 // Whether the info-bar should be dismissed on the next navigation.
154 bool should_expire_;
155
156 // Used to delay the expiration of the info-bar.
157 ScopedRunnableMethodFactory<AutolaunchInfoBarDelegate> method_factory_;
158
159 DISALLOW_COPY_AND_ASSIGN(AutolaunchInfoBarDelegate);
160 };
161
162 AutolaunchInfoBarDelegate::AutolaunchInfoBarDelegate(
163 InfoBarTabHelper* infobar_helper,
164 PrefService* prefs)
165 : ConfirmInfoBarDelegate(infobar_helper),
166 prefs_(prefs),
167 action_taken_(false),
168 should_expire_(false),
169 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
170 auto_launch_trial::UpdateInfobarShownMetric();
171
172 int count = prefs_->GetInteger(prefs::kShownAutoLaunchInfobar);
173 prefs_->SetInteger(prefs::kShownAutoLaunchInfobar, count + 1);
174
175 // We want the info-bar to stick-around for a few seconds and then be hidden
176 // on the next navigation after that.
177 MessageLoop::current()->PostDelayedTask(FROM_HERE,
178 method_factory_.NewRunnableMethod(
179 &AutolaunchInfoBarDelegate::AllowExpiry), 8000); // 8 seconds.
180 }
181
182 AutolaunchInfoBarDelegate::~AutolaunchInfoBarDelegate() {
183 if (!action_taken_)
184 auto_launch_trial::UpdateInfobarResponseMetric(2);
185 }
186
187 bool AutolaunchInfoBarDelegate::ShouldExpire(
188 const content::LoadCommittedDetails& details) const {
189 return details.is_navigation_to_different_page() && should_expire_;
190 }
191
192 gfx::Image* AutolaunchInfoBarDelegate::GetIcon() const {
193 return &ResourceBundle::GetSharedInstance().GetNativeImageNamed(
194 IDR_PRODUCT_LOGO_32);
195 }
196
197 string16 AutolaunchInfoBarDelegate::GetMessageText() const {
198 return l10n_util::GetStringFUTF16(IDS_AUTO_LAUNCH_INFOBAR_TEXT,
199 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
200 }
201
202 string16 AutolaunchInfoBarDelegate::GetButtonLabel(
203 InfoBarButton button) const {
204 return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
205 IDS_AUTO_LAUNCH_OK : IDS_AUTO_LAUNCH_REVERT);
206 }
207
208 bool AutolaunchInfoBarDelegate::Accept() {
209 action_taken_ = true;
210 auto_launch_trial::UpdateInfobarResponseMetric(1);
211 return true;
212 }
213
214 bool AutolaunchInfoBarDelegate::Cancel() {
215 action_taken_ = true;
216
217 // Track infobar reponse.
218 auto_launch_trial::UpdateInfobarResponseMetric(0);
219 // Also make sure we keep track of how many disable and how many enable.
220 bool auto_launch = false;
221 auto_launch_trial::UpdateToggleAutoLaunchMetric(auto_launch);
222
223 FilePath chrome_exe;
grt (UTC plus 2) 2011/12/01 04:45:02 chrome_exe -> chrome_dir, or somesuch
224 if (!PathService::Get(base::DIR_EXE, &chrome_exe))
225 NOTREACHED();
226 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
227
228 return true;
229 }
230 #endif // OS_WIN
231
120 // DefaultBrowserInfoBarDelegate ---------------------------------------------- 232 // DefaultBrowserInfoBarDelegate ----------------------------------------------
121 233
122 // The delegate for the infobar shown when Chrome is not the default browser. 234 // The delegate for the infobar shown when Chrome is not the default browser.
123 class DefaultBrowserInfoBarDelegate : public ConfirmInfoBarDelegate { 235 class DefaultBrowserInfoBarDelegate : public ConfirmInfoBarDelegate {
124 public: 236 public:
125 explicit DefaultBrowserInfoBarDelegate(InfoBarTabHelper* infobar_helper, 237 explicit DefaultBrowserInfoBarDelegate(InfoBarTabHelper* infobar_helper,
126 PrefService* prefs); 238 PrefService* prefs);
127 239
128 private: 240 private:
129 virtual ~DefaultBrowserInfoBarDelegate(); 241 virtual ~DefaultBrowserInfoBarDelegate();
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 } 324 }
213 325
214 bool DefaultBrowserInfoBarDelegate::Cancel() { 326 bool DefaultBrowserInfoBarDelegate::Cancel() {
215 action_taken_ = true; 327 action_taken_ = true;
216 UMA_HISTOGRAM_COUNTS("DefaultBrowserWarning.DontSetAsDefault", 1); 328 UMA_HISTOGRAM_COUNTS("DefaultBrowserWarning.DontSetAsDefault", 1);
217 // User clicked "Don't ask me again", remember that. 329 // User clicked "Don't ask me again", remember that.
218 prefs_->SetBoolean(prefs::kCheckDefaultBrowser, false); 330 prefs_->SetBoolean(prefs::kCheckDefaultBrowser, false);
219 return true; 331 return true;
220 } 332 }
221 333
334 // NotifyAutolaunchTask ------------------------------------------------
335
336 #if defined(OS_WIN)
337 class NotifyAutolaunchTask : public Task {
338 public:
339 NotifyAutolaunchTask();
340 virtual ~NotifyAutolaunchTask();
341 private:
342 virtual void Run() OVERRIDE;
343
344 DISALLOW_COPY_AND_ASSIGN(NotifyAutolaunchTask);
345 };
346
347 NotifyAutolaunchTask::NotifyAutolaunchTask() {
348 }
349
350 NotifyAutolaunchTask::~NotifyAutolaunchTask() {
351 }
352
353 void NotifyAutolaunchTask::Run() {
354 if (!auto_launch_trial::IsInAutoLaunchGroup())
355 return;
356
357 Browser* browser = BrowserList::GetLastActive();
358 TabContentsWrapper* tab = browser->GetSelectedTabContentsWrapper();
359
360 int infobar_shown =
361 tab->profile()->GetPrefs()->GetInteger(prefs::kShownAutoLaunchInfobar);
362 if (infobar_shown >= kMaxInfobarShown)
363 return;
364
365 InfoBarTabHelper* infobar_helper = tab->infobar_tab_helper();
366 infobar_helper->AddInfoBar(
367 new AutolaunchInfoBarDelegate(infobar_helper,
368 tab->profile()->GetPrefs()));
369 }
370 #endif // OS_WIN
222 371
223 // NotifyNotDefaultBrowserTask ------------------------------------------------ 372 // NotifyNotDefaultBrowserTask ------------------------------------------------
224 373
225 class NotifyNotDefaultBrowserTask : public Task { 374 class NotifyNotDefaultBrowserTask : public Task {
226 public: 375 public:
227 NotifyNotDefaultBrowserTask(); 376 NotifyNotDefaultBrowserTask();
228 virtual ~NotifyNotDefaultBrowserTask(); 377 virtual ~NotifyNotDefaultBrowserTask();
229 378
230 private: 379 private:
231 virtual void Run(); 380 virtual void Run();
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 688
540 void BrowserInit::AddFirstRunTab(const GURL& url) { 689 void BrowserInit::AddFirstRunTab(const GURL& url) {
541 first_run_tabs_.push_back(url); 690 first_run_tabs_.push_back(url);
542 } 691 }
543 692
544 // static 693 // static
545 bool BrowserInit::InProcessStartup() { 694 bool BrowserInit::InProcessStartup() {
546 return in_startup; 695 return in_startup;
547 } 696 }
548 697
698 // static
699 void BrowserInit::RegisterUserPrefs(PrefService* prefs) {
700 prefs->RegisterIntegerPref(
701 prefs::kShownAutoLaunchInfobar, 0, PrefService::UNSYNCABLE_PREF);
702 }
703
549 bool BrowserInit::LaunchBrowser(const CommandLine& command_line, 704 bool BrowserInit::LaunchBrowser(const CommandLine& command_line,
550 Profile* profile, 705 Profile* profile,
551 const FilePath& cur_dir, 706 const FilePath& cur_dir,
552 IsProcessStartup process_startup, 707 IsProcessStartup process_startup,
553 IsFirstRun is_first_run, 708 IsFirstRun is_first_run,
554 int* return_code) { 709 int* return_code) {
555 in_startup = process_startup == IS_PROCESS_STARTUP; 710 in_startup = process_startup == IS_PROCESS_STARTUP;
556 DCHECK(profile); 711 DCHECK(profile);
557 712
558 // Continue with the incognito profile from here on if Incognito mode 713 // Continue with the incognito profile from here on if Incognito mode
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 // If this is an app launch, but we didn't open an app window, it may 857 // If this is an app launch, but we didn't open an app window, it may
703 // be an app tab. 858 // be an app tab.
704 OpenApplicationTab(profile); 859 OpenApplicationTab(profile);
705 860
706 if (process_startup) { 861 if (process_startup) {
707 if (browser_defaults::kOSSupportsOtherBrowsers && 862 if (browser_defaults::kOSSupportsOtherBrowsers &&
708 !command_line_.HasSwitch(switches::kNoDefaultBrowserCheck)) { 863 !command_line_.HasSwitch(switches::kNoDefaultBrowserCheck)) {
709 // Check whether we are the default browser. 864 // Check whether we are the default browser.
710 CheckDefaultBrowser(profile); 865 CheckDefaultBrowser(profile);
711 } 866 }
867 CheckIfAutoLaunched(profile);
712 #if defined(OS_MACOSX) 868 #if defined(OS_MACOSX)
713 // Check whether the auto-update system needs to be promoted from user 869 // Check whether the auto-update system needs to be promoted from user
714 // to system. 870 // to system.
715 KeystoneInfoBar::PromotionInfoBar(profile); 871 KeystoneInfoBar::PromotionInfoBar(profile);
716 #endif 872 #endif
717 } 873 }
718 } 874 }
719 875
720 #if defined(OS_WIN) 876 #if defined(OS_WIN)
721 // Print the selected page if the command line switch exists. Note that the 877 // Print the selected page if the command line switch exists. Note that the
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
1309 } else { 1465 } else {
1310 // TODO(pastarmovj): We can't really do anything meaningful here yet but 1466 // TODO(pastarmovj): We can't really do anything meaningful here yet but
1311 // just prevent showing the infobar. 1467 // just prevent showing the infobar.
1312 } 1468 }
1313 return; 1469 return;
1314 } 1470 }
1315 BrowserThread::PostTask( 1471 BrowserThread::PostTask(
1316 BrowserThread::FILE, FROM_HERE, new CheckDefaultBrowserTask()); 1472 BrowserThread::FILE, FROM_HERE, new CheckDefaultBrowserTask());
1317 } 1473 }
1318 1474
1475 void BrowserInit::LaunchWithProfile::CheckIfAutoLaunched(Profile* profile) {
1476 #if defined(OS_WIN)
1477 if (!auto_launch_trial::IsInAutoLaunchGroup())
1478 return;
1479
1480 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
1481 if (command_line.HasSwitch(switches::kAutoLaunchAtStartup)) {
1482 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
1483 new NotifyAutolaunchTask());
1484 }
1485 #endif
1486 }
1487
1319 std::vector<GURL> BrowserInit::GetURLsFromCommandLine( 1488 std::vector<GURL> BrowserInit::GetURLsFromCommandLine(
1320 const CommandLine& command_line, 1489 const CommandLine& command_line,
1321 const FilePath& cur_dir, 1490 const FilePath& cur_dir,
1322 Profile* profile) { 1491 Profile* profile) {
1323 std::vector<GURL> urls; 1492 std::vector<GURL> urls;
1324 const CommandLine::StringVector& params = command_line.GetArgs(); 1493 const CommandLine::StringVector& params = command_line.GetArgs();
1325 1494
1326 for (size_t i = 0; i < params.size(); ++i) { 1495 for (size_t i = 0; i < params.size(); ++i) {
1327 FilePath param = FilePath(params[i]); 1496 FilePath param = FilePath(params[i]);
1328 // Handle Vista way of searching - "? <search-term>" 1497 // Handle Vista way of searching - "? <search-term>"
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
1521 if (!automation->InitializeChannel(channel_id)) 1690 if (!automation->InitializeChannel(channel_id))
1522 return false; 1691 return false;
1523 automation->SetExpectedTabCount(expected_tabs); 1692 automation->SetExpectedTabCount(expected_tabs);
1524 1693
1525 AutomationProviderList* list = g_browser_process->GetAutomationProviderList(); 1694 AutomationProviderList* list = g_browser_process->GetAutomationProviderList();
1526 DCHECK(list); 1695 DCHECK(list);
1527 list->AddProvider(automation); 1696 list->AddProvider(automation);
1528 1697
1529 return true; 1698 return true;
1530 } 1699 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698