132 lines
5.1 KiB
C++
132 lines
5.1 KiB
C++
// Copyright 2022 The Chromium Authors and Alex313031. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "chrome/browser/ui/startup/infobar_utils.h"
|
|
|
|
#include "base/command_line.h"
|
|
#include "build/buildflag.h"
|
|
#include "build/chromeos_buildflags.h"
|
|
#include "chrome/browser/browser_process.h"
|
|
#include "chrome/browser/obsolete_system/obsolete_system.h"
|
|
#include "chrome/browser/profiles/profile.h"
|
|
#include "chrome/browser/ui/browser.h"
|
|
#include "chrome/browser/ui/session_crashed_bubble.h"
|
|
#include "chrome/browser/ui/startup/automation_infobar_delegate.h"
|
|
#include "chrome/browser/ui/startup/bad_flags_prompt.h"
|
|
#include "chrome/browser/ui/startup/default_browser_prompt.h"
|
|
#include "chrome/browser/ui/startup/google_api_keys_infobar_delegate.h"
|
|
#include "chrome/browser/ui/startup/obsolete_system_infobar_delegate.h"
|
|
#include "chrome/browser/ui/startup/startup_browser_creator.h"
|
|
#include "chrome/browser/ui/startup/startup_types.h"
|
|
#include "chrome/common/chrome_switches.h"
|
|
#include "chrome/common/pref_names.h"
|
|
#include "components/infobars/content/content_infobar_manager.h"
|
|
#include "components/prefs/pref_service.h"
|
|
#include "content/public/common/content_switches.h"
|
|
#include "google_apis/google_api_keys.h"
|
|
|
|
namespace {
|
|
bool ShouldShowBadFlagsSecurityWarnings() {
|
|
#if !BUILDFLAG(IS_CHROMEOS_ASH)
|
|
PrefService* local_state = g_browser_process->local_state();
|
|
if (!local_state)
|
|
return true;
|
|
|
|
const auto* pref = local_state->FindPreference(
|
|
prefs::kCommandLineFlagSecurityWarningsEnabled);
|
|
DCHECK(pref);
|
|
|
|
// The warnings can only be disabled by policy. Default to show warnings.
|
|
if (pref->IsManaged())
|
|
return pref->GetValue()->GetBool();
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
// This is a separate function to avoid accidentally reading the switch from
|
|
// `startup_command_line`.
|
|
bool IsAutomationEnabled() {
|
|
return base::CommandLine::ForCurrentProcess()->HasSwitch(
|
|
switches::kEnableAutomation);
|
|
}
|
|
|
|
// This is a separate function to avoid accidentally reading the switch from
|
|
// `startup_command_line`.
|
|
bool IsKioskModeEnabled() {
|
|
return base::CommandLine::ForCurrentProcess()->HasSwitch(
|
|
switches::kKioskMode);
|
|
}
|
|
|
|
} // namespace
|
|
|
|
void AddInfoBarsIfNecessary(Browser* browser,
|
|
Profile* profile,
|
|
const base::CommandLine& startup_command_line,
|
|
chrome::startup::IsFirstRun is_first_run,
|
|
bool is_web_app) {
|
|
if (!browser || !profile || browser->tab_strip_model()->count() == 0)
|
|
return;
|
|
|
|
// Show the Automation info bar unless it has been disabled by policy.
|
|
bool show_bad_flags_security_warnings = ShouldShowBadFlagsSecurityWarnings();
|
|
if (IsAutomationEnabled() && show_bad_flags_security_warnings) {
|
|
AutomationInfoBarDelegate::Create();
|
|
}
|
|
|
|
// Do not show any other info bars in Kiosk mode, because it's unlikely that
|
|
// the viewer can act upon or dismiss them.
|
|
if (IsKioskModeEnabled())
|
|
return;
|
|
|
|
// Web apps should not display the session restore bubble (crbug.com/1264121)
|
|
if (!is_web_app && HasPendingUncleanExit(browser->profile()))
|
|
SessionCrashedBubble::ShowIfNotOffTheRecordProfile(
|
|
browser, /*skip_tab_checking=*/false);
|
|
|
|
// These info bars are not shown when the browser is being controlled by
|
|
// automated tests, so that they don't interfere with tests that assume no
|
|
// info bars.
|
|
if (!startup_command_line.HasSwitch(switches::kTestType) &&
|
|
!IsAutomationEnabled()) {
|
|
// The below info bars are only added to the first profile which is
|
|
// launched. Other profiles might be restoring the browsing sessions
|
|
// asynchronously, so we cannot add the info bars to the focused tabs here.
|
|
//
|
|
// We cannot use `chrome::startup::IsProcessStartup` to determine whether
|
|
// this is the first profile that launched: The browser may be started
|
|
// without a startup window (`kNoStartupWindow`), or open the profile
|
|
// picker, which means that `chrome::startup::IsProcessStartup` will already
|
|
// be `kNo` when the first browser window is opened.
|
|
static bool infobars_shown = false;
|
|
if (infobars_shown)
|
|
return;
|
|
infobars_shown = true;
|
|
|
|
content::WebContents* web_contents =
|
|
browser->tab_strip_model()->GetActiveWebContents();
|
|
DCHECK(web_contents);
|
|
|
|
if (show_bad_flags_security_warnings)
|
|
chrome::ShowBadFlagsPrompt(web_contents);
|
|
|
|
infobars::ContentInfoBarManager* infobar_manager =
|
|
infobars::ContentInfoBarManager::FromWebContents(web_contents);
|
|
|
|
if (ObsoleteSystem::IsObsoleteNowOrSoon()) {
|
|
PrefService* local_state = g_browser_process->local_state();
|
|
if (!local_state ||
|
|
!local_state->GetBoolean(prefs::kSuppressUnsupportedOSWarning))
|
|
ObsoleteSystemInfoBarDelegate::Create(infobar_manager);
|
|
}
|
|
|
|
#if !BUILDFLAG(IS_CHROMEOS_ASH)
|
|
if (!is_web_app &&
|
|
!startup_command_line.HasSwitch(switches::kNoDefaultBrowserCheck)) {
|
|
// The default browser prompt should only be shown after the first run.
|
|
if (is_first_run == chrome::startup::IsFirstRun::kNo)
|
|
ShowDefaultBrowserPrompt(profile);
|
|
}
|
|
#endif
|
|
}
|
|
}
|