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(¶ms); 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