blob: 4b2413a20d82e03ece5a7604008a3ebf806da6e7 [file] [log] [blame]
// Copyright 2017 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 "services/service_manager/sandbox/sandbox_type.h"
#include <string>
#include "services/service_manager/sandbox/switches.h"
namespace service_manager {
void SetCommandLineFlagsForSandboxType(base::CommandLine* command_line,
SandboxType sandbox_type) {
switch (sandbox_type) {
case SANDBOX_TYPE_NO_SANDBOX:
command_line->AppendSwitch(switches::kNoSandbox);
break;
case SANDBOX_TYPE_RENDERER:
DCHECK(command_line->GetSwitchValueASCII(switches::kProcessType) ==
switches::kRendererProcess);
break;
case SANDBOX_TYPE_GPU:
DCHECK(command_line->GetSwitchValueASCII(switches::kProcessType) ==
switches::kGpuProcess);
break;
case SANDBOX_TYPE_PPAPI:
if (command_line->GetSwitchValueASCII(switches::kProcessType) ==
switches::kUtilityProcess) {
command_line->AppendSwitchASCII(switches::kServiceSandboxType,
switches::kPpapiSandbox);
} else {
DCHECK(command_line->GetSwitchValueASCII(switches::kProcessType) ==
switches::kPpapiPluginProcess);
}
break;
case SANDBOX_TYPE_UTILITY:
case SANDBOX_TYPE_NETWORK:
case SANDBOX_TYPE_CDM:
case SANDBOX_TYPE_PDF_COMPOSITOR:
case SANDBOX_TYPE_PROFILING:
DCHECK(command_line->GetSwitchValueASCII(switches::kProcessType) ==
switches::kUtilityProcess);
DCHECK(!command_line->HasSwitch(switches::kServiceSandboxType));
command_line->AppendSwitchASCII(
switches::kServiceSandboxType,
StringFromUtilitySandboxType(sandbox_type));
break;
default:
break;
}
}
SandboxType SandboxTypeFromCommandLine(const base::CommandLine& command_line) {
if (command_line.HasSwitch(switches::kNoSandbox))
return SANDBOX_TYPE_NO_SANDBOX;
std::string process_type =
command_line.GetSwitchValueASCII(switches::kProcessType);
if (process_type.empty())
return SANDBOX_TYPE_NO_SANDBOX;
if (process_type == switches::kRendererProcess)
return SANDBOX_TYPE_RENDERER;
if (process_type == switches::kUtilityProcess) {
return UtilitySandboxTypeFromString(
command_line.GetSwitchValueASCII(switches::kServiceSandboxType));
}
if (process_type == switches::kGpuProcess) {
if (command_line.HasSwitch(switches::kDisableGpuSandbox))
return SANDBOX_TYPE_NO_SANDBOX;
return SANDBOX_TYPE_GPU;
}
if (process_type == switches::kPpapiBrokerProcess)
return SANDBOX_TYPE_NO_SANDBOX;
if (process_type == switches::kPpapiPluginProcess)
return SANDBOX_TYPE_PPAPI;
// This is a process which we don't know about.
return SANDBOX_TYPE_INVALID;
}
std::string StringFromUtilitySandboxType(SandboxType sandbox_type) {
switch (sandbox_type) {
case SANDBOX_TYPE_NO_SANDBOX:
return switches::kNoneSandbox;
case SANDBOX_TYPE_NETWORK:
return switches::kNetworkSandbox;
case SANDBOX_TYPE_PPAPI:
return switches::kPpapiSandbox;
case SANDBOX_TYPE_CDM:
return switches::kCdmSandbox;
case SANDBOX_TYPE_PDF_COMPOSITOR:
return switches::kPdfCompositorSandbox;
case SANDBOX_TYPE_PROFILING:
return switches::kProfilingSandbox;
case SANDBOX_TYPE_UTILITY:
return switches::kUtilitySandbox;
default:
NOTREACHED();
return std::string();
}
}
SandboxType UtilitySandboxTypeFromString(const std::string& sandbox_string) {
if (sandbox_string == switches::kNoneSandbox)
return SANDBOX_TYPE_NO_SANDBOX;
if (sandbox_string == switches::kNetworkSandbox)
return SANDBOX_TYPE_NETWORK;
if (sandbox_string == switches::kPpapiSandbox)
return SANDBOX_TYPE_PPAPI;
if (sandbox_string == switches::kCdmSandbox)
return SANDBOX_TYPE_CDM;
if (sandbox_string == switches::kPdfCompositorSandbox)
return SANDBOX_TYPE_PDF_COMPOSITOR;
if (sandbox_string == switches::kProfilingSandbox)
return SANDBOX_TYPE_PROFILING;
return SANDBOX_TYPE_UTILITY;
}
} // namespace service_manager