blob: 4d917de42536a010018b42e125112a44db01fad5 [file] [log] [blame]
// Copyright 2018 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 "fuchsia/engine/web_engine_main_delegate.h"
#include <utility>
#include "base/base_paths.h"
#include "base/base_paths_fuchsia.h"
#include "base/command_line.h"
#include "base/files/file_util.h"
#include "base/fuchsia/intl_profile_watcher.h"
#include "base/path_service.h"
#include "content/public/common/content_switches.h"
#include "fuchsia/base/init_logging.h"
#include "fuchsia/engine/browser/web_engine_browser_main.h"
#include "fuchsia/engine/browser/web_engine_content_browser_client.h"
#include "fuchsia/engine/common/cors_exempt_headers.h"
#include "fuchsia/engine/common/web_engine_content_client.h"
#include "fuchsia/engine/renderer/web_engine_content_renderer_client.h"
#include "fuchsia/engine/switches.h"
#include "google_apis/google_api_keys.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/ui_base_paths.h"
namespace {
WebEngineMainDelegate* g_current_web_engine_main_delegate = nullptr;
void InitializeResources() {
constexpr char kWebUiResourcesPakPath[] = "ui/resources/webui_resources.pak";
constexpr char kWebUiGeneratedResourcesPakPath[] =
"ui/resources/webui_generated_resources.pak";
// TODO(1164990): Update //ui's DIR_LOCALES to use DIR_ASSETS, rather than
// using Override() here.
base::FilePath asset_root;
bool result = base::PathService::Get(base::DIR_ASSETS, &asset_root);
DCHECK(result);
const base::FilePath locales_path = asset_root.AppendASCII("locales");
result = base::PathService::Override(ui::DIR_LOCALES, locales_path);
DCHECK(result);
// Initialize common locale-agnostic resources.
const std::string locale = ui::ResourceBundle::InitSharedInstanceWithLocale(
base::i18n::GetConfiguredLocale(), nullptr,
ui::ResourceBundle::LOAD_COMMON_RESOURCES);
VLOG(1) << "Loaded resources including locale: " << locale;
// Conditionally load WebUI resource PAK if visible from namespace.
const base::FilePath webui_resources_path =
asset_root.Append(kWebUiResourcesPakPath);
if (base::PathExists(webui_resources_path)) {
ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(
webui_resources_path, ui::SCALE_FACTOR_NONE);
}
const base::FilePath webui_generated_resources_path =
asset_root.Append(kWebUiGeneratedResourcesPakPath);
if (base::PathExists(webui_generated_resources_path)) {
ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(
webui_generated_resources_path, ui::SCALE_FACTOR_NONE);
}
}
} // namespace
// static
WebEngineMainDelegate* WebEngineMainDelegate::GetInstanceForTest() {
return g_current_web_engine_main_delegate;
}
WebEngineMainDelegate::WebEngineMainDelegate(
fidl::InterfaceRequest<fuchsia::web::Context> request)
: request_(std::move(request)) {
g_current_web_engine_main_delegate = this;
}
WebEngineMainDelegate::~WebEngineMainDelegate() = default;
bool WebEngineMainDelegate::BasicStartupComplete(int* exit_code) {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (!cr_fuchsia::InitLoggingFromCommandLine(*command_line)) {
*exit_code = 1;
return true;
}
if (command_line->HasSwitch(switches::kGoogleApiKey)) {
google_apis::SetAPIKey(
command_line->GetSwitchValueASCII(switches::kGoogleApiKey));
}
SetCorsExemptHeaders(base::SplitString(
base::CommandLine::ForCurrentProcess()->GetSwitchValueNative(
switches::kCorsExemptHeaders),
",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY));
return false;
}
void WebEngineMainDelegate::PreSandboxStartup() {
// Early during startup, configure the process with the primary locale and
// load resources. If locale-specific resources are loaded then they must be
// explicitly reloaded after each change to the primary locale.
// In the browser process the locale determines the accept-language header
// contents, and is supplied to renderers for Blink to report to web content.
std::string initial_locale =
base::FuchsiaIntlProfileWatcher::GetPrimaryLocaleIdForInitialization();
base::i18n::SetICUDefaultLocale(initial_locale);
InitializeResources();
}
int WebEngineMainDelegate::RunProcess(
const std::string& process_type,
const content::MainFunctionParams& main_function_params) {
if (!process_type.empty())
return -1;
return WebEngineBrowserMain(main_function_params);
}
content::ContentClient* WebEngineMainDelegate::CreateContentClient() {
content_client_ = std::make_unique<WebEngineContentClient>();
return content_client_.get();
}
content::ContentBrowserClient*
WebEngineMainDelegate::CreateContentBrowserClient() {
DCHECK(!browser_client_);
browser_client_ =
std::make_unique<WebEngineContentBrowserClient>(std::move(request_));
return browser_client_.get();
}
content::ContentRendererClient*
WebEngineMainDelegate::CreateContentRendererClient() {
renderer_client_ = std::make_unique<WebEngineContentRendererClient>();
return renderer_client_.get();
}