| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/headless/headless_mode_util.h" |
| |
| #include "build/build_config.h" |
| #include "ui/gfx/switches.h" |
| |
| // New headless mode is available on Linux, Windows and Mac platforms. |
| // More platforms will be added later, so avoid function level clutter |
| // by providing stub implementations at the end of the file. |
| #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) |
| |
| #include "base/base_switches.h" |
| |
| #if BUILDFLAG(IS_LINUX) |
| #include "ui/gl/gl_switches.h" |
| #include "ui/ozone/public/ozone_switches.h" |
| #endif // BUILDFLAG(IS_LINUX) |
| |
| namespace headless { |
| |
| namespace { |
| const char kNewHeadlessModeSwitchValue[] = "new"; |
| const char kOldHeadlessModeSwitchValue[] = "old"; |
| |
| enum HeadlessMode { |
| kNoHeadlessMode, |
| kOldHeadlessMode, |
| kNewHeadlessMode, |
| kDefaultHeadlessMode = kOldHeadlessMode |
| }; |
| |
| HeadlessMode GetHeadlessMode() { |
| base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
| if (!command_line->HasSwitch(switches::kHeadless)) |
| return kNoHeadlessMode; |
| |
| std::string switch_value = |
| command_line->GetSwitchValueASCII(switches::kHeadless); |
| if (switch_value == kOldHeadlessModeSwitchValue) |
| return kOldHeadlessMode; |
| if (switch_value == kNewHeadlessModeSwitchValue) |
| return kNewHeadlessMode; |
| |
| return kDefaultHeadlessMode; |
| } |
| |
| } // namespace |
| |
| bool IsHeadlessMode() { |
| return GetHeadlessMode() == kNewHeadlessMode; |
| } |
| |
| bool IsOldHeadlessMode() { |
| return GetHeadlessMode() == kOldHeadlessMode; |
| } |
| |
| void SetUpCommandLine(const base::CommandLine* command_line) { |
| DCHECK(IsHeadlessMode()); |
| // Enable unattended mode. |
| if (!command_line->HasSwitch(::switches::kNoErrorDialogs)) { |
| base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| ::switches::kNoErrorDialogs); |
| } |
| #if BUILDFLAG(IS_LINUX) |
| // Headless mode on Linux relies on ozone/headless platform. |
| base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| ::switches::kOzonePlatform, switches::kHeadless); |
| if (!command_line->HasSwitch(switches::kOzoneOverrideScreenSize)) { |
| base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| switches::kOzoneOverrideScreenSize, "800,600"); |
| } |
| // If Ozone/Headless is enabled, Vulkan initialization crashes unless |
| // Angle implementation is specified explicitly. |
| if (!command_line->HasSwitch(switches::kUseGL) && |
| !command_line->HasSwitch(switches::kUseANGLE)) { |
| base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
| switches::kUseANGLE, gl::kANGLEImplementationSwiftShaderForWebGLName); |
| } |
| #endif // BUILDFLAG(IS_LINUX) |
| } |
| |
| } // namespace headless |
| |
| #else // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) |
| |
| namespace headless { |
| |
| bool IsHeadlessMode() { |
| return false; |
| } |
| |
| bool IsOldHeadlessMode() { |
| // In addition to Linux, Windows and Mac (which are handled above), |
| // the old headless mode is also supported on ChromeOS, see chrome_main.cc. |
| #if BUILDFLAG(IS_CHROMEOS) |
| base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
| return command_line->HasSwitch(switches::kHeadless); |
| #else |
| return false; |
| #endif |
| } |
| |
| void SetUpCommandLine(const base::CommandLine* command_line) {} |
| |
| } // namespace headless |
| |
| #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) |