#include "components/headless/command_handler/headless_command_handler.h"
#include <cstdint>
#include <iostream>
#include <string>
#include <string_view>
#include <utility>
#include <vector>
#include "base/base64.h"
#include "base/command_line.h"
#include "base/containers/adapters.h"
#include "base/containers/fixed_flat_map.h"
#include "base/containers/span.h"
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/json/json_writer.h"
#include "base/logging.h"
#include "base/no_destructor.h"
#include "base/path_service.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/task_traits.h"
#include "base/task/thread_pool.h"
#include "build/build_config.h"
#include "components/headless/command_handler/grit/headless_command_resources.h"
#include "components/headless/command_handler/headless_command_switches.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_data_source.h"
#include "content/public/common/content_switches.h"
#include "ui/base/resource/resource_bundle.h"
namespace headless {
namespace {
const char kDefaultScreenshotFileName[] = …;
const char kDefaultPDFFileName[] = …;
const char kChromeHeadlessHost[] = …;
const char kChromeHeadlessURL[] = …;
const char kHeadlessCommandHtml[] = …;
const char kHeadlessCommandJs[] = …;
const char kWindowSize[] = …;
HeadlessCommandHandler::DoneCallback& GetGlobalDoneCallback() { … }
void EnsureHeadlessCommandResources() { … }
void CreateAndAddHeadlessHostDataSource(
content::BrowserContext* browser_context) { … }
base::Value::Dict GetColorDictFromHexColor(uint32_t color, bool has_alpha) { … }
bool ParseWindowSize(const std::string& window_size, int* width, int* height) { … }
bool GetCommandDictAndOutputPaths(base::Value::Dict* commands,
base::FilePath* pdf_file_path,
base::FilePath* screenshot_file_path) { … }
bool WriteFileTask(base::FilePath file_path, std::string file_data) { … }
}
HeadlessCommandHandler::HeadlessCommandHandler(
content::WebContents* web_contents,
GURL target_url,
DoneCallback done_callback,
scoped_refptr<base::SequencedTaskRunner> io_task_runner)
: … { … }
HeadlessCommandHandler::~HeadlessCommandHandler() = default;
GURL HeadlessCommandHandler::GetHandlerUrl() { … }
bool HeadlessCommandHandler::HasHeadlessCommandSwitches(
const base::CommandLine& command_line) { … }
void HeadlessCommandHandler::ProcessCommands(
content::WebContents* web_contents,
GURL target_url,
DoneCallback done_callback,
scoped_refptr<base::SequencedTaskRunner> io_task_runner) { … }
void HeadlessCommandHandler::DocumentOnLoadCompletedInPrimaryMainFrame() { … }
void HeadlessCommandHandler::WebContentsDestroyed() { … }
void HeadlessCommandHandler::OnTargetCrashed(const base::Value::Dict&) { … }
void HeadlessCommandHandler::OnCommandsResult(base::Value::Dict result) { … }
void HeadlessCommandHandler::WriteFile(base::FilePath file_path,
std::string base64_file_data) { … }
void HeadlessCommandHandler::OnWriteFileDone(bool success) { … }
void HeadlessCommandHandler::PostDone() { … }
void HeadlessCommandHandler::Done() { … }
void HeadlessCommandHandler::SetDoneCallbackForTesting(
DoneCallback done_callback) { … }
}