172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file.
4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_init.h"
6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <algorithm>   // For max().
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/compiler_specific.h"
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/environment.h"
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/event_recorder.h"
12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/file_path.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/metrics/histogram.h"
15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/path_service.h"
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/string_number_conversions.h"
17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/string_split.h"
183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread_restrictions.h"
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "base/utf_string_conversions.h"
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/automation/automation_provider.h"
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/automation/automation_provider_list.h"
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/automation/chrome_frame_automation_provider.h"
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/automation/testing_automation_provider.h"
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/browser_process.h"
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/defaults.h"
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/extensions/extension_creator.h"
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/extensions/pack_extension_job.h"
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/first_run/first_run.h"
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/net/predictor_api.h"
31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/net/url_fixer_upper.h"
32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/notifications/desktop_notification_service.h"
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/platform_util.h"
34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/prefs/pref_service.h"
35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/prefs/session_startup_pref.h"
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h"
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/printing/print_dialog_cloud.h"
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/search_engines/template_url.h"
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/search_engines/template_url_model.h"
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/sessions/session_restore.h"
42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/sessions/session_service.h"
43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/shell_integration.h"
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/tab_contents/link_infobar_delegate.h"
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/tab_contents/simple_alert_infobar_delegate.h"
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/tabs/pinned_tab_codec.h"
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/tabs/tab_strip_model.h"
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h"
494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_navigator.h"
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h"
5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/chrome_constants.h"
53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/chrome_paths.h"
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/chrome_switches.h"
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/extensions/extension_constants.h"
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/pref_names.h"
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/url_constants.h"
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/installer/util/browser_distribution.h"
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/child_process_security_policy.h"
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_controller.h"
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_view.h"
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/result_codes.h"
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "grit/chromium_strings.h"
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "grit/generated_resources.h"
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "grit/locale_settings.h"
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "grit/theme_resources.h"
70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "net/base/net_util.h"
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "net/url_request/url_request.h"
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "webkit/glue/webkit_glue.h"
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_MACOSX)
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/cocoa/keystone_infobar.h"
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(TOOLKIT_USES_GTK)
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_util.h"
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_CHROMEOS)
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/cros/cros_library.h"
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/cros/mount_library.h"
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/cros/network_library.h"
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/customization_document.h"
8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/chromeos/enterprise_extension_observer.h"
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/gview_request_interceptor.h"
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/low_battery_observer.h"
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/network_message_observer.h"
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/network_state_notifier.h"
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/sms_observer.h"
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/update_observer.h"
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/wm_message_listener.h"
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/chromeos/wm_overview_controller.h"
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/mediaplayer_ui.h"
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(HAVE_XINPUT2)
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "views/focus/accelerator_handler.h"
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdochnamespace {
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// SetAsDefaultBrowserTask ----------------------------------------------------
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass SetAsDefaultBrowserTask : public Task {
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SetAsDefaultBrowserTask();
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~SetAsDefaultBrowserTask();
113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Run();
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(SetAsDefaultBrowserTask);
118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSetAsDefaultBrowserTask::SetAsDefaultBrowserTask() {
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSetAsDefaultBrowserTask::~SetAsDefaultBrowserTask() {
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SetAsDefaultBrowserTask::Run() {
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ShellIntegration::SetAsDefaultBrowser();
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// DefaultBrowserInfoBarDelegate ----------------------------------------------
132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The delegate for the infobar shown when Chrome is not the default browser.
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass DefaultBrowserInfoBarDelegate : public ConfirmInfoBarDelegate {
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit DefaultBrowserInfoBarDelegate(TabContents* contents);
137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~DefaultBrowserInfoBarDelegate();
140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void AllowExpiry() { should_expire_ = true; }
142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // ConfirmInfoBarDelegate:
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual bool ShouldExpire(
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const NavigationController::LoadCommittedDetails& details) const OVERRIDE;
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void InfoBarClosed() OVERRIDE;
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual SkBitmap* GetIcon() const OVERRIDE;
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual string16 GetMessageText() const OVERRIDE;
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool NeedElevation(InfoBarButton button) const OVERRIDE;
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool Accept() OVERRIDE;
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool Cancel() OVERRIDE;
153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The Profile that we restore sessions from.
155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Profile* profile_;
156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Whether the user clicked one of the buttons.
158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool action_taken_;
159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Whether the info-bar should be dismissed on the next navigation.
161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool should_expire_;
162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Used to delay the expiration of the info-bar.
164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ScopedRunnableMethodFactory<DefaultBrowserInfoBarDelegate> method_factory_;
165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(DefaultBrowserInfoBarDelegate);
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDefaultBrowserInfoBarDelegate::DefaultBrowserInfoBarDelegate(
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    TabContents* contents)
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : ConfirmInfoBarDelegate(contents),
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      profile_(contents->profile()),
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      action_taken_(false),
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      should_expire_(false),
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // We want the info-bar to stick-around for few seconds and then be hidden
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // on the next navigation after that.
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MessageLoop::current()->PostDelayedTask(FROM_HERE,
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      method_factory_.NewRunnableMethod(
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          &DefaultBrowserInfoBarDelegate::AllowExpiry), 8000);  // 8 seconds.
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDefaultBrowserInfoBarDelegate::~DefaultBrowserInfoBarDelegate() {
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool DefaultBrowserInfoBarDelegate::ShouldExpire(
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const NavigationController::LoadCommittedDetails& details) const {
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return should_expire_;
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DefaultBrowserInfoBarDelegate::InfoBarClosed() {
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!action_taken_)
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    UMA_HISTOGRAM_COUNTS("DefaultBrowserWarning.Ignored", 1);
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delete this;
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSkBitmap* DefaultBrowserInfoBarDelegate::GetIcon() const {
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return ResourceBundle::GetSharedInstance().GetBitmapNamed(
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     IDR_PRODUCT_ICON_32);
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 DefaultBrowserInfoBarDelegate::GetMessageText() const {
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringUTF16(IDS_DEFAULT_BROWSER_INFOBAR_SHORT_TEXT);
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 DefaultBrowserInfoBarDelegate::GetButtonLabel(
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    InfoBarButton button) const {
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IDS_SET_AS_DEFAULT_INFOBAR_BUTTON_LABEL :
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IDS_DONT_ASK_AGAIN_INFOBAR_BUTTON_LABEL);
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool DefaultBrowserInfoBarDelegate::NeedElevation(InfoBarButton button) const {
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return button == BUTTON_OK;
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool DefaultBrowserInfoBarDelegate::Accept() {
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  action_taken_ = true;
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  UMA_HISTOGRAM_COUNTS("DefaultBrowserWarning.SetAsDefault", 1);
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  g_browser_process->file_thread()->message_loop()->PostTask(FROM_HERE,
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new SetAsDefaultBrowserTask());
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return true;
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool DefaultBrowserInfoBarDelegate::Cancel() {
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  action_taken_ = true;
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  UMA_HISTOGRAM_COUNTS("DefaultBrowserWarning.DontSetAsDefault", 1);
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // User clicked "Don't ask me again", remember that.
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  profile_->GetPrefs()->SetBoolean(prefs::kCheckDefaultBrowser, false);
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return true;
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// NotifyNotDefaultBrowserTask ------------------------------------------------
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
236513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass NotifyNotDefaultBrowserTask : public Task {
237513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NotifyNotDefaultBrowserTask();
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~NotifyNotDefaultBrowserTask();
240513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
241513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Run();
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(NotifyNotDefaultBrowserTask);
245513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenNotifyNotDefaultBrowserTask::NotifyNotDefaultBrowserTask() {
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenNotifyNotDefaultBrowserTask::~NotifyNotDefaultBrowserTask() {
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid NotifyNotDefaultBrowserTask::Run() {
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Browser* browser = BrowserList::GetLastActive();
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!browser)
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;  // Reached during ui tests.
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Don't show the info-bar if there are already info-bars showing.
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // In ChromeBot tests, there might be a race. This line appears to get
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // called during shutdown and |tab| can be NULL.
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContents* tab = browser->GetSelectedTabContents();
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!tab || tab->infobar_count() > 0)
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tab->AddInfoBar(new DefaultBrowserInfoBarDelegate(tab));
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// CheckDefaultBrowserTask ----------------------------------------------------
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
269513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass CheckDefaultBrowserTask : public Task {
270513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CheckDefaultBrowserTask();
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~CheckDefaultBrowserTask();
273513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Run();
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(CheckDefaultBrowserTask);
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenCheckDefaultBrowserTask::CheckDefaultBrowserTask() {
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenCheckDefaultBrowserTask::~CheckDefaultBrowserTask() {
28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid CheckDefaultBrowserTask::Run() {
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (ShellIntegration::IsDefaultBrowser() ||
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !platform_util::CanSetAsDefaultBrowser()) {
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                          new NotifyNotDefaultBrowserTask());
29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
294513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
295513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// SessionCrashedInfoBarDelegate ----------------------------------------------
297513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// A delegate for the InfoBar shown when the previous session has crashed.
299513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass SessionCrashedInfoBarDelegate : public ConfirmInfoBarDelegate {
300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  explicit SessionCrashedInfoBarDelegate(TabContents* contents);
302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~SessionCrashedInfoBarDelegate();
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // ConfirmInfoBarDelegate:
307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void InfoBarClosed() OVERRIDE;
308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual SkBitmap* GetIcon() const OVERRIDE;
309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual string16 GetMessageText() const OVERRIDE;
310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual int GetButtons() const OVERRIDE;
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool Accept() OVERRIDE;
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
314513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The Profile that we restore sessions from.
315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Profile* profile_;
316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
317513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(SessionCrashedInfoBarDelegate);
318513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
319513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSessionCrashedInfoBarDelegate::SessionCrashedInfoBarDelegate(
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    TabContents* contents)
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : ConfirmInfoBarDelegate(contents),
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      profile_(contents->profile()) {
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSessionCrashedInfoBarDelegate::~SessionCrashedInfoBarDelegate() {
32772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
32872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SessionCrashedInfoBarDelegate::InfoBarClosed() {
33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delete this;
33172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
33272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
33372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenSkBitmap* SessionCrashedInfoBarDelegate::GetIcon() const {
33472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return ResourceBundle::GetSharedInstance().GetBitmapNamed(
33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IDR_INFOBAR_RESTORE_SESSION);
33672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
33872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 SessionCrashedInfoBarDelegate::GetMessageText() const {
33972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_MESSAGE);
34072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
34272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenint SessionCrashedInfoBarDelegate::GetButtons() const {
34372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return BUTTON_OK;
34472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
34572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 SessionCrashedInfoBarDelegate::GetButtonLabel(
34772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    InfoBarButton button) const {
34872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK_EQ(BUTTON_OK, button);
34972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return l10n_util::GetStringUTF16(IDS_SESSION_CRASHED_VIEW_RESTORE_BUTTON);
35072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
35172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
35272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool SessionCrashedInfoBarDelegate::Accept() {
35372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SessionRestore::RestoreSession(profile_, NULL, true, false,
35472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                 std::vector<GURL>());
35572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return true;
35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
35872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
35972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Utility functions ----------------------------------------------------------
36072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
361513209b27ff55e2841eac0e4120199c23acce758Ben MurdochSessionStartupPref GetSessionStartupPref(const CommandLine& command_line,
362513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                         Profile* profile) {
363513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SessionStartupPref pref = SessionStartupPref::GetStartupPref(profile);
364513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line.HasSwitch(switches::kRestoreLastSession))
365513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    pref.type = SessionStartupPref::LAST;
366513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line.HasSwitch(switches::kIncognito) &&
36772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      pref.type == SessionStartupPref::LAST &&
36872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      profile->GetPrefs()->GetBoolean(prefs::kIncognitoEnabled)) {
369513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // We don't store session information when incognito. If the user has
370513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // chosen to restore last session and launched incognito, fallback to
371513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // default launch behavior.
372513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    pref.type = SessionStartupPref::DEFAULT;
373513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
374513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return pref;
375513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
376513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
377513209b27ff55e2841eac0e4120199c23acce758Ben Murdochenum LaunchMode {
378513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_TO_BE_DECIDED = 0,       // Possibly direct launch or via a shortcut.
379513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_AS_WEBAPP,               // Launched as a installed web application.
380513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_WITH_URLS,               // Launched with urls in the cmd line.
381513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_SHORTCUT_NONE,           // Not launched from a shortcut.
382513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_SHORTCUT_NONAME,         // Launched from shortcut but no name available.
383513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_SHORTCUT_UNKNOWN,        // Launched from user-defined shortcut.
384513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_SHORTCUT_QUICKLAUNCH,    // Launched from the quick launch bar.
385513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_SHORTCUT_DESKTOP,        // Launched from a desktop shortcut.
386513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_SHORTCUT_STARTMENU,      // Launched from start menu.
387513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  LM_LINUX_MAC_BEOS           // Other OS buckets start here.
388513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
389513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
390513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_WIN)
391513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Undocumented flag in the startup info structure tells us what shortcut was
392513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// used to launch the browser. See http://www.catch22.net/tuts/undoc01 for
393513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// more information. Confirmed to work on XP, Vista and Win7.
394513209b27ff55e2841eac0e4120199c23acce758Ben MurdochLaunchMode GetLaunchShortcutKind() {
395513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  STARTUPINFOW si = { sizeof(si) };
396513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GetStartupInfoW(&si);
397513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (si.dwFlags & 0x800) {
398513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!si.lpTitle)
399513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return LM_SHORTCUT_NONAME;
400513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    std::wstring shortcut(si.lpTitle);
401513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // The windows quick launch path is not localized.
402513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (shortcut.find(L"\\Quick Launch\\") != std::wstring::npos)
403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return LM_SHORTCUT_QUICKLAUNCH;
404513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_ptr<base::Environment> env(base::Environment::Create());
405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    std::string appdata_path;
406513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    env->GetVar("USERPROFILE", &appdata_path);
407513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!appdata_path.empty() &&
408513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        shortcut.find(ASCIIToWide(appdata_path)) != std::wstring::npos)
409513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return LM_SHORTCUT_DESKTOP;
410513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return LM_SHORTCUT_UNKNOWN;
411513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
412513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return LM_SHORTCUT_NONE;
413513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
414513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#else
415513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// TODO(cpu): Port to other platforms.
416513209b27ff55e2841eac0e4120199c23acce758Ben MurdochLaunchMode GetLaunchShortcutKind() {
417513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return LM_LINUX_MAC_BEOS;
418513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
419513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
420513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
421513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Log in a histogram the frequency of launching by the different methods. See
422513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// LaunchMode enum for the actual values of the buckets.
423513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid RecordLaunchModeHistogram(LaunchMode mode) {
424513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int bucket = (mode == LM_TO_BE_DECIDED) ? GetLaunchShortcutKind() : mode;
425513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  UMA_HISTOGRAM_COUNTS_100("Launch.Modes", bucket);
426513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
427513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
428513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstatic bool in_startup = false;
429513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
430513209b27ff55e2841eac0e4120199c23acce758Ben MurdochGURL GetWelcomePageURL() {
431513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string welcome_url = l10n_util::GetStringUTF8(IDS_WELCOME_PAGE_URL);
432513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return GURL(welcome_url);
433513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
434513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
435513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid UrlsToTabs(const std::vector<GURL>& urls,
436513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                std::vector<BrowserInit::LaunchWithProfile::Tab>* tabs) {
437513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (size_t i = 0; i < urls.size(); ++i) {
438513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    BrowserInit::LaunchWithProfile::Tab tab;
439513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    tab.is_pinned = false;
440513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    tab.url = urls[i];
441513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    tabs->push_back(tab);
442513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
443513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
444513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
445dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Return true if the command line option --app-id is used.  Set
446dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// |out_extension| to the app to open, and |out_launch_container|
447dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// to the type of window into which the app should be open.
448dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool GetAppLaunchContainer(
449dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Profile* profile,
450dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::string& app_id,
451dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const Extension** out_extension,
452dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    extension_misc::LaunchContainer* out_launch_container) {
453dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
454dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ExtensionService* extensions_service = profile->GetExtensionService();
455dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const Extension* extension =
456dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      extensions_service->GetExtensionById(app_id, false);
457dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
458dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The extension with id |app_id| may have been uninstalled.
459dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!extension)
460dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return false;
461dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
462dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Look at preferences to find the right launch container.  If no
463dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // preference is set, launch as a window.
464dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  extension_misc::LaunchContainer launch_container =
465dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      extensions_service->extension_prefs()->GetLaunchContainer(
466dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          extension, ExtensionPrefs::LAUNCH_WINDOW);
467dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
468dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  *out_extension = extension;
469dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  *out_launch_container = launch_container;
470dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return true;
471dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
472dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
473dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid RecordCmdLineAppHistogram() {
474dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram,
475dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                            extension_misc::APP_LAUNCH_CMD_LINE_APP,
476dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                            extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
477dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
478dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
479dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid RecordAppLaunches(
480dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Profile* profile,
481dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::vector<GURL>& cmd_line_urls,
482dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const std::vector<BrowserInit::LaunchWithProfile::Tab>& autolaunch_tabs) {
483dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ExtensionService* extension_service = profile->GetExtensionService();
484dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(extension_service);
485dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (size_t i = 0; i < cmd_line_urls.size(); ++i) {
486dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (extension_service->IsInstalledApp(cmd_line_urls.at(i))) {
487dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram,
488dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                extension_misc::APP_LAUNCH_CMD_LINE_URL,
489dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
490dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
491dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
492dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (size_t i = 0; i < autolaunch_tabs.size(); ++i) {
493dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (extension_service->IsInstalledApp(autolaunch_tabs.at(i).url)) {
494dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppLaunchHistogram,
495dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                extension_misc::APP_LAUNCH_AUTOLAUNCH,
496dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
497dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
498dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
499dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
500dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
501513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}  // namespace
502513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
50372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// BrowserInit ----------------------------------------------------------------
50572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
506513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserInit::BrowserInit() {}
507513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
508513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserInit::~BrowserInit() {}
509513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
510513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserInit::AddFirstRunTab(const GURL& url) {
511513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  first_run_tabs_.push_back(url);
512513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
513513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
514513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// static
515513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool BrowserInit::InProcessStartup() {
516513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return in_startup;
517513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
518513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
519513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool BrowserInit::LaunchBrowser(const CommandLine& command_line,
520513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                Profile* profile,
521513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                const FilePath& cur_dir,
522513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                bool process_startup,
523513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                int* return_code) {
524513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  in_startup = process_startup;
525513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DCHECK(profile);
526201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(OS_CHROMEOS)
527201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (process_startup) {
528201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // NetworkStateNotifier has to be initialized before Launching browser
529201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // because the page load can happen in parallel to this UI thread
530201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // and IO thread may access the NetworkStateNotifier.
531201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
53221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        ->AddNetworkManagerObserver(
53321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            chromeos::NetworkStateNotifier::GetInstance());
534201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
535201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif
536513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Continue with the incognito profile from here on if --incognito
53872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (command_line.HasSwitch(switches::kIncognito) &&
53972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      profile->GetPrefs()->GetBoolean(prefs::kIncognitoEnabled)) {
540513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    profile = profile->GetOffTheRecordProfile();
54172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
542513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
543513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BrowserInit::LaunchWithProfile lwp(cur_dir, command_line, this);
54472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<GURL> urls_to_launch = BrowserInit::GetURLsFromCommandLine(
54572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      command_line, cur_dir, profile);
54672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool launched = lwp.Launch(profile, urls_to_launch, process_startup);
547513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  in_startup = false;
548513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
549513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!launched) {
550513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    LOG(ERROR) << "launch error";
551513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (return_code)
552513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      *return_code = ResultCodes::INVALID_CMDLINE_URL;
553513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return false;
554513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
555513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
556513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_CHROMEOS)
557dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Initialize Chrome OS preferences like touch pad sensitivity. For the
558dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // preferences to work in the guest mode, the initialization has to be
559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // done after |profile| is switched to the incognito profile (which
560dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // is actually GuestSessionProfile in the guest mode). See the
561dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // GetOffTheRecordProfile() call above.
562dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  profile->InitChromeOSPreferences();
563dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
564513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Create the WmMessageListener so that it can listen for messages regardless
565513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // of what window has focus.
56621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  chromeos::WmMessageListener::GetInstance();
567513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
568513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Create the WmOverviewController so it can register with the listener.
56921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  chromeos::WmOverviewController::GetInstance();
570513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
571513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Install the GView request interceptor that will redirect requests
572513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // of compatible documents (PDF, etc) to the GView document viewer.
573513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
574513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (parsed_command_line.HasSwitch(switches::kEnableGView)) {
57521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    chromeos::GViewRequestInterceptor::GetInstance();
576513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
577513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (process_startup) {
578513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // This observer is a singleton. It is never deleted but the pointer is kept
57921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    // in a static so that it isn't reported as a leak.
580513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    static chromeos::LowBatteryObserver* low_battery_observer =
581513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        new chromeos::LowBatteryObserver(profile);
582513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    chromeos::CrosLibrary::Get()->GetPowerLibrary()->AddObserver(
583513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        low_battery_observer);
584513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
585513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    static chromeos::UpdateObserver* update_observer =
586513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        new chromeos::UpdateObserver(profile);
587513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    chromeos::CrosLibrary::Get()->GetUpdateLibrary()->AddObserver(
588513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        update_observer);
589513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
590513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    static chromeos::NetworkMessageObserver* network_message_observer =
591513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        new chromeos::NetworkMessageObserver(profile);
592513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
593513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ->AddNetworkManagerObserver(network_message_observer);
594513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
595513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ->AddCellularDataPlanObserver(network_message_observer);
596dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
597dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        ->AddUserActionObserver(network_message_observer);
59821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    static chromeos::SmsObserver* sms_observer =
600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        new chromeos::SmsObserver(profile);
601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ->AddNetworkManagerObserver(sms_observer);
60321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
60421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    profile->SetupChromeOSEnterpriseExtensionObserver();
605513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
606513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
607513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return true;
608513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
609513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
61072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
61172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// BrowserInit::LaunchWithProfile::Tab ----------------------------------------
612513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
613513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserInit::LaunchWithProfile::Tab::Tab() : is_app(false), is_pinned(true) {}
614513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
615513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserInit::LaunchWithProfile::Tab::~Tab() {}
616513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
61772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
61872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// BrowserInit::LaunchWithProfile ---------------------------------------------
619513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
620513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserInit::LaunchWithProfile::LaunchWithProfile(
621513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const FilePath& cur_dir,
622513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const CommandLine& command_line)
623513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        : cur_dir_(cur_dir),
624513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          command_line_(command_line),
625513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          profile_(NULL),
626513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          browser_init_(NULL) {
627513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
628513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
629513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserInit::LaunchWithProfile::LaunchWithProfile(
630513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const FilePath& cur_dir,
631513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const CommandLine& command_line,
632513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    BrowserInit* browser_init)
633513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        : cur_dir_(cur_dir),
634513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          command_line_(command_line),
635513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          profile_(NULL),
636513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          browser_init_(browser_init) {
637513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
638513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
639513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowserInit::LaunchWithProfile::~LaunchWithProfile() {
640513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
641513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
64272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool BrowserInit::LaunchWithProfile::Launch(
64372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    Profile* profile,
64472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const std::vector<GURL>& urls_to_open,
64572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bool process_startup) {
646513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DCHECK(profile);
647513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  profile_ = profile;
648513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
649513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line_.HasSwitch(switches::kDnsLogDetails))
650513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    chrome_browser_net::EnablePredictorDetailedLog(true);
651513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line_.HasSwitch(switches::kDnsPrefetchDisable))
652513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    chrome_browser_net::EnablePredictor(false);
653513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
654513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line_.HasSwitch(switches::kDumpHistogramsOnExit))
655513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    base::StatisticsRecorder::set_dump_on_exit(true);
656513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
657513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line_.HasSwitch(switches::kRemoteShellPort)) {
658513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    std::string port_str =
659513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        command_line_.GetSwitchValueASCII(switches::kRemoteShellPort);
660513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int64 port;
66172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (base::StringToInt64(port_str, &port) && port > 0 && port < 65535) {
66272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      g_browser_process->InitDevToolsLegacyProtocolHandler(
66372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          static_cast<int>(port));
66472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    } else {
665513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      DLOG(WARNING) << "Invalid remote shell port number " << port;
66672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
667513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else if (command_line_.HasSwitch(switches::kRemoteDebuggingPort)) {
668513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    std::string port_str =
669513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        command_line_.GetSwitchValueASCII(switches::kRemoteDebuggingPort);
670513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int64 port;
67172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (base::StringToInt64(port_str, &port) && port > 0 && port < 65535) {
67272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      g_browser_process->InitDevToolsHttpProtocolHandler(
67372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          "127.0.0.1",
67472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          static_cast<int>(port),
67572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          "");
67672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    } else {
677513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      DLOG(WARNING) << "Invalid http debugger port number " << port;
67872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
679513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
680513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
681513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line_.HasSwitch(switches::kUserAgent)) {
682513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    webkit_glue::SetUserAgent(command_line_.GetSwitchValueASCII(
683513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        switches::kUserAgent));
684513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
685513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
686dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Open the required browser windows and tabs. First, see if
687dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // we're being run as an application window. If so, the user
688dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // opened an app shortcut.  Don't restore tabs or open initial
689dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // URLs in that case. The user should see the window as an app,
690dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // not as chrome.
691dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (OpenApplicationWindow(profile)) {
692dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    RecordLaunchModeHistogram(LM_AS_WEBAPP);
693dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
694513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    RecordLaunchModeHistogram(urls_to_open.empty()?
695513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                              LM_TO_BE_DECIDED : LM_WITH_URLS);
696513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ProcessLaunchURLs(process_startup, urls_to_open);
697513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
698513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // If this is an app launch, but we didn't open an app window, it may
699513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // be an app tab.
700dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    OpenApplicationTab(profile);
701513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
702513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (process_startup) {
703513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (browser_defaults::kOSSupportsOtherBrowsers &&
704513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          !command_line_.HasSwitch(switches::kNoDefaultBrowserCheck)) {
705513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        // Check whether we are the default browser.
706513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        CheckDefaultBrowser(profile);
707513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
708513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_MACOSX)
709513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // Check whether the auto-update system needs to be promoted from user
710513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // to system.
711513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      KeystoneInfoBar::PromotionInfoBar(profile);
712513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
713513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
714513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
715513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
716513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_WIN)
717513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Print the selected page if the command line switch exists. Note that the
718513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // current selected tab would be the page which will be printed.
719513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line_.HasSwitch(switches::kPrint)) {
720513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Browser* browser = BrowserList::GetLastActive();
721513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    browser->Print();
722513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
723513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
724513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
725513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If we're recording or playing back, startup the EventRecorder now
726513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // unless otherwise specified.
727513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!command_line_.HasSwitch(switches::kNoEvents)) {
728513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    FilePath script_path;
729513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    PathService::Get(chrome::FILE_RECORDED_SCRIPT, &script_path);
730513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
731513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    bool record_mode = command_line_.HasSwitch(switches::kRecordMode);
732513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    bool playback_mode = command_line_.HasSwitch(switches::kPlaybackMode);
733513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
734513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (record_mode && chrome::kRecordModeEnabled)
735513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      base::EventRecorder::current()->StartRecording(script_path);
736513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (playback_mode)
737513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      base::EventRecorder::current()->StartPlayback(script_path);
738513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
739513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
740513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_WIN)
741513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (process_startup)
742513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ShellIntegration::MigrateChromiumShortcuts();
743513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif  // defined(OS_WIN)
744513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
745513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return true;
746513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
747513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
748513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool BrowserInit::LaunchWithProfile::IsAppLaunch(std::string* app_url,
749513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                                 std::string* app_id) {
750513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line_.HasSwitch(switches::kApp)) {
751513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (app_url)
752513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      *app_url = command_line_.GetSwitchValueASCII(switches::kApp);
753513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return true;
754513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
755513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line_.HasSwitch(switches::kAppId)) {
756513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (app_id)
757513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      *app_id = command_line_.GetSwitchValueASCII(switches::kAppId);
758513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return true;
759513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
760513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return false;
761513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
762513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
763dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool BrowserInit::LaunchWithProfile::OpenApplicationTab(Profile* profile) {
764dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string app_id;
765dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // App shortcuts to URLs always open in an app window.  Because this
766dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // function will open an app that should be in a tab, there is no need
767dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // to look at the app URL.  OpenApplicationWindow() will open app url
768dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // shortcuts.
769dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!IsAppLaunch(NULL, &app_id) || app_id.empty())
770dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return false;
771dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
772dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  extension_misc::LaunchContainer launch_container;
773dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const Extension* extension;
774dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!GetAppLaunchContainer(profile, app_id, &extension, &launch_container))
775dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return false;
776dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
777dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // If the user doesn't want to open a tab, fail.
778dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (launch_container != extension_misc::LAUNCH_TAB)
779dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return false;
780dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
781dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  RecordCmdLineAppHistogram();
782dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
783dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* app_tab = Browser::OpenApplicationTab(profile, extension, NULL);
784dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return (app_tab != NULL);
785dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
786dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
787513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool BrowserInit::LaunchWithProfile::OpenApplicationWindow(Profile* profile) {
788513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string url_string, app_id;
789513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!IsAppLaunch(&url_string, &app_id))
790513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return false;
791513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
792201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // This can fail if the app_id is invalid.  It can also fail if the
793201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // extension is external, and has not yet been installed.
794201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // TODO(skerner): Do something reasonable here. Pop up a warning panel?
795513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Open an URL to the gallery page of the extension id?
796201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!app_id.empty()) {
797dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    extension_misc::LaunchContainer launch_container;
798dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const Extension* extension;
799dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (!GetAppLaunchContainer(profile, app_id, &extension, &launch_container))
800201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return false;
801201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
802dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // TODO(skerner): Could pass in |extension| and |launch_container|,
803dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // and avoid calling GetAppLaunchContainer() both here and in
804dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // OpenApplicationTab().
805201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
806dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (launch_container == extension_misc::LAUNCH_TAB)
807dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return false;
808dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
809dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    RecordCmdLineAppHistogram();
810dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    TabContents* tab_in_app_window = Browser::OpenApplication(
811201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        profile, extension, launch_container, NULL);
812dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return (tab_in_app_window != NULL);
813201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
814513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
815513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (url_string.empty())
816513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return false;
817513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
818513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_WIN)  // Fix up Windows shortcuts.
819513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ReplaceSubstringsAfterOffset(&url_string, 0, "\\x", "%");
820513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
821513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL url(url_string);
822513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
823513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Restrict allowed URLs for --app switch.
824513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!url.is_empty() && url.is_valid()) {
825513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ChildProcessSecurityPolicy *policy =
826513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ChildProcessSecurityPolicy::GetInstance();
827513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (policy->IsWebSafeScheme(url.scheme()) ||
828513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        url.SchemeIs(chrome::kFileScheme)) {
829dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (profile->GetExtensionService()->IsInstalledApp(url)) {
831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        RecordCmdLineAppHistogram();
832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        UMA_HISTOGRAM_ENUMERATION(
834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            extension_misc::kAppLaunchHistogram,
835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            extension_misc::APP_LAUNCH_CMD_LINE_APP_LEGACY,
836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            extension_misc::APP_LAUNCH_BUCKET_BOUNDARY);
837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
838201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      TabContents* app_tab = Browser::OpenAppShortcutWindow(
839201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          profile,
840201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          url,
841201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          true);  // Update app info.
842201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return (app_tab != NULL);
843513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
844513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
845513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return false;
846513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
847513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
848513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserInit::LaunchWithProfile::ProcessLaunchURLs(
849513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    bool process_startup,
850513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const std::vector<GURL>& urls_to_open) {
851513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If we're starting up in "background mode" (no open browser window) then
852513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // don't open any browser windows.
853513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (process_startup && command_line_.HasSwitch(switches::kNoStartupWindow))
854513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
855513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
856513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (process_startup && ProcessStartupURLs(urls_to_open)) {
857513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // ProcessStartupURLs processed the urls, nothing else to do.
858513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
859513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
860513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
861513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!process_startup &&
862513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      (profile_->GetSessionService() &&
863513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch       profile_->GetSessionService()->RestoreIfNecessary(urls_to_open))) {
864513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // We're already running and session restore wanted to run. This can happen
865513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // at various points, such as if there is only an app window running and the
866513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // user double clicked the chrome icon. Return so we don't open the urls.
867513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
868513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
869513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
870513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Session restore didn't occur, open the urls.
871513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
872513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Browser* browser = NULL;
873513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::vector<GURL> adjust_urls = urls_to_open;
874513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (adjust_urls.empty())
875513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    AddStartupURLs(&adjust_urls);
876513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (!command_line_.HasSwitch(switches::kOpenInNewWindow))
8774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    browser = BrowserList::GetLastActiveWithProfile(profile_);
878513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
879dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  browser = OpenURLsInBrowser(browser, process_startup, adjust_urls);
880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (process_startup)
881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddInfoBarsIfNecessary(browser);
882513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
883513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
884513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool BrowserInit::LaunchWithProfile::ProcessStartupURLs(
885513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const std::vector<GURL>& urls_to_open) {
886513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SessionStartupPref pref = GetSessionStartupPref(command_line_, profile_);
887513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line_.HasSwitch(switches::kTestingChannelID) &&
888513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      !command_line_.HasSwitch(switches::kRestoreLastSession) &&
889513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      browser_defaults::kDefaultSessionStartupType !=
890513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      SessionStartupPref::DEFAULT) {
891513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // When we have non DEFAULT session start type, then we won't open up a
892513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // fresh session. But none of the tests are written with this in mind, so
893513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // we explicitly ignore it during testing.
894513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return false;
895513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
896513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
897513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (pref.type == SessionStartupPref::LAST) {
898513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!profile_->DidLastSessionExitCleanly() &&
899513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        !command_line_.HasSwitch(switches::kRestoreLastSession)) {
900513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // The last session crashed. It's possible automatically loading the
901513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // page will trigger another crash, locking the user out of chrome.
902513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // To avoid this, don't restore on startup but instead show the crashed
903513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // infobar.
904513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return false;
905513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
906dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Browser* browser =
907dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        SessionRestore::RestoreSessionSynchronously(profile_, urls_to_open);
908dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddInfoBarsIfNecessary(browser);
909513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return true;
910513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
911513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
912513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::vector<Tab> tabs = PinnedTabCodec::ReadPinnedTabs(profile_);
913513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
914dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  RecordAppLaunches(profile_, urls_to_open, tabs);
915dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
916513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!urls_to_open.empty()) {
917513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // If urls were specified on the command line, use them.
918513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    UrlsToTabs(urls_to_open, &tabs);
919513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else if (pref.type == SessionStartupPref::URLS && !pref.urls.empty()) {
920513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Only use the set of urls specified in preferences if nothing was
921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // specified on the command line. Filter out any urls that are to be
922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // restored by virtue of having been previously pinned.
923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    AddUniqueURLs(pref.urls, &tabs);
924dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else if (pref.type == SessionStartupPref::DEFAULT && !tabs.empty()) {
925dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    // Make sure the home page is opened even if there are pinned tabs.
926dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    std::vector<GURL> urls;
927dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddStartupURLs(&urls);
928dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    UrlsToTabs(urls, &tabs);
929513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
930513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
931513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (tabs.empty())
932513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return false;
933513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
934dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  Browser* browser = OpenTabsInBrowser(NULL, true, tabs);
935dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AddInfoBarsIfNecessary(browser);
936513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return true;
937513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
938513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BrowserInit::LaunchWithProfile::AddUniqueURLs(
940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::vector<GURL>& urls,
941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    std::vector<Tab>* tabs) {
942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  size_t num_existing_tabs = tabs->size();
943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = 0; i < urls.size(); ++i) {
944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    bool in_tabs = false;
945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (size_t j = 0; j < num_existing_tabs; ++j) {
946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (urls[i] == (*tabs)[j].url) {
947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        in_tabs = true;
948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        break;
949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!in_tabs) {
952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      BrowserInit::LaunchWithProfile::Tab tab;
953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab.is_pinned = false;
954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab.url = urls[i];
955ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tabs->push_back(tab);
956ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
957ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
958ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
959ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
960513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowser* BrowserInit::LaunchWithProfile::OpenURLsInBrowser(
961513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    Browser* browser,
962513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    bool process_startup,
963513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    const std::vector<GURL>& urls) {
964513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::vector<Tab> tabs;
965513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  UrlsToTabs(urls, &tabs);
966513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return OpenTabsInBrowser(browser, process_startup, tabs);
967513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
968513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
969513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBrowser* BrowserInit::LaunchWithProfile::OpenTabsInBrowser(
970513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        Browser* browser,
971513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        bool process_startup,
972513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        const std::vector<Tab>& tabs) {
973513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DCHECK(!tabs.empty());
974513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If we don't yet have a profile, try to use the one we're given from
975513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // |browser|. While we may not end up actually using |browser| (since it
976513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // could be a popup window), we can at least use the profile.
977513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!profile_ && browser)
978513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    profile_ = browser->profile();
979513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
980513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!browser || browser->type() != Browser::TYPE_NORMAL) {
981513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    browser = Browser::Create(profile_);
982513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  } else {
983513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(TOOLKIT_GTK)
984513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Setting the time of the last action on the window here allows us to steal
985513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // focus, which is what the user wants when opening a new tab in an existing
986513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // browser window.
987513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    gtk_util::SetWMLastUserActionTime(browser->window()->GetNativeHandle());
988513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
989513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
990513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
991513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if !defined(OS_MACOSX)
992513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // In kiosk mode, we want to always be fullscreen, so switch to that now.
993513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode))
994513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    browser->ToggleFullscreenMode();
995513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
996513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
997513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool first_tab = true;
998513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (size_t i = 0; i < tabs.size(); ++i) {
999513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // We skip URLs that we'd have to launch an external protocol handler for.
1000513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // This avoids us getting into an infinite loop asking ourselves to open
1001513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // a URL, should the handler be (incorrectly) configured to be us. Anyone
1002513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // asking us to open such a URL should really ask the handler directly.
100321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    if (!process_startup && !net::URLRequest::IsHandledURL(tabs[i].url))
1004513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      continue;
1005513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1006ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    int add_types = first_tab ? TabStripModel::ADD_ACTIVE :
1007513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                TabStripModel::ADD_NONE;
1008513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    add_types |= TabStripModel::ADD_FORCE_INDEX;
1009513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (tabs[i].is_pinned)
1010513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      add_types |= TabStripModel::ADD_PINNED;
1011513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int index = browser->GetIndexForInsertionDuringRestore(i);
1012513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1013513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    browser::NavigateParams params(browser, tabs[i].url,
1014513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   PageTransition::START_PAGE);
1015513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    params.disposition = first_tab ? NEW_FOREGROUND_TAB : NEW_BACKGROUND_TAB;
1016513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    params.tabstrip_index = index;
1017513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    params.tabstrip_add_types = add_types;
1018513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    params.extension_app_id = tabs[i].app_id;
1019513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    browser::Navigate(&params);
1020513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1021513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    first_tab = false;
1022513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1023513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser->window()->Show();
1024513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // TODO(jcampan): http://crbug.com/8123 we should not need to set the initial
1025513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //                focus explicitly.
1026513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser->GetSelectedTabContents()->view()->SetInitialFocus();
1027513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1028513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return browser;
1029513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1030513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1031dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid BrowserInit::LaunchWithProfile::AddInfoBarsIfNecessary(Browser* browser) {
1032dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!browser || !profile_ || browser->tab_count() == 0)
1033dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
1034dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1035dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  TabContents* tab_contents = browser->GetSelectedTabContents();
1036dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AddCrashedInfoBarIfNecessary(tab_contents);
1037dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AddBadFlagsInfoBarIfNecessary(tab_contents);
1038dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AddDNSCertProvenanceCheckingWarningInfoBarIfNecessary(tab_contents);
1039ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AddObsoleteSystemInfoBarIfNecessary(tab_contents);
1040dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1041dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1042513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserInit::LaunchWithProfile::AddCrashedInfoBarIfNecessary(
1043513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TabContents* tab) {
1044513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Assume that if the user is launching incognito they were previously
1045513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // running incognito so that we have nothing to restore from.
1046513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!profile_->DidLastSessionExitCleanly() &&
1047513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      !profile_->IsOffTheRecord()) {
1048513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // The last session didn't exit cleanly. Show an infobar to the user
1049513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // so that they can restore if they want. The delegate deletes itself when
1050513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // it is closed.
1051513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    tab->AddInfoBar(new SessionCrashedInfoBarDelegate(tab));
1052513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1053513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1054513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1055513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserInit::LaunchWithProfile::AddBadFlagsInfoBarIfNecessary(
1056513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    TabContents* tab) {
1057513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Unsupported flags for which to display a warning that "stability and
1058513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // security will suffer".
1059513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static const char* kBadFlags[] = {
106072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // These imply disabling the sandbox.
1061513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    switches::kSingleProcess,
1062513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    switches::kNoSandbox,
1063513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    switches::kInProcessWebGL,
106472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // These are scary features for developers that shouldn't be turned on
106572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // persistently.
106672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    switches::kEnableNaCl,
1067513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NULL
1068513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
1069513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1070513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const char* bad_flag = NULL;
1071513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (const char** flag = kBadFlags; *flag; ++flag) {
1072513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (command_line_.HasSwitch(*flag)) {
1073513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      bad_flag = *flag;
1074513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      break;
1075513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
1076513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1077513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1078513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (bad_flag) {
107972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    tab->AddInfoBar(new SimpleAlertInfoBarDelegate(tab, NULL,
1080513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        l10n_util::GetStringFUTF16(IDS_BAD_FLAGS_WARNING_MESSAGE,
1081513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   UTF8ToUTF16(std::string("--") + bad_flag)),
108272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        false));
1083513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1084513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1085513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1086ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass LearnMoreInfoBar : public LinkInfoBarDelegate {
1087dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
1088ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  explicit LearnMoreInfoBar(TabContents* tab_contents,
1089ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            const string16& message,
1090ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            const GURL& url);
1091ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~LearnMoreInfoBar();
1092dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1093ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual string16 GetMessageTextWithOffset(size_t* link_offset) const OVERRIDE;
1094ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual string16 GetLinkText() const OVERRIDE;
1095ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE;
1096dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1097ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
1098ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContents* const tab_contents_;
1099ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 message_;
1100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL learn_more_url_;
1101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(LearnMoreInfoBar);
1103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
1104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenLearnMoreInfoBar::LearnMoreInfoBar(TabContents* tab_contents,
1106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   const string16& message,
1107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   const GURL& url)
1108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : LinkInfoBarDelegate(tab_contents),
1109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      tab_contents_(tab_contents),
1110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      message_(message),
1111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      learn_more_url_(url) {
1112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenLearnMoreInfoBar::~LearnMoreInfoBar() {
1115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 LearnMoreInfoBar::GetMessageTextWithOffset(size_t* link_offset) const {
1118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 text = message_;
1119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  text.push_back(' ');  // Add a space before the following link.
1120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  *link_offset = text.size();
1121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return text;
1122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 LearnMoreInfoBar::GetLinkText() const {
1125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
1126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool LearnMoreInfoBar::LinkClicked(WindowOpenDisposition disposition) {
1129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tab_contents_->OpenURL(learn_more_url_, GURL(), disposition,
1130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         PageTransition::LINK);
1131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return false;
1132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// This is the page which provides information on DNS certificate provenance
1135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// checking.
1136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid BrowserInit::LaunchWithProfile::
1137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    AddDNSCertProvenanceCheckingWarningInfoBarIfNecessary(TabContents* tab) {
1138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!command_line_.HasSwitch(switches::kEnableDNSCertProvenanceChecking))
1139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
1140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const char* kLearnMoreURL =
1142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "http://dev.chromium.org/dnscertprovenancechecking";
1143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  string16 message = l10n_util::GetStringUTF16(
1144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      IDS_DNS_CERT_PROVENANCE_CHECKING_WARNING_MESSAGE);
1145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  tab->AddInfoBar(new LearnMoreInfoBar(tab,
1146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       message,
1147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                       GURL(kLearnMoreURL)));
1148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
1149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BrowserInit::LaunchWithProfile::AddObsoleteSystemInfoBarIfNecessary(
1151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    TabContents* tab) {
1152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(TOOLKIT_USES_GTK)
1153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // We've deprecated support for Ubuntu Hardy.  Rather than attempting to
1154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // determine whether you're using that, we instead key off the GTK version;
1155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // this will also deprecate other distributions (including variants of Ubuntu)
1156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // that are of a similar age.
1157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Version key:
1158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //   Ubuntu Hardy: GTK 2.12
1159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //   RHEL 6:       GTK 2.18
1160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //   Ubuntu Lucid: GTK 2.20
1161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (gtk_check_version(2, 18, 0)) {
1162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    string16 message =
1163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        l10n_util::GetStringFUTF16(IDS_SYSTEM_OBSOLETE_MESSAGE,
1164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
1165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Link to an article in the help center on minimum system requirements.
1166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const char* kLearnMoreURL =
1167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        "http://www.google.com/support/chrome/bin/answer.py?answer=95411";
1168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    tab->AddInfoBar(new LearnMoreInfoBar(tab,
1169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         message,
1170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         GURL(kLearnMoreURL)));
1171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
1172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
1173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
1174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1175513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserInit::LaunchWithProfile::AddStartupURLs(
1176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    std::vector<GURL>* startup_urls) const {
1177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If we have urls specified beforehand (i.e. from command line) use them
1178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // and nothing else.
1179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!startup_urls->empty())
1180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
1181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If we have urls specified by the first run master preferences use them
1182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // and nothing else.
1183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (browser_init_) {
1184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (!browser_init_->first_run_tabs_.empty()) {
1185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      std::vector<GURL>::iterator it = browser_init_->first_run_tabs_.begin();
1186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      while (it != browser_init_->first_run_tabs_.end()) {
1187513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        // Replace magic names for the actual urls.
1188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        if (it->host() == "new_tab_page") {
11893dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          startup_urls->push_back(GURL(chrome::kChromeUINewTabURL));
1190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        } else if (it->host() == "welcome_page") {
1191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          startup_urls->push_back(GetWelcomePageURL());
1192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        } else {
1193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          startup_urls->push_back(*it);
1194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        }
1195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        ++it;
1196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
1197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      browser_init_->first_run_tabs_.clear();
1198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      return;
1199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
1200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1202513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Otherwise open at least the new tab page (and the welcome page, if this
1203513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // is the first time the browser is being started), or the set of URLs
1204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // specified on the command line.
1205513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  startup_urls->push_back(GURL());  // New tab page.
1206513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  PrefService* prefs = g_browser_process->local_state();
1207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (prefs->FindPreference(prefs::kShouldShowWelcomePage) &&
1208513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      prefs->GetBoolean(prefs::kShouldShowWelcomePage)) {
1209513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Reset the preference so we don't show the welcome page next time.
1210513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    prefs->ClearPref(prefs::kShouldShowWelcomePage);
1211513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    startup_urls->push_back(GetWelcomePageURL());
1212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1215513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BrowserInit::LaunchWithProfile::CheckDefaultBrowser(Profile* profile) {
1216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // We do not check if we are the default browser if:
1217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // - the user said "don't ask me again" on the infobar earlier.
1218513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // - this is the first launch after the first run flow.
121972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // - There is a policy in control of this setting.
1220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!profile->GetPrefs()->GetBoolean(prefs::kCheckDefaultBrowser) ||
1221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      FirstRun::IsChromeFirstRun()) {
1222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return;
1223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
122472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (g_browser_process->local_state()->IsManagedPreference(
122572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      prefs::kDefaultBrowserSettingEnabled)) {
122672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (g_browser_process->local_state()->GetBoolean(
122772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        prefs::kDefaultBrowserSettingEnabled)) {
122872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      BrowserThread::PostTask(
122972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          BrowserThread::FILE, FROM_HERE, NewRunnableFunction(
123072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              &ShellIntegration::SetAsDefaultBrowser));
123172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    } else {
123272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // TODO(pastarmovj): We can't really do anything meaningful here yet but
123372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // just prevent showing the infobar.
123472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
123572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
123672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
1237513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BrowserThread::PostTask(
1238513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      BrowserThread::FILE, FROM_HERE, new CheckDefaultBrowserTask());
1239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1240513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
124172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstd::vector<GURL> BrowserInit::GetURLsFromCommandLine(
124272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const CommandLine& command_line,
124372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const FilePath& cur_dir,
124472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    Profile* profile) {
124572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<GURL> urls;
124672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const std::vector<CommandLine::StringType>& params = command_line.args();
124772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
124872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (size_t i = 0; i < params.size(); ++i) {
124972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    FilePath param = FilePath(params[i]);
125072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Handle Vista way of searching - "? <search-term>"
1251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (param.value().size() > 2 &&
1252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        param.value()[0] == '?' && param.value()[1] == ' ') {
125372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const TemplateURL* default_provider =
125472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          profile->GetTemplateURLModel()->GetDefaultSearchProvider();
1255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (default_provider && default_provider->url()) {
1256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const TemplateURLRef* search_url = default_provider->url();
1257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        DCHECK(search_url->SupportsReplacement());
1258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        string16 search_term = param.LossyDisplayName().substr(2);
1259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        urls.push_back(GURL(search_url->ReplaceSearchTerms(
1260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                *default_provider, search_term,
1261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                TemplateURLRef::NO_SUGGESTIONS_AVAILABLE,
1262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                string16())));
126372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        continue;
126472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
1265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Otherwise, fall through to treating it as a URL.
1268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // This will create a file URL or a regular URL.
1270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // This call can (in rare circumstances) block the UI thread.
1271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Allow it until this bug is fixed.
1272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    //  http://code.google.com/p/chromium/issues/detail?id=60641
1273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    GURL url;
1274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    {
1275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      base::ThreadRestrictions::ScopedAllowIO allow_io;
1276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      url = URLFixerUpper::FixupRelativeFile(cur_dir, param);
1277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
1278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Exclude dangerous schemes.
1279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (url.is_valid()) {
1280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ChildProcessSecurityPolicy *policy =
1281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          ChildProcessSecurityPolicy::GetInstance();
1282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (policy->IsWebSafeScheme(url.scheme()) ||
1283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          url.SchemeIs(chrome::kFileScheme) ||
128472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_CHROMEOS)
1285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          // In ChromeOS, allow a settings page to be specified on the
1286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          // command line. See ExistingUserController::OnLoginSuccess.
1287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          (url.spec().find(chrome::kChromeUISettingsURL) == 0) ||
128872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
1289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          (url.spec().compare(chrome::kAboutBlankURL) == 0)) {
1290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        urls.push_back(url);
129172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      }
129272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
129372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
129472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return urls;
129572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
129672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1297513209b27ff55e2841eac0e4120199c23acce758Ben Murdochbool BrowserInit::ProcessCmdLineImpl(const CommandLine& command_line,
1298513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     const FilePath& cur_dir,
1299513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     bool process_startup,
1300513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     Profile* profile,
1301513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     int* return_code,
1302513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     BrowserInit* browser_init) {
1303513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DCHECK(profile);
1304513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (process_startup) {
1305513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (command_line.HasSwitch(switches::kDisablePromptOnRepost))
1306513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      NavigationController::DisablePromptOnRepost();
1307513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1308513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Look for the testing channel ID ONLY during process startup
1309513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (command_line.HasSwitch(switches::kTestingChannelID)) {
1310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      std::string testing_channel_id = command_line.GetSwitchValueASCII(
1311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          switches::kTestingChannelID);
1312513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // TODO(sanjeevr) Check if we need to make this a singleton for
1313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // compatibility with the old testing code
1314513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // If there are any extra parameters, we expect each one to generate a
1315513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // new tab; if there are none then we get one homepage tab.
1316513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      int expected_tab_count = 1;
1317513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      if (command_line.HasSwitch(switches::kNoStartupWindow)) {
1318513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        expected_tab_count = 0;
131972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_CHROMEOS)
132072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // kLoginManager will cause Chrome to start up with the ChromeOS login
132172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      // screen instead of a browser window, so it won't load any tabs.
132272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      } else if (command_line.HasSwitch(switches::kLoginManager)) {
132372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        expected_tab_count = 0;
132472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
1325513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      } else if (command_line.HasSwitch(switches::kRestoreLastSession)) {
1326513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        std::string restore_session_value(
1327513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch            command_line.GetSwitchValueASCII(switches::kRestoreLastSession));
1328513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        base::StringToInt(restore_session_value, &expected_tab_count);
1329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      } else {
133072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        std::vector<GURL> urls_to_open = GetURLsFromCommandLine(
133172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            command_line, cur_dir, profile);
1332513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        expected_tab_count =
133372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            std::max(1, static_cast<int>(urls_to_open.size()));
1334513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      }
1335201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (!CreateAutomationProvider<TestingAutomationProvider>(
1336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          testing_channel_id,
1337513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          profile,
1338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          static_cast<size_t>(expected_tab_count)))
1339201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        return false;
1340513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
1341513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1342513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1343513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool silent_launch = false;
1344513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1345513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line.HasSwitch(switches::kAutomationClientChannelID)) {
1346513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    std::string automation_channel_id = command_line.GetSwitchValueASCII(
1347513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        switches::kAutomationClientChannelID);
1348513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // If there are any extra parameters, we expect each one to generate a
1349513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // new tab; if there are none then we have no tabs
135072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::vector<GURL> urls_to_open = GetURLsFromCommandLine(
135172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        command_line, cur_dir, profile);
1352513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    size_t expected_tabs =
135372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        std::max(static_cast<int>(urls_to_open.size()), 0);
1354513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (expected_tabs == 0)
1355513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      silent_launch = true;
1356513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1357513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (command_line.HasSwitch(switches::kChromeFrame)) {
1358201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (!CreateAutomationProvider<ChromeFrameAutomationProvider>(
1359201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          automation_channel_id, profile, expected_tabs))
1360201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        return false;
1361513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else {
1362201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (!CreateAutomationProvider<AutomationProvider>(
1363201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          automation_channel_id, profile, expected_tabs))
1364201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        return false;
1365513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
1366513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1367513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1368513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If we have been invoked to display a desktop notification on behalf of
1369513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // the service process, we do not want to open any browser windows.
1370513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line.HasSwitch(switches::kNotifyCloudPrintTokenExpired)) {
1371513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    silent_launch = true;
1372513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    profile->GetCloudPrintProxyService()->ShowTokenExpiredNotification();
1373513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
137572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // If we are just displaying a print dialog we shouldn't open browser
137672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // windows.
1377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (print_dialog_cloud::CreatePrintDialogFromCommandLine(command_line)) {
137872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    silent_launch = true;
137972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
138072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1381513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line.HasSwitch(switches::kExplicitlyAllowedPorts)) {
1382513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    std::string allowed_ports =
1383513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        command_line.GetSwitchValueASCII(switches::kExplicitlyAllowedPorts);
1384513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    net::SetExplicitlyAllowedPorts(allowed_ports);
1385513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1386513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1387513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_CHROMEOS)
1388513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The browser will be launched after the user logs in.
1389513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (command_line.HasSwitch(switches::kLoginManager) ||
1390513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      command_line.HasSwitch(switches::kLoginPassword)) {
1391513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    silent_launch = true;
1392513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1393513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
1394513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1395201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(HAVE_XINPUT2) && defined(TOUCH_UI)
1396201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Get a list of pointer-devices that should be treated as touch-devices.
1397201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // TODO(sad): Instead of/in addition to getting the list from the
1398201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // command-line, query X for a list of touch devices.
1399201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string touch_devices =
1400201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    command_line.GetSwitchValueASCII(switches::kTouchDevices);
1401201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1402201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!touch_devices.empty()) {
1403201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<std::string> devs;
1404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    std::vector<unsigned int> device_ids;
1405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    unsigned int devid;
1406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    base::SplitString(touch_devices, ',', &devs);
1407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    for (std::vector<std::string>::iterator iter = devs.begin();
1408201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        iter != devs.end(); ++iter) {
1409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (base::StringToInt(*iter, reinterpret_cast<int*>(&devid))) {
1410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        device_ids.push_back(devid);
1411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      } else {
1412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        DLOG(WARNING) << "Invalid touch-device id: " << *iter;
1413201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      }
1414201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
1415201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    views::SetTouchDeviceList(device_ids);
1416201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
1417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif
1418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1419513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If we don't want to launch a new browser window or tab (in the case
1420513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // of an automation request), we are done here.
1421513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!silent_launch) {
1422513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return browser_init->LaunchBrowser(
1423513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        command_line, profile, cur_dir, process_startup, return_code);
1424513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
1425513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return true;
1426513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1427513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1428513209b27ff55e2841eac0e4120199c23acce758Ben Murdochtemplate <class AutomationProviderClass>
1429201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochbool BrowserInit::CreateAutomationProvider(const std::string& channel_id,
1430513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                           Profile* profile,
1431513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                           size_t expected_tabs) {
1432513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<AutomationProviderClass> automation =
1433513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      new AutomationProviderClass(profile);
1434201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1435201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (!automation->InitializeChannel(channel_id))
1436201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return false;
1437513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  automation->SetExpectedTabCount(expected_tabs);
1438513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1439513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutomationProviderList* list =
1440513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      g_browser_process->InitAutomationProviderList();
1441513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DCHECK(list);
1442513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  list->AddProvider(automation);
1443201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return true;
1445513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
1446