blob: bc65269b858862a99fb208e2a0405c8b8f853d85 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "headless/public/headless_browser.h"
#include <utility>
#include "build/build_config.h"
#include "content/public/common/user_agent.h"
#include "headless/public/version.h"
#include "ui/gl/gl_switches.h"
#if defined(OS_WIN)
#include "sandbox/win/src/sandbox_types.h"
#endif
using Options = headless::HeadlessBrowser::Options;
using Builder = headless::HeadlessBrowser::Options::Builder;
namespace headless {
namespace {
// Product name for building the default user agent string.
const char kHeadlessProductName[] = "HeadlessChrome";
constexpr gfx::Size kDefaultWindowSize(800, 600);
constexpr gfx::FontRenderParams::Hinting kDefaultFontRenderHinting =
gfx::FontRenderParams::Hinting::HINTING_FULL;
std::string GetProductNameAndVersion() {
return std::string(kHeadlessProductName) + "/" + PRODUCT_VERSION;
}
} // namespace
Options::Options(int argc, const char** argv)
: argc(argc),
argv(argv),
gl_implementation(gl::kGLImplementationSwiftShaderForWebGLName),
angle_implementation(gl::kANGLEImplementationNoneName),
product_name_and_version(GetProductNameAndVersion()),
user_agent(content::BuildUserAgentFromProduct(product_name_and_version)),
window_size(kDefaultWindowSize),
font_render_hinting(kDefaultFontRenderHinting) {
#if (defined(OS_LINUX) && !defined(USE_OZONE)) || defined(OS_WIN)
gl_implementation = gl::kGLImplementationANGLEName;
angle_implementation = gl::kANGLEImplementationSwiftShaderForWebGLName;
#endif
}
Options::Options(Options&& options) = default;
Options::~Options() = default;
Options& Options::operator=(Options&& options) = default;
bool Options::DevtoolsServerEnabled() {
return (devtools_pipe_enabled || !devtools_endpoint.IsEmpty());
}
Builder::Builder(int argc, const char** argv) : options_(argc, argv) {}
Builder::Builder() : options_(0, nullptr) {}
Builder::~Builder() = default;
Builder& Builder::SetProductNameAndVersion(
const std::string& product_name_and_version) {
options_.product_name_and_version = product_name_and_version;
return *this;
}
Builder& Builder::SetUserAgent(const std::string& user_agent) {
options_.user_agent = user_agent;
return *this;
}
Builder& Builder::SetAcceptLanguage(const std::string& accept_language) {
options_.accept_language = accept_language;
return *this;
}
Builder& Builder::SetEnableBeginFrameControl(bool enable_begin_frame_control) {
options_.enable_begin_frame_control = enable_begin_frame_control;
return *this;
}
Builder& Builder::EnableDevToolsServer(const net::HostPortPair& endpoint) {
options_.devtools_endpoint = endpoint;
return *this;
}
Builder& Builder::EnableDevToolsPipe() {
options_.devtools_pipe_enabled = true;
return *this;
}
Builder& Builder::SetMessagePump(base::MessagePump* message_pump) {
options_.message_pump = message_pump;
return *this;
}
Builder& Builder::SetProxyConfig(
std::unique_ptr<net::ProxyConfig> proxy_config) {
options_.proxy_config = std::move(proxy_config);
return *this;
}
Builder& Builder::SetSingleProcessMode(bool single_process_mode) {
options_.single_process_mode = single_process_mode;
return *this;
}
Builder& Builder::SetDisableSandbox(bool disable_sandbox) {
options_.disable_sandbox = disable_sandbox;
return *this;
}
Builder& Builder::SetEnableResourceScheduler(bool enable_resource_scheduler) {
options_.enable_resource_scheduler = enable_resource_scheduler;
return *this;
}
Builder& Builder::SetGLImplementation(const std::string& gl_implementation) {
options_.gl_implementation = gl_implementation;
return *this;
}
Builder& Builder::SetANGLEImplementation(
const std::string& angle_implementation) {
options_.angle_implementation = angle_implementation;
return *this;
}
Builder& Builder::SetAppendCommandLineFlagsCallback(
const Options::AppendCommandLineFlagsCallback& callback) {
options_.append_command_line_flags_callback = callback;
return *this;
}
#if defined(OS_WIN)
Builder& Builder::SetInstance(HINSTANCE instance) {
options_.instance = instance;
return *this;
}
Builder& Builder::SetSandboxInfo(sandbox::SandboxInterfaceInfo* sandbox_info) {
options_.sandbox_info = sandbox_info;
return *this;
}
#endif // defined(OS_WIN)
Builder& Builder::SetUserDataDir(const base::FilePath& user_data_dir) {
options_.user_data_dir = user_data_dir;
return *this;
}
Builder& Builder::SetWindowSize(const gfx::Size& window_size) {
options_.window_size = window_size;
return *this;
}
Builder& Builder::SetIncognitoMode(bool incognito_mode) {
options_.incognito_mode = incognito_mode;
return *this;
}
Builder& Builder::SetSitePerProcess(bool site_per_process) {
options_.site_per_process = site_per_process;
return *this;
}
Builder& Builder::SetBlockNewWebContents(bool block_new_web_contents) {
options_.block_new_web_contents = block_new_web_contents;
return *this;
}
Builder& Builder::SetOverrideWebPreferencesCallback(
base::RepeatingCallback<void(blink::web_pref::WebPreferences*)> callback) {
options_.override_web_preferences_callback = std::move(callback);
return *this;
}
Builder& Builder::SetCrashReporterEnabled(bool enabled) {
options_.enable_crash_reporter = enabled;
return *this;
}
Builder& Builder::SetCrashDumpsDir(const base::FilePath& dir) {
options_.crash_dumps_dir = dir;
return *this;
}
Builder& Builder::SetFontRenderHinting(
gfx::FontRenderParams::Hinting font_render_hinting) {
options_.font_render_hinting = font_render_hinting;
return *this;
}
Options Builder::Build() {
return std::move(options_);
}
} // namespace headless