| // 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); |
| } |