blob: 3be6b4d2a7b9cdb714aa2d8e469be0dfad6bb7d0 [file] [log] [blame]
// Copyright (c) 2012 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 "chrome/utility/chrome_content_utility_client.h"
#include <stddef.h>
#include <utility>
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/lazy_instance.h"
#include "chrome/utility/browser_exposed_utility_interfaces.h"
#include "chrome/utility/services.h"
#include "services/service_manager/sandbox/switches.h"
#if BUILDFLAG(ENABLE_PRINT_PREVIEW) && defined(OS_WIN)
#include "chrome/utility/printing_handler.h"
#endif
namespace {
base::LazyInstance<ChromeContentUtilityClient::NetworkBinderCreationCallback>::
Leaky g_network_binder_creation_callback = LAZY_INSTANCE_INITIALIZER;
} // namespace
ChromeContentUtilityClient::ChromeContentUtilityClient()
: utility_process_running_elevated_(false) {
#if BUILDFLAG(ENABLE_PRINT_PREVIEW) && defined(OS_WIN)
printing_handler_ = std::make_unique<printing::PrintingHandler>();
#endif
}
ChromeContentUtilityClient::~ChromeContentUtilityClient() = default;
void ChromeContentUtilityClient::ExposeInterfacesToBrowser(
mojo::BinderMap* binders) {
#if defined(OS_WIN)
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
utility_process_running_elevated_ = command_line->HasSwitch(
service_manager::switches::kNoSandboxAndElevatedPrivileges);
#endif
// If our process runs with elevated privileges, only add elevated Mojo
// interfaces to the BinderMap.
//
// NOTE: Do not add interfaces directly from within this method. Instead,
// modify the definition of |ExposeElevatedChromeUtilityInterfacesToBrowser()|
// to ensure security review coverage.
if (!utility_process_running_elevated_)
ExposeElevatedChromeUtilityInterfacesToBrowser(binders);
}
bool ChromeContentUtilityClient::OnMessageReceived(
const IPC::Message& message) {
if (utility_process_running_elevated_)
return false;
#if BUILDFLAG(ENABLE_PRINT_PREVIEW) && defined(OS_WIN)
if (printing_handler_->OnMessageReceived(message))
return true;
#endif
return false;
}
void ChromeContentUtilityClient::RegisterNetworkBinders(
service_manager::BinderRegistry* registry) {
if (g_network_binder_creation_callback.Get())
std::move(g_network_binder_creation_callback.Get()).Run(registry);
}
mojo::ServiceFactory*
ChromeContentUtilityClient::GetMainThreadServiceFactory() {
if (utility_process_running_elevated_)
return ::GetElevatedMainThreadServiceFactory();
return ::GetMainThreadServiceFactory();
}
mojo::ServiceFactory* ChromeContentUtilityClient::GetIOThreadServiceFactory() {
return ::GetIOThreadServiceFactory();
}
// static
void ChromeContentUtilityClient::SetNetworkBinderCreationCallback(
NetworkBinderCreationCallback callback) {
g_network_binder_creation_callback.Get() = std::move(callback);
}