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

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 explicit AutolaunchInfoBarDelegate(InfoBarTabHelper* infobar_helper,
grt (UTC plus 2) 2011/11/29 18:55:45 remove "explicit"
132 PrefService* prefs);
133
134 private:
135 virtual ~AutolaunchInfoBarDelegate();
grt (UTC plus 2) 2011/11/29 18:55:45 why private dtor?
Finnur 2011/11/29 23:48:30 Hmm... I don't have a good reason besides the othe
136
137 void AllowExpiry() { should_expire_ = true; }
138
139 // ConfirmInfoBarDelegate:
140 virtual bool ShouldExpire(
141 const content::LoadCommittedDetails& details) const OVERRIDE;
142 virtual gfx::Image* GetIcon() const OVERRIDE;
143 virtual string16 GetMessageText() const OVERRIDE;
144 virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
145 virtual bool Accept() OVERRIDE;
146 virtual bool Cancel() OVERRIDE;
147
148 // The prefs to use.
149 PrefService* prefs_;
150
151 // Whether the user clicked one of the buttons.
152 bool action_taken_;
153
154 // Whether the info-bar should be dismissed on the next navigation.
155 bool should_expire_;
156
157 // Used to delay the expiration of the info-bar.
158 ScopedRunnableMethodFactory<AutolaunchInfoBarDelegate> method_factory_;
159
160 DISALLOW_COPY_AND_ASSIGN(AutolaunchInfoBarDelegate);
161 };
162
163 AutolaunchInfoBarDelegate::AutolaunchInfoBarDelegate(
164 InfoBarTabHelper* infobar_helper,
165 PrefService* prefs)
166 : ConfirmInfoBarDelegate(infobar_helper),
167 prefs_(prefs),
168 action_taken_(false),
169 should_expire_(false),
170 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
grt (UTC plus 2) 2011/11/29 18:55:45 indent?
171 auto_launch_trial::UpdateInfobarShownMetric();
172
173 int count = prefs_->GetInteger(prefs::kShownAutoLaunchInfobar);
174 prefs_->SetInteger(prefs::kShownAutoLaunchInfobar, count + 1);
175
176 // We want the info-bar to stick-around for a few seconds and then be hidden
177 // on the next navigation after that.
178 MessageLoop::current()->PostDelayedTask(FROM_HERE,
179 method_factory_.NewRunnableMethod(
180 &AutolaunchInfoBarDelegate::AllowExpiry), 8000); // 8 seconds.
181 }
182
183 AutolaunchInfoBarDelegate::~AutolaunchInfoBarDelegate() {
184 if (!action_taken_)
185 auto_launch_trial::UpdateInfobarResponseMetric(2);
186 }
187
188 bool AutolaunchInfoBarDelegate::ShouldExpire(
189 const content::LoadCommittedDetails& details) const {
190 return details.is_navigation_to_different_page() && should_expire_;
191 }
192
193 gfx::Image* AutolaunchInfoBarDelegate::GetIcon() const {
194 return &ResourceBundle::GetSharedInstance().GetNativeImageNamed(
195 IDR_PRODUCT_LOGO_32);
196 }
197
198 string16 AutolaunchInfoBarDelegate::GetMessageText() const {
199 return l10n_util::GetStringFUTF16(IDS_AUTO_LAUNCH_INFOBAR_TEXT,
200 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
201 }
202
203 string16 AutolaunchInfoBarDelegate::GetButtonLabel(
204 InfoBarButton button) const {
205 return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
206 IDS_AUTO_LAUNCH_OK : IDS_AUTO_LAUNCH_REVERT);
207 }
208
209 bool AutolaunchInfoBarDelegate::Accept() {
210 action_taken_ = true;
211 auto_launch_trial::UpdateInfobarResponseMetric(1);
212 return true;
213 }
214
215 bool AutolaunchInfoBarDelegate::Cancel() {
216 action_taken_ = true;
217
218 // Track infobar reponse.
219 auto_launch_trial::UpdateInfobarResponseMetric(0);
220 // Also make sure we keep track of how many disable and how many enable.
221 bool auto_launch = false;
222 auto_launch_trial::UpdateToggleAutoLaunchMetric(auto_launch);
223
224 FilePath chrome_exe;
225 if (!PathService::Get(base::DIR_EXE, &chrome_exe))
226 NOTREACHED();
227 auto_launch_util::SetIsAutoLaunched(auto_launch, chrome_exe);
228
229 return true;
230 }
231 #endif // OS_WIN
232
120 // DefaultBrowserInfoBarDelegate ---------------------------------------------- 233 // DefaultBrowserInfoBarDelegate ----------------------------------------------
121 234
122 // The delegate for the infobar shown when Chrome is not the default browser. 235 // The delegate for the infobar shown when Chrome is not the default browser.
123 class DefaultBrowserInfoBarDelegate : public ConfirmInfoBarDelegate { 236 class DefaultBrowserInfoBarDelegate : public ConfirmInfoBarDelegate {
124 public: 237 public:
125 explicit DefaultBrowserInfoBarDelegate(InfoBarTabHelper* infobar_helper, 238 explicit DefaultBrowserInfoBarDelegate(InfoBarTabHelper* infobar_helper,
126 PrefService* prefs); 239 PrefService* prefs);
127 240
128 private: 241 private:
129 virtual ~DefaultBrowserInfoBarDelegate(); 242 virtual ~DefaultBrowserInfoBarDelegate();
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 } 325 }
213 326
214 bool DefaultBrowserInfoBarDelegate::Cancel() { 327 bool DefaultBrowserInfoBarDelegate::Cancel() {
215 action_taken_ = true; 328 action_taken_ = true;
216 UMA_HISTOGRAM_COUNTS("DefaultBrowserWarning.DontSetAsDefault", 1); 329 UMA_HISTOGRAM_COUNTS("DefaultBrowserWarning.DontSetAsDefault", 1);
217 // User clicked "Don't ask me again", remember that. 330 // User clicked "Don't ask me again", remember that.
218 prefs_->SetBoolean(prefs::kCheckDefaultBrowser, false); 331 prefs_->SetBoolean(prefs::kCheckDefaultBrowser, false);
219 return true; 332 return true;
220 } 333 }
221 334
335 // NotifyAutolaunchTask ------------------------------------------------
336
337 #if defined(OS_WIN)
338 class NotifyAutolaunchTask : public Task {
339 public:
340 NotifyAutolaunchTask();
341 virtual ~NotifyAutolaunchTask();
342 private:
343 virtual void Run();
grt (UTC plus 2) 2011/11/29 18:55:45 OVERRIDE
344
345 DISALLOW_COPY_AND_ASSIGN(NotifyAutolaunchTask);
346 };
347
348 NotifyAutolaunchTask::NotifyAutolaunchTask() {
349 }
350
351 NotifyAutolaunchTask::~NotifyAutolaunchTask() {
352 }
353
354 void NotifyAutolaunchTask::Run() {
355 if (!auto_launch_trial::IsInAutoLaunchGroup())
356 return;
357
358 Browser* browser = BrowserList::GetLastActive();
359 TabContentsWrapper* tab = browser->GetSelectedTabContentsWrapper();
360
361 int infobar_shown =
362 tab->profile()->GetPrefs()->GetInteger(prefs::kShownAutoLaunchInfobar);
363 if (infobar_shown >= kMaxInfobarShown)
364 return;
365
366 InfoBarTabHelper* infobar_helper = tab->infobar_tab_helper();
367 infobar_helper->AddInfoBar(
368 new AutolaunchInfoBarDelegate(infobar_helper,
369 tab->profile()->GetPrefs()));
370 }
371 #endif // OS_WIN
222 372
223 // NotifyNotDefaultBrowserTask ------------------------------------------------ 373 // NotifyNotDefaultBrowserTask ------------------------------------------------
224 374
225 class NotifyNotDefaultBrowserTask : public Task { 375 class NotifyNotDefaultBrowserTask : public Task {
226 public: 376 public:
227 NotifyNotDefaultBrowserTask(); 377 NotifyNotDefaultBrowserTask();
228 virtual ~NotifyNotDefaultBrowserTask(); 378 virtual ~NotifyNotDefaultBrowserTask();
229 379
230 private: 380 private:
231 virtual void Run(); 381 virtual void Run();
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 689
540 void BrowserInit::AddFirstRunTab(const GURL& url) { 690 void BrowserInit::AddFirstRunTab(const GURL& url) {
541 first_run_tabs_.push_back(url); 691 first_run_tabs_.push_back(url);
542 } 692 }
543 693
544 // static 694 // static
545 bool BrowserInit::InProcessStartup() { 695 bool BrowserInit::InProcessStartup() {
546 return in_startup; 696 return in_startup;
547 } 697 }
548 698
699 // static
700 void BrowserInit::RegisterUserPrefs(PrefService* prefs) {
701 prefs->RegisterIntegerPref(
702 prefs::kShownAutoLaunchInfobar, 0, PrefService::UNSYNCABLE_PREF);
703 }
704
549 bool BrowserInit::LaunchBrowser(const CommandLine& command_line, 705 bool BrowserInit::LaunchBrowser(const CommandLine& command_line,
550 Profile* profile, 706 Profile* profile,
551 const FilePath& cur_dir, 707 const FilePath& cur_dir,
552 IsProcessStartup process_startup, 708 IsProcessStartup process_startup,
553 IsFirstRun is_first_run, 709 IsFirstRun is_first_run,
554 int* return_code) { 710 int* return_code) {
555 in_startup = process_startup == IS_PROCESS_STARTUP; 711 in_startup = process_startup == IS_PROCESS_STARTUP;
556 DCHECK(profile); 712 DCHECK(profile);
557 713
558 // Continue with the incognito profile from here on if Incognito mode 714 // 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 858 // If this is an app launch, but we didn't open an app window, it may
703 // be an app tab. 859 // be an app tab.
704 OpenApplicationTab(profile); 860 OpenApplicationTab(profile);
705 861
706 if (process_startup) { 862 if (process_startup) {
707 if (browser_defaults::kOSSupportsOtherBrowsers && 863 if (browser_defaults::kOSSupportsOtherBrowsers &&
708 !command_line_.HasSwitch(switches::kNoDefaultBrowserCheck)) { 864 !command_line_.HasSwitch(switches::kNoDefaultBrowserCheck)) {
709 // Check whether we are the default browser. 865 // Check whether we are the default browser.
710 CheckDefaultBrowser(profile); 866 CheckDefaultBrowser(profile);
711 } 867 }
868 CheckIfAutoLaunched(profile);
712 #if defined(OS_MACOSX) 869 #if defined(OS_MACOSX)
713 // Check whether the auto-update system needs to be promoted from user 870 // Check whether the auto-update system needs to be promoted from user
714 // to system. 871 // to system.
715 KeystoneInfoBar::PromotionInfoBar(profile); 872 KeystoneInfoBar::PromotionInfoBar(profile);
716 #endif 873 #endif
717 } 874 }
718 } 875 }
719 876
720 #if defined(OS_WIN) 877 #if defined(OS_WIN)
721 // Print the selected page if the command line switch exists. Note that the 878 // 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 { 1466 } else {
1310 // TODO(pastarmovj): We can't really do anything meaningful here yet but 1467 // TODO(pastarmovj): We can't really do anything meaningful here yet but
1311 // just prevent showing the infobar. 1468 // just prevent showing the infobar.
1312 } 1469 }
1313 return; 1470 return;
1314 } 1471 }
1315 BrowserThread::PostTask( 1472 BrowserThread::PostTask(
1316 BrowserThread::FILE, FROM_HERE, new CheckDefaultBrowserTask()); 1473 BrowserThread::FILE, FROM_HERE, new CheckDefaultBrowserTask());
1317 } 1474 }
1318 1475
1476 void BrowserInit::LaunchWithProfile::CheckIfAutoLaunched(Profile* profile) {
1477 #if defined(OS_WIN)
1478 if (!auto_launch_trial::IsInAutoLaunchGroup())
1479 return;
1480
1481 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
1482 if (command_line.HasSwitch(switches::kAutoLaunchAtStartup)) {
1483 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
1484 new NotifyAutolaunchTask());
1485 }
1486 #endif
1487 }
1488
1319 std::vector<GURL> BrowserInit::GetURLsFromCommandLine( 1489 std::vector<GURL> BrowserInit::GetURLsFromCommandLine(
1320 const CommandLine& command_line, 1490 const CommandLine& command_line,
1321 const FilePath& cur_dir, 1491 const FilePath& cur_dir,
1322 Profile* profile) { 1492 Profile* profile) {
1323 std::vector<GURL> urls; 1493 std::vector<GURL> urls;
1324 const CommandLine::StringVector& params = command_line.GetArgs(); 1494 const CommandLine::StringVector& params = command_line.GetArgs();
1325 1495
1326 for (size_t i = 0; i < params.size(); ++i) { 1496 for (size_t i = 0; i < params.size(); ++i) {
1327 FilePath param = FilePath(params[i]); 1497 FilePath param = FilePath(params[i]);
1328 // Handle Vista way of searching - "? <search-term>" 1498 // 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)) 1691 if (!automation->InitializeChannel(channel_id))
1522 return false; 1692 return false;
1523 automation->SetExpectedTabCount(expected_tabs); 1693 automation->SetExpectedTabCount(expected_tabs);
1524 1694
1525 AutomationProviderList* list = g_browser_process->GetAutomationProviderList(); 1695 AutomationProviderList* list = g_browser_process->GetAutomationProviderList();
1526 DCHECK(list); 1696 DCHECK(list);
1527 list->AddProvider(automation); 1697 list->AddProvider(automation);
1528 1698
1529 return true; 1699 return true;
1530 } 1700 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698