15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chrome_browser_main_linux.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/linux_util.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/breakpad_linux.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/browser_process.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/metrics/metrics_service.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/env_vars.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings_names.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/storage_monitor/storage_monitor_linux.h" 264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "chrome/browser/sxs_linux.h" 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/browser_thread.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetLinuxDistroCallback() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::GetLinuxDistro(); // Initialize base::linux_distro if needed. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsCrashReportingEnabled(const PrefService* local_state) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we should initialize the crash reporter. It may be disabled 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // through configuration policy or user preference. It must be disabled for 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guest mode on Chrome OS in Stable channel. 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Also allow crash reporting to be enabled with a command-line flag if the 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // crash service is under control of the user. It is used by QA 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // testing infrastructure to switch on generation of crash reports. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_switch = true; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Convert #define to a variable so that we can use if() rather than 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // #if below and so at least compile-test the Chrome code in 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Chromium builds. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(GOOGLE_CHROME_BUILD) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_chrome_build = true; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_chrome_build = false; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check these settings in Chrome builds only, to reduce the chance 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that we accidentally upload crash dumps from Chromium builds. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool breakpad_enabled = false; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_chrome_build) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_guest_session = CommandLine::ForCurrentProcess()->HasSwitch( 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::switches::kGuestSession); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_stable_channel = 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::VersionInfo::GetChannel() == 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::VersionInfo::CHANNEL_STABLE; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(pastarmovj): Consider the TrustedGet here. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool reporting_enabled; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::CrosSettings::Get()->GetBoolean(chromeos::kStatsReportingPref, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &reporting_enabled); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) breakpad_enabled = 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !(is_guest_session && is_stable_channel) && reporting_enabled; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PrefService::Preference* metrics_reporting_enabled = 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_state->FindPreference(prefs::kMetricsReportingEnabled); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(metrics_reporting_enabled); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) breakpad_enabled = local_state->GetBoolean(prefs::kMetricsReportingEnabled); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) use_switch = metrics_reporting_enabled->IsUserModifiable(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (use_switch) { 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Linux Breakpad interferes with the debug stack traces produced 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // by EnableInProcessStackDumping(), used in browser_tests, so we 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // do not allow CHROME_HEADLESS=1 to enable Breakpad in Chromium 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // because the buildbots have CHROME_HEADLESS set. However, we 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // allow CHROME_HEADLESS to enable Breakpad in Chrome for 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // compatibility with Breakpad/Chrome tests that may rely on this. 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(mseaborn): Change tests to use --enable-crash-reporter-for-testing 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // instead. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_chrome_build && !breakpad_enabled) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) breakpad_enabled = getenv(env_vars::kHeadless) != NULL; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!breakpad_enabled) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) breakpad_enabled = CommandLine::ForCurrentProcess()->HasSwitch( 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switches::kEnableCrashReporterForTesting); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return breakpad_enabled; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeBrowserMainPartsLinux::ChromeBrowserMainPartsLinux( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MainFunctionParams& parameters) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ChromeBrowserMainPartsPosix(parameters) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeBrowserMainPartsLinux::~ChromeBrowserMainPartsLinux() { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeBrowserMainPartsLinux::PreProfileInit() { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Needs to be called after we have chrome::DIR_USER_DATA and 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // g_browser_process. This happens in PreCreateThreads. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::PostTask(content::BrowserThread::FILE, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&GetLinuxDistroCallback)); 1174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch 1184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch content::BrowserThread::PostTask( 1194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch content::BrowserThread::FILE, 1204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch FROM_HERE, 1214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch base::Bind(&sxs_linux::AddChannelMarkToUserDataDir)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsCrashReportingEnabled(local_state())) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitCrashReporter(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromeBrowserMainPartsPosix::PreProfileInit(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ChromeBrowserMainPartsLinux::PostProfileInit() { 1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ChromeBrowserMainPartsPosix::PostProfileInit(); 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch g_browser_process->metrics_service()->RecordBreakpadRegistration( 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IsCrashReporterEnabled()); 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 136