Add sandbox support (issue #524).
- The sandbox is now enabled by default on all platforms. Use the CefSettings.no_sandbox option or the "no-sandbox" command-line flag to disable sandbox support. - Windows: See cef_sandbox_win.h for requirements to enable sandbox support. - Windows: If Visual Studio isn't installed in the standard location set the CEF_VCVARS environment variable before running make_distrib.py or automate.py (see msvs_env.bat). - Linux: For binary distributions a new chrome-sandbox executable with SUID permissions must be placed next to the CEF executable. See https://code.google.com/p/chromium/wiki/LinuxSUIDSandboxDevelopment for details on setting up the development environment when building CEF from source code. git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1518 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
parent
395f443215
commit
f5bc72b234
32
cef.gyp
32
cef.gyp
|
@ -59,6 +59,9 @@
|
||||||
},
|
},
|
||||||
'conditions': [
|
'conditions': [
|
||||||
['OS=="win"', {
|
['OS=="win"', {
|
||||||
|
'dependencies': [
|
||||||
|
'cef_sandbox',
|
||||||
|
],
|
||||||
'configurations': {
|
'configurations': {
|
||||||
'Debug_Base': {
|
'Debug_Base': {
|
||||||
'msvs_settings': {
|
'msvs_settings': {
|
||||||
|
@ -72,7 +75,6 @@
|
||||||
'VCLinkerTool': {
|
'VCLinkerTool': {
|
||||||
# Set /SUBSYSTEM:WINDOWS.
|
# Set /SUBSYSTEM:WINDOWS.
|
||||||
'SubSystem': '2',
|
'SubSystem': '2',
|
||||||
'EntryPointSymbol' : 'wWinMainCRTStartup',
|
|
||||||
},
|
},
|
||||||
'VCManifestTool': {
|
'VCManifestTool': {
|
||||||
'AdditionalManifestFiles': [
|
'AdditionalManifestFiles': [
|
||||||
|
@ -94,7 +96,7 @@
|
||||||
'<@(cefclient_sources_win)',
|
'<@(cefclient_sources_win)',
|
||||||
],
|
],
|
||||||
}],
|
}],
|
||||||
['OS == "win"', {
|
[ 'toolkit_uses_gtk == 1', {
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
'<(DEPTH)/sandbox/sandbox.gyp:sandbox',
|
'<(DEPTH)/sandbox/sandbox.gyp:sandbox',
|
||||||
],
|
],
|
||||||
|
@ -304,6 +306,9 @@
|
||||||
],
|
],
|
||||||
'conditions': [
|
'conditions': [
|
||||||
[ 'OS=="win"', {
|
[ 'OS=="win"', {
|
||||||
|
'dependencies': [
|
||||||
|
'cef_sandbox',
|
||||||
|
],
|
||||||
'sources': [
|
'sources': [
|
||||||
'tests/cefclient/cefclient.rc',
|
'tests/cefclient/cefclient.rc',
|
||||||
'tests/cefclient/resource_util_win.cpp',
|
'tests/cefclient/resource_util_win.cpp',
|
||||||
|
@ -316,6 +321,11 @@
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}],
|
}],
|
||||||
|
[ 'toolkit_uses_gtk == 1', {
|
||||||
|
'dependencies': [
|
||||||
|
'<(DEPTH)/sandbox/sandbox.gyp:sandbox',
|
||||||
|
],
|
||||||
|
}],
|
||||||
[ 'OS=="mac"', {
|
[ 'OS=="mac"', {
|
||||||
'product_name': 'cef_unittests',
|
'product_name': 'cef_unittests',
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
|
@ -1383,5 +1393,23 @@
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
}], # OS=="linux" or OS=="freebsd" or OS=="openbsd"
|
}], # OS=="linux" or OS=="freebsd" or OS=="openbsd"
|
||||||
|
[ 'OS=="win"', {
|
||||||
|
'targets': [
|
||||||
|
{
|
||||||
|
'target_name': 'cef_sandbox',
|
||||||
|
'type': 'static_library',
|
||||||
|
'msvs_guid': 'C90B9CA2-2BD2-4140-9DB8-4474785FF360',
|
||||||
|
'dependencies': [
|
||||||
|
'<(DEPTH)/sandbox/sandbox.gyp:sandbox',
|
||||||
|
],
|
||||||
|
'include_dirs': [
|
||||||
|
'.',
|
||||||
|
],
|
||||||
|
'sources': [
|
||||||
|
'libcef_dll/sandbox/sandbox_win.cc',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}], # OS=="win"
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
'include/wrapper/cef_zip_archive.h',
|
'include/wrapper/cef_zip_archive.h',
|
||||||
],
|
],
|
||||||
'includes_win': [
|
'includes_win': [
|
||||||
|
'include/cef_sandbox_win.h',
|
||||||
'include/internal/cef_types_win.h',
|
'include/internal/cef_types_win.h',
|
||||||
'include/internal/cef_win.h',
|
'include/internal/cef_win.h',
|
||||||
],
|
],
|
||||||
|
|
|
@ -53,19 +53,23 @@ extern "C" {
|
||||||
// called for the browser process (identified by no "type" command-line value)
|
// called for the browser process (identified by no "type" command-line value)
|
||||||
// it will return immediately with a value of -1. If called for a recognized
|
// it will return immediately with a value of -1. If called for a recognized
|
||||||
// secondary process it will block until the process should exit and then return
|
// secondary process it will block until the process should exit and then return
|
||||||
// the process exit code. The |application| parameter may be NULL.
|
// the process exit code. The |application| parameter may be NULL. The
|
||||||
|
// |windows_sandbox_info| parameter is only used on Windows and may be NULL (see
|
||||||
|
// cef_sandbox_win.h for details).
|
||||||
///
|
///
|
||||||
CEF_EXPORT int cef_execute_process(const struct _cef_main_args_t* args,
|
CEF_EXPORT int cef_execute_process(const struct _cef_main_args_t* args,
|
||||||
struct _cef_app_t* application);
|
struct _cef_app_t* application, void* windows_sandbox_info);
|
||||||
|
|
||||||
///
|
///
|
||||||
// This function should be called on the main application thread to initialize
|
// This function should be called on the main application thread to initialize
|
||||||
// the CEF browser process. The |application| parameter may be NULL. A return
|
// the CEF browser process. The |application| parameter may be NULL. A return
|
||||||
// value of true (1) indicates that it succeeded and false (0) indicates that it
|
// value of true (1) indicates that it succeeded and false (0) indicates that it
|
||||||
// failed.
|
// failed. The |windows_sandbox_info| parameter is only used on Windows and may
|
||||||
|
// be NULL (see cef_sandbox_win.h for details).
|
||||||
///
|
///
|
||||||
CEF_EXPORT int cef_initialize(const struct _cef_main_args_t* args,
|
CEF_EXPORT int cef_initialize(const struct _cef_main_args_t* args,
|
||||||
const struct _cef_settings_t* settings, struct _cef_app_t* application);
|
const struct _cef_settings_t* settings, struct _cef_app_t* application,
|
||||||
|
void* windows_sandbox_info);
|
||||||
|
|
||||||
///
|
///
|
||||||
// This function should be called on the main application thread to shut down
|
// This function should be called on the main application thread to shut down
|
||||||
|
|
|
@ -56,19 +56,29 @@ class CefApp;
|
||||||
// called for the browser process (identified by no "type" command-line value)
|
// called for the browser process (identified by no "type" command-line value)
|
||||||
// it will return immediately with a value of -1. If called for a recognized
|
// it will return immediately with a value of -1. If called for a recognized
|
||||||
// secondary process it will block until the process should exit and then return
|
// secondary process it will block until the process should exit and then return
|
||||||
// the process exit code. The |application| parameter may be empty.
|
// the process exit code. The |application| parameter may be empty. The
|
||||||
|
// |windows_sandbox_info| parameter is only used on Windows and may be NULL (see
|
||||||
|
// cef_sandbox_win.h for details).
|
||||||
///
|
///
|
||||||
/*--cef(api_hash_check,optional_param=application)--*/
|
/*--cef(api_hash_check,optional_param=application,
|
||||||
int CefExecuteProcess(const CefMainArgs& args, CefRefPtr<CefApp> application);
|
optional_param=windows_sandbox_info)--*/
|
||||||
|
int CefExecuteProcess(const CefMainArgs& args,
|
||||||
|
CefRefPtr<CefApp> application,
|
||||||
|
void* windows_sandbox_info);
|
||||||
|
|
||||||
///
|
///
|
||||||
// This function should be called on the main application thread to initialize
|
// This function should be called on the main application thread to initialize
|
||||||
// the CEF browser process. The |application| parameter may be empty. A return
|
// the CEF browser process. The |application| parameter may be empty. A return
|
||||||
// value of true indicates that it succeeded and false indicates that it failed.
|
// value of true indicates that it succeeded and false indicates that it failed.
|
||||||
|
// The |windows_sandbox_info| parameter is only used on Windows and may be NULL
|
||||||
|
// (see cef_sandbox_win.h for details).
|
||||||
///
|
///
|
||||||
/*--cef(api_hash_check,optional_param=application)--*/
|
/*--cef(api_hash_check,optional_param=application,
|
||||||
bool CefInitialize(const CefMainArgs& args, const CefSettings& settings,
|
optional_param=windows_sandbox_info)--*/
|
||||||
CefRefPtr<CefApp> application);
|
bool CefInitialize(const CefMainArgs& args,
|
||||||
|
const CefSettings& settings,
|
||||||
|
CefRefPtr<CefApp> application,
|
||||||
|
void* windows_sandbox_info);
|
||||||
|
|
||||||
///
|
///
|
||||||
// This function should be called on the main application thread to shut down
|
// This function should be called on the main application thread to shut down
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
// Copyright (c) 2013 Marshall A. Greenblatt. All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions are
|
||||||
|
// met:
|
||||||
|
//
|
||||||
|
// * Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
// * Redistributions in binary form must reproduce the above
|
||||||
|
// copyright notice, this list of conditions and the following disclaimer
|
||||||
|
// in the documentation and/or other materials provided with the
|
||||||
|
// distribution.
|
||||||
|
// * Neither the name of Google Inc. nor the name Chromium Embedded
|
||||||
|
// Framework nor the names of its contributors may be used to endorse
|
||||||
|
// or promote products derived from this software without specific prior
|
||||||
|
// written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
#ifndef CEF_INCLUDE_CEF_SANDBOX_WIN_H_
|
||||||
|
#define CEF_INCLUDE_CEF_SANDBOX_WIN_H_
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "include/cef_base.h"
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// The sandbox is used to restrict sub-processes (renderer, plugin, GPU, etc)
|
||||||
|
// from directly accessing system resources. This helps to protect the user
|
||||||
|
// from untrusted and potentially malicious Web content.
|
||||||
|
// See http://www.chromium.org/developers/design-documents/sandbox for
|
||||||
|
// complete details.
|
||||||
|
//
|
||||||
|
// To enable the sandbox on Windows the following requirements must be met:
|
||||||
|
// 1. Use the same executable for the browser process and all sub-processes.
|
||||||
|
// 2. Link the executable with the cef_sandbox static library.
|
||||||
|
// 3. Call the cef_sandbox_info_create() function from within the executable
|
||||||
|
// (not from a separate DLL) and pass the resulting pointer into both the
|
||||||
|
// CefExecutProcess() and CefInitialize() functions via the
|
||||||
|
// |windows_sandbox_info| parameter.
|
||||||
|
|
||||||
|
///
|
||||||
|
// Create the sandbox information object for this process. It is safe to create
|
||||||
|
// multiple of this object and to destroy the object immediately after passing
|
||||||
|
// into the CefExecutProcess() and/or CefInitialize() functions.
|
||||||
|
///
|
||||||
|
void* cef_sandbox_info_create();
|
||||||
|
|
||||||
|
///
|
||||||
|
// Destroy the specified sandbox information object.
|
||||||
|
///
|
||||||
|
void cef_sandbox_info_destroy(void* sandbox_info);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
// Manages the life span of a sandbox information object.
|
||||||
|
///
|
||||||
|
class CefScopedSandboxInfo {
|
||||||
|
public:
|
||||||
|
CefScopedSandboxInfo() {
|
||||||
|
sandbox_info_ = cef_sandbox_info_create();
|
||||||
|
}
|
||||||
|
~CefScopedSandboxInfo() {
|
||||||
|
cef_sandbox_info_destroy(sandbox_info_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* sandbox_info() const { return sandbox_info_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
void* sandbox_info_;
|
||||||
|
};
|
||||||
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#endif // defined(OS_WIN)
|
||||||
|
|
||||||
|
#endif // CEF_INCLUDE_CEF_SANDBOX_WIN_H_
|
|
@ -167,6 +167,13 @@ typedef struct _cef_settings_t {
|
||||||
///
|
///
|
||||||
bool single_process;
|
bool single_process;
|
||||||
|
|
||||||
|
///
|
||||||
|
// Set to true (1) to disable the sandbox for sub-processes. See
|
||||||
|
// cef_sandbox_win.h for requirements to enable the sandbox on Windows. Also
|
||||||
|
// configurable using the "no-sandbox" command-line switch.
|
||||||
|
///
|
||||||
|
bool no_sandbox;
|
||||||
|
|
||||||
///
|
///
|
||||||
// The path to a separate executable that will be launched for sub-processes.
|
// The path to a separate executable that will be launched for sub-processes.
|
||||||
// By default the browser process executable is used. See the comments on
|
// By default the browser process executable is used. See the comments on
|
||||||
|
|
|
@ -344,6 +344,7 @@ struct CefSettingsTraits {
|
||||||
static inline void set(const struct_type* src, struct_type* target,
|
static inline void set(const struct_type* src, struct_type* target,
|
||||||
bool copy) {
|
bool copy) {
|
||||||
target->single_process = src->single_process;
|
target->single_process = src->single_process;
|
||||||
|
target->no_sandbox = src->no_sandbox;
|
||||||
cef_string_set(src->browser_subprocess_path.str,
|
cef_string_set(src->browser_subprocess_path.str,
|
||||||
src->browser_subprocess_path.length,
|
src->browser_subprocess_path.length,
|
||||||
&target->browser_subprocess_path, copy);
|
&target->browser_subprocess_path, copy);
|
||||||
|
|
|
@ -60,7 +60,8 @@ class CefForceShutdown {
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
int CefExecuteProcess(const CefMainArgs& args,
|
int CefExecuteProcess(const CefMainArgs& args,
|
||||||
CefRefPtr<CefApp> application) {
|
CefRefPtr<CefApp> application,
|
||||||
|
void* windows_sandbox_info) {
|
||||||
CommandLine command_line(CommandLine::NO_PROGRAM);
|
CommandLine command_line(CommandLine::NO_PROGRAM);
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
command_line.ParseFromString(::GetCommandLineW());
|
command_line.ParseFromString(::GetCommandLineW());
|
||||||
|
@ -89,9 +90,14 @@ int CefExecuteProcess(const CefMainArgs& args,
|
||||||
// Execute the secondary process.
|
// Execute the secondary process.
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
sandbox::SandboxInterfaceInfo sandbox_info = {0};
|
sandbox::SandboxInterfaceInfo sandbox_info = {0};
|
||||||
content::InitializeSandboxInfo(&sandbox_info);
|
if (windows_sandbox_info == NULL) {
|
||||||
|
content::InitializeSandboxInfo(&sandbox_info);
|
||||||
|
windows_sandbox_info = &sandbox_info;
|
||||||
|
}
|
||||||
|
|
||||||
return content::ContentMain(args.instance, &sandbox_info, &main_delegate);
|
return content::ContentMain(args.instance,
|
||||||
|
static_cast<sandbox::SandboxInterfaceInfo*>(windows_sandbox_info),
|
||||||
|
&main_delegate);
|
||||||
#else
|
#else
|
||||||
return content::ContentMain(args.argc, const_cast<const char**>(args.argv),
|
return content::ContentMain(args.argc, const_cast<const char**>(args.argv),
|
||||||
&main_delegate);
|
&main_delegate);
|
||||||
|
@ -100,7 +106,8 @@ int CefExecuteProcess(const CefMainArgs& args,
|
||||||
|
|
||||||
bool CefInitialize(const CefMainArgs& args,
|
bool CefInitialize(const CefMainArgs& args,
|
||||||
const CefSettings& settings,
|
const CefSettings& settings,
|
||||||
CefRefPtr<CefApp> application) {
|
CefRefPtr<CefApp> application,
|
||||||
|
void* windows_sandbox_info) {
|
||||||
// Return true if the global context already exists.
|
// Return true if the global context already exists.
|
||||||
if (g_context)
|
if (g_context)
|
||||||
return true;
|
return true;
|
||||||
|
@ -116,7 +123,8 @@ bool CefInitialize(const CefMainArgs& args,
|
||||||
g_context = new CefContext();
|
g_context = new CefContext();
|
||||||
|
|
||||||
// Initialize the global context.
|
// Initialize the global context.
|
||||||
return g_context->Initialize(args, settings, application);
|
return g_context->Initialize(args, settings, application,
|
||||||
|
windows_sandbox_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CefShutdown() {
|
void CefShutdown() {
|
||||||
|
@ -222,7 +230,8 @@ CefContext* CefContext::Get() {
|
||||||
|
|
||||||
bool CefContext::Initialize(const CefMainArgs& args,
|
bool CefContext::Initialize(const CefMainArgs& args,
|
||||||
const CefSettings& settings,
|
const CefSettings& settings,
|
||||||
CefRefPtr<CefApp> application) {
|
CefRefPtr<CefApp> application,
|
||||||
|
void* windows_sandbox_info) {
|
||||||
init_thread_id_ = base::PlatformThread::CurrentId();
|
init_thread_id_ = base::PlatformThread::CurrentId();
|
||||||
settings_ = settings;
|
settings_ = settings;
|
||||||
|
|
||||||
|
@ -257,10 +266,15 @@ bool CefContext::Initialize(const CefMainArgs& args,
|
||||||
// Initialize the content runner.
|
// Initialize the content runner.
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
sandbox::SandboxInterfaceInfo sandbox_info = {0};
|
sandbox::SandboxInterfaceInfo sandbox_info = {0};
|
||||||
content::InitializeSandboxInfo(&sandbox_info);
|
if (windows_sandbox_info == NULL) {
|
||||||
|
content::InitializeSandboxInfo(&sandbox_info);
|
||||||
|
windows_sandbox_info = &sandbox_info;
|
||||||
|
settings_.no_sandbox = true;
|
||||||
|
}
|
||||||
|
|
||||||
exit_code = main_runner_->Initialize(args.instance, &sandbox_info,
|
exit_code = main_runner_->Initialize(args.instance,
|
||||||
main_delegate_.get());
|
static_cast<sandbox::SandboxInterfaceInfo*>(windows_sandbox_info),
|
||||||
|
main_delegate_.get());
|
||||||
#else
|
#else
|
||||||
exit_code = main_runner_->Initialize(args.argc,
|
exit_code = main_runner_->Initialize(args.argc,
|
||||||
const_cast<const char**>(args.argv),
|
const_cast<const char**>(args.argv),
|
||||||
|
|
|
@ -48,7 +48,8 @@ class CefContext : public content::NotificationObserver {
|
||||||
// These methods will be called on the main application thread.
|
// These methods will be called on the main application thread.
|
||||||
bool Initialize(const CefMainArgs& args,
|
bool Initialize(const CefMainArgs& args,
|
||||||
const CefSettings& settings,
|
const CefSettings& settings,
|
||||||
CefRefPtr<CefApp> application);
|
CefRefPtr<CefApp> application,
|
||||||
|
void* windows_sandbox_info);
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
// Returns true if the current thread is the initialization thread.
|
// Returns true if the current thread is the initialization thread.
|
||||||
|
|
|
@ -166,15 +166,26 @@ bool CefMainDelegate::BasicStartupComplete(int* exit_code) {
|
||||||
if (settings.single_process)
|
if (settings.single_process)
|
||||||
command_line->AppendSwitch(switches::kSingleProcess);
|
command_line->AppendSwitch(switches::kSingleProcess);
|
||||||
|
|
||||||
|
bool no_sandbox = settings.no_sandbox;
|
||||||
|
|
||||||
if (settings.browser_subprocess_path.length > 0) {
|
if (settings.browser_subprocess_path.length > 0) {
|
||||||
base::FilePath file_path =
|
base::FilePath file_path =
|
||||||
base::FilePath(CefString(&settings.browser_subprocess_path));
|
base::FilePath(CefString(&settings.browser_subprocess_path));
|
||||||
if (!file_path.empty()) {
|
if (!file_path.empty()) {
|
||||||
command_line->AppendSwitchPath(switches::kBrowserSubprocessPath,
|
command_line->AppendSwitchPath(switches::kBrowserSubprocessPath,
|
||||||
file_path);
|
file_path);
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
// The sandbox is not supported when using a separate subprocess
|
||||||
|
// executable on Windows.
|
||||||
|
no_sandbox = true;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (no_sandbox)
|
||||||
|
command_line->AppendSwitch(switches::kNoSandbox);
|
||||||
|
|
||||||
if (settings.user_agent.length > 0) {
|
if (settings.user_agent.length > 0) {
|
||||||
command_line->AppendSwitchASCII(switches::kUserAgent,
|
command_line->AppendSwitchASCII(switches::kUserAgent,
|
||||||
CefString(&settings.user_agent));
|
CefString(&settings.user_agent));
|
||||||
|
@ -267,10 +278,6 @@ bool CefMainDelegate::BasicStartupComplete(int* exit_code) {
|
||||||
command_line->AppendSwitchASCII(switches::kContextSafetyImplementation,
|
command_line->AppendSwitchASCII(switches::kContextSafetyImplementation,
|
||||||
base::IntToString(settings.context_safety_implementation));
|
base::IntToString(settings.context_safety_implementation));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(cef): Figure out how to support the sandbox.
|
|
||||||
if (!command_line->HasSwitch(switches::kNoSandbox))
|
|
||||||
command_line->AppendSwitch(switches::kNoSandbox);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (content_client_.application().get()) {
|
if (content_client_.application().get()) {
|
||||||
|
|
|
@ -109,14 +109,14 @@
|
||||||
// GLOBAL FUNCTIONS - Body may be edited by hand.
|
// GLOBAL FUNCTIONS - Body may be edited by hand.
|
||||||
|
|
||||||
CEF_EXPORT int cef_execute_process(const struct _cef_main_args_t* args,
|
CEF_EXPORT int cef_execute_process(const struct _cef_main_args_t* args,
|
||||||
struct _cef_app_t* application) {
|
struct _cef_app_t* application, void* windows_sandbox_info) {
|
||||||
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
// Verify param: args; type: struct_byref_const
|
// Verify param: args; type: struct_byref_const
|
||||||
DCHECK(args);
|
DCHECK(args);
|
||||||
if (!args)
|
if (!args)
|
||||||
return 0;
|
return 0;
|
||||||
// Unverified params: application
|
// Unverified params: application, windows_sandbox_info
|
||||||
|
|
||||||
// Translate param: args; type: struct_byref_const
|
// Translate param: args; type: struct_byref_const
|
||||||
CefMainArgs argsObj;
|
CefMainArgs argsObj;
|
||||||
|
@ -126,14 +126,16 @@ CEF_EXPORT int cef_execute_process(const struct _cef_main_args_t* args,
|
||||||
// Execute
|
// Execute
|
||||||
int _retval = CefExecuteProcess(
|
int _retval = CefExecuteProcess(
|
||||||
argsObj,
|
argsObj,
|
||||||
CefAppCToCpp::Wrap(application));
|
CefAppCToCpp::Wrap(application),
|
||||||
|
windows_sandbox_info);
|
||||||
|
|
||||||
// Return type: simple
|
// Return type: simple
|
||||||
return _retval;
|
return _retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
CEF_EXPORT int cef_initialize(const struct _cef_main_args_t* args,
|
CEF_EXPORT int cef_initialize(const struct _cef_main_args_t* args,
|
||||||
const struct _cef_settings_t* settings, struct _cef_app_t* application) {
|
const struct _cef_settings_t* settings, struct _cef_app_t* application,
|
||||||
|
void* windows_sandbox_info) {
|
||||||
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
// Verify param: args; type: struct_byref_const
|
// Verify param: args; type: struct_byref_const
|
||||||
|
@ -144,7 +146,7 @@ CEF_EXPORT int cef_initialize(const struct _cef_main_args_t* args,
|
||||||
DCHECK(settings);
|
DCHECK(settings);
|
||||||
if (!settings)
|
if (!settings)
|
||||||
return 0;
|
return 0;
|
||||||
// Unverified params: application
|
// Unverified params: application, windows_sandbox_info
|
||||||
|
|
||||||
// Translate param: args; type: struct_byref_const
|
// Translate param: args; type: struct_byref_const
|
||||||
CefMainArgs argsObj;
|
CefMainArgs argsObj;
|
||||||
|
@ -159,7 +161,8 @@ CEF_EXPORT int cef_initialize(const struct _cef_main_args_t* args,
|
||||||
bool _retval = CefInitialize(
|
bool _retval = CefInitialize(
|
||||||
argsObj,
|
argsObj,
|
||||||
settingsObj,
|
settingsObj,
|
||||||
CefAppCToCpp::Wrap(application));
|
CefAppCToCpp::Wrap(application),
|
||||||
|
windows_sandbox_info);
|
||||||
|
|
||||||
// Return type: bool
|
// Return type: bool
|
||||||
return _retval;
|
return _retval;
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Copyright 2013 The Chromium Embedded Framework Authors. Portions Copyright
|
||||||
|
// 2011 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 "include/cef_sandbox_win.h"
|
||||||
|
|
||||||
|
#include "sandbox/win/src/process_mitigations.h"
|
||||||
|
#include "sandbox/win/src/sandbox_factory.h"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
// From content/app/startup_helper_win.cc:
|
||||||
|
void InitializeSandboxInfo(sandbox::SandboxInterfaceInfo* info) {
|
||||||
|
info->broker_services = sandbox::SandboxFactory::GetBrokerServices();
|
||||||
|
if (!info->broker_services) {
|
||||||
|
info->target_services = sandbox::SandboxFactory::GetTargetServices();
|
||||||
|
} else {
|
||||||
|
// Ensure the proper mitigations are enforced for the browser process.
|
||||||
|
sandbox::ApplyProcessMitigationsToCurrentProcess(
|
||||||
|
sandbox::MITIGATION_DEP |
|
||||||
|
sandbox::MITIGATION_DEP_NO_ATL_THUNK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void* cef_sandbox_info_create() {
|
||||||
|
sandbox::SandboxInterfaceInfo* info = new sandbox::SandboxInterfaceInfo();
|
||||||
|
memset(info, 0, sizeof(sandbox::SandboxInterfaceInfo));
|
||||||
|
InitializeSandboxInfo(info);
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cef_sandbox_info_destroy(void* sandbox_info) {
|
||||||
|
delete static_cast<sandbox::SandboxInterfaceInfo*>(sandbox_info);
|
||||||
|
}
|
|
@ -113,7 +113,7 @@
|
||||||
// GLOBAL METHODS - Body may be edited by hand.
|
// GLOBAL METHODS - Body may be edited by hand.
|
||||||
|
|
||||||
CEF_GLOBAL int CefExecuteProcess(const CefMainArgs& args,
|
CEF_GLOBAL int CefExecuteProcess(const CefMainArgs& args,
|
||||||
CefRefPtr<CefApp> application) {
|
CefRefPtr<CefApp> application, void* windows_sandbox_info) {
|
||||||
const char* api_hash = cef_api_hash(0);
|
const char* api_hash = cef_api_hash(0);
|
||||||
if (strcmp(api_hash, CEF_API_HASH_PLATFORM)) {
|
if (strcmp(api_hash, CEF_API_HASH_PLATFORM)) {
|
||||||
// The libcef API hash does not match the current header API hash.
|
// The libcef API hash does not match the current header API hash.
|
||||||
|
@ -123,19 +123,21 @@ CEF_GLOBAL int CefExecuteProcess(const CefMainArgs& args,
|
||||||
|
|
||||||
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
// Unverified params: application
|
// Unverified params: application, windows_sandbox_info
|
||||||
|
|
||||||
// Execute
|
// Execute
|
||||||
int _retval = cef_execute_process(
|
int _retval = cef_execute_process(
|
||||||
&args,
|
&args,
|
||||||
CefAppCppToC::Wrap(application));
|
CefAppCppToC::Wrap(application),
|
||||||
|
windows_sandbox_info);
|
||||||
|
|
||||||
// Return type: simple
|
// Return type: simple
|
||||||
return _retval;
|
return _retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
CEF_GLOBAL bool CefInitialize(const CefMainArgs& args,
|
CEF_GLOBAL bool CefInitialize(const CefMainArgs& args,
|
||||||
const CefSettings& settings, CefRefPtr<CefApp> application) {
|
const CefSettings& settings, CefRefPtr<CefApp> application,
|
||||||
|
void* windows_sandbox_info) {
|
||||||
const char* api_hash = cef_api_hash(0);
|
const char* api_hash = cef_api_hash(0);
|
||||||
if (strcmp(api_hash, CEF_API_HASH_PLATFORM)) {
|
if (strcmp(api_hash, CEF_API_HASH_PLATFORM)) {
|
||||||
// The libcef API hash does not match the current header API hash.
|
// The libcef API hash does not match the current header API hash.
|
||||||
|
@ -145,13 +147,14 @@ CEF_GLOBAL bool CefInitialize(const CefMainArgs& args,
|
||||||
|
|
||||||
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
// Unverified params: application
|
// Unverified params: application, windows_sandbox_info
|
||||||
|
|
||||||
// Execute
|
// Execute
|
||||||
int _retval = cef_initialize(
|
int _retval = cef_initialize(
|
||||||
&args,
|
&args,
|
||||||
&settings,
|
&settings,
|
||||||
CefAppCppToC::Wrap(application));
|
CefAppCppToC::Wrap(application),
|
||||||
|
windows_sandbox_info);
|
||||||
|
|
||||||
// Return type: bool
|
// Return type: bool
|
||||||
return _retval?true:false;
|
return _retval?true:false;
|
||||||
|
|
|
@ -263,7 +263,7 @@ int main(int argc, char* argv[]) {
|
||||||
CefRefPtr<ClientApp> app(new ClientApp);
|
CefRefPtr<ClientApp> app(new ClientApp);
|
||||||
|
|
||||||
// Execute the secondary process, if any.
|
// Execute the secondary process, if any.
|
||||||
int exit_code = CefExecuteProcess(main_args, app.get());
|
int exit_code = CefExecuteProcess(main_args, app.get(), NULL);
|
||||||
if (exit_code >= 0)
|
if (exit_code >= 0)
|
||||||
return exit_code;
|
return exit_code;
|
||||||
|
|
||||||
|
@ -286,7 +286,7 @@ int main(int argc, char* argv[]) {
|
||||||
AppGetSettings(settings);
|
AppGetSettings(settings);
|
||||||
|
|
||||||
// Initialize CEF.
|
// Initialize CEF.
|
||||||
CefInitialize(main_args, settings, app.get());
|
CefInitialize(main_args, settings, app.get(), NULL);
|
||||||
|
|
||||||
// Register the scheme handler.
|
// Register the scheme handler.
|
||||||
scheme_test::InitTest();
|
scheme_test::InitTest();
|
||||||
|
|
|
@ -468,7 +468,7 @@ int main(int argc, char* argv[]) {
|
||||||
CefRefPtr<ClientApp> app(new ClientApp);
|
CefRefPtr<ClientApp> app(new ClientApp);
|
||||||
|
|
||||||
// Execute the secondary process, if any.
|
// Execute the secondary process, if any.
|
||||||
int exit_code = CefExecuteProcess(main_args, app.get());
|
int exit_code = CefExecuteProcess(main_args, app.get(), NULL);
|
||||||
if (exit_code >= 0)
|
if (exit_code >= 0)
|
||||||
return exit_code;
|
return exit_code;
|
||||||
|
|
||||||
|
@ -490,7 +490,7 @@ int main(int argc, char* argv[]) {
|
||||||
AppGetSettings(settings);
|
AppGetSettings(settings);
|
||||||
|
|
||||||
// Initialize CEF.
|
// Initialize CEF.
|
||||||
CefInitialize(main_args, settings, app.get());
|
CefInitialize(main_args, settings, app.get(), NULL);
|
||||||
|
|
||||||
// Register the scheme handler.
|
// Register the scheme handler.
|
||||||
scheme_test::InitTest();
|
scheme_test::InitTest();
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include "include/cef_browser.h"
|
#include "include/cef_browser.h"
|
||||||
#include "include/cef_frame.h"
|
#include "include/cef_frame.h"
|
||||||
#include "include/cef_runnable.h"
|
#include "include/cef_runnable.h"
|
||||||
|
#include "include/cef_sandbox_win.h"
|
||||||
#include "cefclient/cefclient_osr_widget_win.h"
|
#include "cefclient/cefclient_osr_widget_win.h"
|
||||||
#include "cefclient/client_handler.h"
|
#include "cefclient/client_handler.h"
|
||||||
#include "cefclient/client_switches.h"
|
#include "cefclient/client_switches.h"
|
||||||
|
@ -66,11 +67,15 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
|
||||||
UNREFERENCED_PARAMETER(hPrevInstance);
|
UNREFERENCED_PARAMETER(hPrevInstance);
|
||||||
UNREFERENCED_PARAMETER(lpCmdLine);
|
UNREFERENCED_PARAMETER(lpCmdLine);
|
||||||
|
|
||||||
|
// Manages the life span of the sandbox information object.
|
||||||
|
CefScopedSandboxInfo scoped_sandbox;
|
||||||
|
|
||||||
CefMainArgs main_args(hInstance);
|
CefMainArgs main_args(hInstance);
|
||||||
CefRefPtr<ClientApp> app(new ClientApp);
|
CefRefPtr<ClientApp> app(new ClientApp);
|
||||||
|
|
||||||
// Execute the secondary process, if any.
|
// Execute the secondary process, if any.
|
||||||
int exit_code = CefExecuteProcess(main_args, app.get());
|
int exit_code = CefExecuteProcess(main_args, app.get(),
|
||||||
|
scoped_sandbox.sandbox_info());
|
||||||
if (exit_code >= 0)
|
if (exit_code >= 0)
|
||||||
return exit_code;
|
return exit_code;
|
||||||
|
|
||||||
|
@ -87,7 +92,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
|
||||||
AppGetSettings(settings);
|
AppGetSettings(settings);
|
||||||
|
|
||||||
// Initialize CEF.
|
// Initialize CEF.
|
||||||
CefInitialize(main_args, settings, app.get());
|
CefInitialize(main_args, settings, app.get(), scoped_sandbox.sandbox_info());
|
||||||
|
|
||||||
// Register the scheme handler.
|
// Register the scheme handler.
|
||||||
scheme_test::InitTest();
|
scheme_test::InitTest();
|
||||||
|
|
|
@ -28,5 +28,5 @@ int main(int argc, char* argv[]) {
|
||||||
CefRefPtr<CefApp> app(new ClientApp);
|
CefRefPtr<CefApp> app(new ClientApp);
|
||||||
|
|
||||||
// Execute the secondary process.
|
// Execute the secondary process.
|
||||||
return CefExecuteProcess(main_args, app);
|
return CefExecuteProcess(main_args, app, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,10 @@
|
||||||
// Include after base/bind.h to avoid name collisions with cef_tuple.h.
|
// Include after base/bind.h to avoid name collisions with cef_tuple.h.
|
||||||
#include "include/cef_runnable.h"
|
#include "include/cef_runnable.h"
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
#include "include/cef_sandbox_win.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// Thread used to run the test suite.
|
// Thread used to run the test suite.
|
||||||
|
@ -60,10 +64,18 @@ int main(int argc, char* argv[]) {
|
||||||
CefMainArgs main_args(argc, argv);
|
CefMainArgs main_args(argc, argv);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void* windows_sandbox_info = NULL;
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
// Manages the life span of the sandbox information object.
|
||||||
|
CefScopedSandboxInfo scoped_sandbox;
|
||||||
|
windows_sandbox_info = scoped_sandbox.sandbox_info();
|
||||||
|
#endif
|
||||||
|
|
||||||
CefRefPtr<CefApp> app(new ClientApp);
|
CefRefPtr<CefApp> app(new ClientApp);
|
||||||
|
|
||||||
// Execute the secondary process, if any.
|
// Execute the secondary process, if any.
|
||||||
int exit_code = CefExecuteProcess(main_args, app);
|
int exit_code = CefExecuteProcess(main_args, app, windows_sandbox_info);
|
||||||
if (exit_code >= 0)
|
if (exit_code >= 0)
|
||||||
return exit_code;
|
return exit_code;
|
||||||
|
|
||||||
|
@ -80,7 +92,7 @@ int main(int argc, char* argv[]) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Initialize CEF.
|
// Initialize CEF.
|
||||||
CefInitialize(main_args, settings, app);
|
CefInitialize(main_args, settings, app, windows_sandbox_info);
|
||||||
|
|
||||||
// Create the test suite object.
|
// Create the test suite object.
|
||||||
CefTestSuite test_suite(argc, argv);
|
CefTestSuite test_suite(argc, argv);
|
||||||
|
|
|
@ -561,7 +561,9 @@ if any_changed or options.forcebuild:
|
||||||
command = 'ninja -v -C'
|
command = 'ninja -v -C'
|
||||||
target = ' cefclient'
|
target = ' cefclient'
|
||||||
if options.buildtests:
|
if options.buildtests:
|
||||||
target = ' cefclient cef_unittests'
|
target = target + ' cef_unittests'
|
||||||
|
if platform == 'linux':
|
||||||
|
target = target + ' chrome_sandbox'
|
||||||
build_dir_suffix = ''
|
build_dir_suffix = ''
|
||||||
if platform == 'windows' and options.x64build:
|
if platform == 'windows' and options.x64build:
|
||||||
build_dir_suffix = '_x64'
|
build_dir_suffix = '_x64'
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# Copyright (c) 2011 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.
|
||||||
|
|
||||||
|
# TODO(slightlyoff): move to using shared version of this script.
|
||||||
|
|
||||||
|
'''This script makes it easy to combine libs and object files to a new lib,
|
||||||
|
optionally removing some of the object files in the input libs by regular
|
||||||
|
expression matching.
|
||||||
|
For usage information, run the script with a --help argument.
|
||||||
|
'''
|
||||||
|
import optparse
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def Shell(*args):
|
||||||
|
'''Runs the program and args in args, returns the output from the program.'''
|
||||||
|
process = subprocess.Popen(args,
|
||||||
|
stdin = None,
|
||||||
|
stdout = subprocess.PIPE,
|
||||||
|
stderr = subprocess.STDOUT)
|
||||||
|
output = process.stdout.readlines()
|
||||||
|
process.wait()
|
||||||
|
retcode = process.returncode
|
||||||
|
if retcode != 0:
|
||||||
|
raise RuntimeError('%s exited with status %d' % (args[0], retcode))
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def CollectRemovals(remove_re, inputs):
|
||||||
|
'''Returns a list of all object files in inputs that match remove_re.'''
|
||||||
|
removals = []
|
||||||
|
for input in inputs:
|
||||||
|
output = Shell('lib.exe', '/list', input)
|
||||||
|
|
||||||
|
for line in output:
|
||||||
|
line = line.rstrip()
|
||||||
|
if remove_re.search(line):
|
||||||
|
removals.append(line)
|
||||||
|
|
||||||
|
return removals
|
||||||
|
|
||||||
|
|
||||||
|
def CombineLibraries(output, remove_re, inputs):
|
||||||
|
'''Combines all the libraries and objects in inputs, while removing any
|
||||||
|
object files that match remove_re.
|
||||||
|
'''
|
||||||
|
removals = []
|
||||||
|
if remove_re:
|
||||||
|
removals = CollectRemovals(remove_re, inputs)
|
||||||
|
|
||||||
|
if len(removals) > 0:
|
||||||
|
print 'Removals: ', removals
|
||||||
|
|
||||||
|
args = ['lib.exe', '/out:%s' % output]
|
||||||
|
args += ['/remove:%s' % obj for obj in removals]
|
||||||
|
args += inputs
|
||||||
|
Shell(*args)
|
||||||
|
|
||||||
|
|
||||||
|
USAGE = '''usage: %prog [options] <lib or obj>+
|
||||||
|
|
||||||
|
Combines input libraries or objects into an output library, while removing
|
||||||
|
any object file (in the input libraries) that matches a given regular
|
||||||
|
expression.
|
||||||
|
'''
|
||||||
|
|
||||||
|
def GetOptionParser():
|
||||||
|
parser = optparse.OptionParser(USAGE)
|
||||||
|
parser.add_option('-o', '--output', dest = 'output',
|
||||||
|
help = 'write to this output library')
|
||||||
|
parser.add_option('-r', '--remove', dest = 'remove',
|
||||||
|
help = 'object files matching this regexp will be removed '
|
||||||
|
'from the output library')
|
||||||
|
return parser
|
||||||
|
|
||||||
|
|
||||||
|
def Main():
|
||||||
|
'''Main function for this script'''
|
||||||
|
parser = GetOptionParser()
|
||||||
|
(opt, args) = parser.parse_args()
|
||||||
|
output = opt.output
|
||||||
|
remove = opt.remove
|
||||||
|
if not output:
|
||||||
|
parser.error('You must specify an output file')
|
||||||
|
|
||||||
|
if not args:
|
||||||
|
parser.error('You must specify at least one object or library')
|
||||||
|
|
||||||
|
output = output.strip()
|
||||||
|
if remove:
|
||||||
|
remove = remove.strip()
|
||||||
|
|
||||||
|
if remove:
|
||||||
|
try:
|
||||||
|
remove_re = re.compile(opt.remove)
|
||||||
|
except:
|
||||||
|
parser.error('%s is not a valid regular expression' % opt.remove)
|
||||||
|
else:
|
||||||
|
remove_re = None
|
||||||
|
|
||||||
|
if sys.platform != 'win32' and sys.platform != 'cygwin':
|
||||||
|
parser.error('this script only works on Windows for now')
|
||||||
|
|
||||||
|
# If this is set, we can't capture lib.exe's output.
|
||||||
|
if 'VS_UNICODE_OUTPUT' in os.environ:
|
||||||
|
del os.environ['VS_UNICODE_OUTPUT']
|
||||||
|
|
||||||
|
CombineLibraries(output, remove_re, args)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(Main())
|
|
@ -97,7 +97,6 @@
|
||||||
'VCLinkerTool': {
|
'VCLinkerTool': {
|
||||||
# Set /SUBSYSTEM:WINDOWS.
|
# Set /SUBSYSTEM:WINDOWS.
|
||||||
'SubSystem': '2',
|
'SubSystem': '2',
|
||||||
'EntryPointSymbol' : 'wWinMainCRTStartup',
|
|
||||||
},
|
},
|
||||||
'VCManifestTool': {
|
'VCManifestTool': {
|
||||||
'AdditionalManifestFiles': [
|
'AdditionalManifestFiles': [
|
||||||
|
@ -112,7 +111,8 @@
|
||||||
'-lrpcrt4.lib',
|
'-lrpcrt4.lib',
|
||||||
'-lopengl32.lib',
|
'-lopengl32.lib',
|
||||||
'-lglu32.lib',
|
'-lglu32.lib',
|
||||||
'-l$(ConfigurationName)/libcef.lib'
|
'-l$(ConfigurationName)/libcef.lib',
|
||||||
|
'-l$(ConfigurationName)/cef_sandbox.lib',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'sources': [
|
'sources': [
|
||||||
|
@ -224,6 +224,7 @@
|
||||||
'Resources/cef.pak',
|
'Resources/cef.pak',
|
||||||
'Resources/devtools_resources.pak',
|
'Resources/devtools_resources.pak',
|
||||||
'Resources/locales/',
|
'Resources/locales/',
|
||||||
|
'$(BUILDTYPE)/chrome-sandbox',
|
||||||
'$(BUILDTYPE)/libcef.so',
|
'$(BUILDTYPE)/libcef.so',
|
||||||
'$(BUILDTYPE)/libffmpegsumo.so',
|
'$(BUILDTYPE)/libffmpegsumo.so',
|
||||||
],
|
],
|
||||||
|
|
|
@ -3,6 +3,10 @@ if [ -z "$1" ]; then
|
||||||
echo "ERROR: Please specify a build target: Debug or Release"
|
echo "ERROR: Please specify a build target: Debug or Release"
|
||||||
else
|
else
|
||||||
make -j8 cefclient BUILDTYPE=$1
|
make -j8 cefclient BUILDTYPE=$1
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Giving SUID permissions to chrome-sandbox..."
|
||||||
|
echo "(using sudo so you may be asked for your password)"
|
||||||
|
sudo -- chown root:root "out/$1/chrome-sandbox" &&
|
||||||
|
sudo -- chmod 4755 "out/$1/chrome-sandbox"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -169,6 +169,16 @@ def transfer_files(cef_dir, script_dir, transfer_cfg, output_dir, quiet):
|
||||||
new_path = cfg['new_header_path']
|
new_path = cfg['new_header_path']
|
||||||
normalize_headers(dst, new_path)
|
normalize_headers(dst, new_path)
|
||||||
|
|
||||||
|
def combine_libs(build_dir, libs, dest_lib):
|
||||||
|
""" Combine multiple static libraries into a single static library. """
|
||||||
|
cmdline = 'msvs_env.bat python combine_libs.py -o "%s"' % dest_lib
|
||||||
|
for lib in libs:
|
||||||
|
lib_path = os.path.join(build_dir, lib)
|
||||||
|
if not path_exists(lib_path):
|
||||||
|
raise Exception('Library not found: ' + lib_path)
|
||||||
|
cmdline = cmdline + ' "%s"' % lib_path
|
||||||
|
run(cmdline, os.path.join(cef_dir, 'tools'))
|
||||||
|
|
||||||
def generate_msvs_projects(version):
|
def generate_msvs_projects(version):
|
||||||
""" Generate MSVS projects for the specified version. """
|
""" Generate MSVS projects for the specified version. """
|
||||||
sys.stdout.write('Generating '+version+' project files...')
|
sys.stdout.write('Generating '+version+' project files...')
|
||||||
|
@ -464,9 +474,23 @@ if platform == 'windows':
|
||||||
if options.ninjabuild:
|
if options.ninjabuild:
|
||||||
out_dir = os.path.join(src_dir, 'out')
|
out_dir = os.path.join(src_dir, 'out')
|
||||||
libcef_dll_file = 'libcef.dll.lib'
|
libcef_dll_file = 'libcef.dll.lib'
|
||||||
|
sandbox_libs = [
|
||||||
|
'obj\\base\\base.lib',
|
||||||
|
'obj\\base\\base_static.lib',
|
||||||
|
'obj\\cef\\cef_sandbox.lib',
|
||||||
|
'obj\\base\\third_party\\dynamic_annotations\\dynamic_annotations.lib',
|
||||||
|
'obj\\sandbox\\sandbox.lib',
|
||||||
|
]
|
||||||
else:
|
else:
|
||||||
out_dir = os.path.join(src_dir, 'build')
|
out_dir = os.path.join(src_dir, 'build')
|
||||||
libcef_dll_file = 'lib/libcef.lib'
|
libcef_dll_file = 'lib/libcef.lib'
|
||||||
|
sandbox_libs = [
|
||||||
|
'lib\\base.lib',
|
||||||
|
'lib\\base_static.lib',
|
||||||
|
'lib\\cef_sandbox.lib',
|
||||||
|
'lib\\dynamic_annotations.lib',
|
||||||
|
'lib\\sandbox.lib',
|
||||||
|
]
|
||||||
|
|
||||||
valid_build_dir = None
|
valid_build_dir = None
|
||||||
|
|
||||||
|
@ -485,6 +509,7 @@ if platform == 'windows':
|
||||||
copy_files(os.path.join(build_dir, '*.dll'), dst_dir, options.quiet)
|
copy_files(os.path.join(build_dir, '*.dll'), dst_dir, options.quiet)
|
||||||
copy_file(os.path.join(build_dir, libcef_dll_file), os.path.join(dst_dir, 'libcef.lib'), \
|
copy_file(os.path.join(build_dir, libcef_dll_file), os.path.join(dst_dir, 'libcef.lib'), \
|
||||||
options.quiet)
|
options.quiet)
|
||||||
|
combine_libs(build_dir, sandbox_libs, os.path.join(dst_dir, 'cef_sandbox.lib'));
|
||||||
|
|
||||||
if not options.nosymbols:
|
if not options.nosymbols:
|
||||||
# create the symbol output directory
|
# create the symbol output directory
|
||||||
|
@ -506,6 +531,7 @@ if platform == 'windows':
|
||||||
if mode != 'client':
|
if mode != 'client':
|
||||||
copy_file(os.path.join(build_dir, libcef_dll_file), os.path.join(dst_dir, 'libcef.lib'), \
|
copy_file(os.path.join(build_dir, libcef_dll_file), os.path.join(dst_dir, 'libcef.lib'), \
|
||||||
options.quiet)
|
options.quiet)
|
||||||
|
combine_libs(build_dir, sandbox_libs, os.path.join(dst_dir, 'cef_sandbox.lib'));
|
||||||
else:
|
else:
|
||||||
copy_file(os.path.join(build_dir, 'cefclient.exe'), dst_dir, options.quiet)
|
copy_file(os.path.join(build_dir, 'cefclient.exe'), dst_dir, options.quiet)
|
||||||
|
|
||||||
|
@ -644,6 +670,7 @@ elif platform == 'linux':
|
||||||
valid_build_dir = build_dir
|
valid_build_dir = build_dir
|
||||||
dst_dir = os.path.join(output_dir, 'Debug')
|
dst_dir = os.path.join(output_dir, 'Debug')
|
||||||
make_dir(dst_dir, options.quiet)
|
make_dir(dst_dir, options.quiet)
|
||||||
|
copy_file(os.path.join(build_dir, 'chrome_sandbox'), os.path.join(dst_dir, 'chrome-sandbox'), options.quiet)
|
||||||
copy_file(os.path.join(build_dir, lib_dir_name, 'libcef.so'), dst_dir, options.quiet)
|
copy_file(os.path.join(build_dir, lib_dir_name, 'libcef.so'), dst_dir, options.quiet)
|
||||||
copy_file(os.path.join(build_dir, 'libffmpegsumo.so'), dst_dir, options.quiet)
|
copy_file(os.path.join(build_dir, 'libffmpegsumo.so'), dst_dir, options.quiet)
|
||||||
else:
|
else:
|
||||||
|
@ -663,6 +690,7 @@ elif platform == 'linux':
|
||||||
copy_file(os.path.join(build_dir, 'cefclient'), dst_dir, options.quiet)
|
copy_file(os.path.join(build_dir, 'cefclient'), dst_dir, options.quiet)
|
||||||
else:
|
else:
|
||||||
copy_file(os.path.join(build_dir, lib_dir_name, 'libcef.so'), dst_dir, options.quiet)
|
copy_file(os.path.join(build_dir, lib_dir_name, 'libcef.so'), dst_dir, options.quiet)
|
||||||
|
copy_file(os.path.join(build_dir, 'chrome_sandbox'), os.path.join(dst_dir, 'chrome-sandbox'), options.quiet)
|
||||||
copy_file(os.path.join(build_dir, 'libffmpegsumo.so'), dst_dir, options.quiet)
|
copy_file(os.path.join(build_dir, 'libffmpegsumo.so'), dst_dir, options.quiet)
|
||||||
else:
|
else:
|
||||||
sys.stderr.write("No Release build files.\n")
|
sys.stderr.write("No Release build files.\n")
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
@echo off
|
||||||
|
:: Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights
|
||||||
|
:: reserved. Use of this source code is governed by a BSD-style license
|
||||||
|
:: that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
:: Set up the environment for use with MSVS tools and then execute whatever
|
||||||
|
:: was specified on the command-line.
|
||||||
|
|
||||||
|
set RC=
|
||||||
|
setlocal
|
||||||
|
|
||||||
|
:: In case it's already provided via the environment.
|
||||||
|
set vcvars="%CEF_VCVARS%"
|
||||||
|
if exist %vcvars% goto found_vcvars
|
||||||
|
|
||||||
|
:: Hardcoded list of MSVS paths.
|
||||||
|
:: Alternatively we could 'reg query' this key:
|
||||||
|
:: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\Setup\VS;ProductDir
|
||||||
|
set vcvars="%PROGRAMFILES(X86)%\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat"
|
||||||
|
if exist %vcvars% goto found_vcvars
|
||||||
|
set vcvars="%PROGRAMFILES(X86)%\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
|
||||||
|
if exist %vcvars% goto found_vcvars
|
||||||
|
set vcvars="%PROGRAMFILES%\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat"
|
||||||
|
if exist %vcvars% goto found_vcvars
|
||||||
|
set vcvars="%PROGRAMFILES%\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
|
||||||
|
if exist %vcvars% goto found_vcvars
|
||||||
|
:: VS 2008 vcvars isn't standalone, it needs this env var.
|
||||||
|
set VS90COMNTOOLS=%PROGRAMFILES(X86)%\Microsoft Visual Studio 9.0\Common7\Tools\
|
||||||
|
set vcvars="%PROGRAMFILES(X86)%\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"
|
||||||
|
if exist %vcvars% goto found_vcvars
|
||||||
|
set VS90COMNTOOLS=%PROGRAMFILES%\Microsoft Visual Studio 9.0\Common7\Tools\
|
||||||
|
set vcvars="%PROGRAMFILES%\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"
|
||||||
|
if exist %vcvars% goto found_vcvars
|
||||||
|
|
||||||
|
set RC=1
|
||||||
|
echo Failed to find vcvars
|
||||||
|
goto end
|
||||||
|
|
||||||
|
:found_vcvars
|
||||||
|
echo vcvars:
|
||||||
|
echo %vcvars%
|
||||||
|
call %vcvars%
|
||||||
|
|
||||||
|
echo PATH:
|
||||||
|
echo %PATH%
|
||||||
|
%*
|
||||||
|
|
||||||
|
:end
|
||||||
|
endlocal & set RC=%ERRORLEVEL%
|
||||||
|
goto omega
|
||||||
|
|
||||||
|
:returncode
|
||||||
|
exit /B %RC%
|
||||||
|
|
||||||
|
:omega
|
||||||
|
call :returncode %RC%
|
Loading…
Reference in New Issue