// 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. #include #include "include/cef_command_line.h" #include "include/cef_sandbox_win.h" #include "tests/cefsimple/simple_app.h" // When generating projects with CMake the CEF_USE_SANDBOX value will be defined // automatically if using the required compiler version. Pass -DUSE_SANDBOX=OFF // to the CMake command-line to disable use of the sandbox. // Uncomment this line to manually enable sandbox support. // #define CEF_USE_SANDBOX 1 #if defined(CEF_USE_SANDBOX) // The cef_sandbox.lib static library may not link successfully with all VS // versions. #pragma comment(lib, "cef_sandbox.lib") #endif // Entry point function for all processes. int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); int exit_code; #if defined(ARCH_CPU_32_BITS) // Run the main thread on 32-bit Windows using a fiber with the preferred 4MiB // stack size. This function must be called at the top of the executable entry // point function (`main()` or `wWinMain()`). It is used in combination with // the initial stack size of 0.5MiB configured via the `/STACK:0x80000` linker // flag on executable targets. This saves significant memory on threads (like // those in the Windows thread pool, and others) whose stack size can only be // controlled via the linker flag. exit_code = CefRunWinMainWithPreferredStackSize(wWinMain, hInstance, lpCmdLine, nCmdShow); if (exit_code >= 0) { // The fiber has completed so return here. return exit_code; } #endif void* sandbox_info = nullptr; #if defined(CEF_USE_SANDBOX) // Manage the life span of the sandbox information object. This is necessary // for sandbox support on Windows. See cef_sandbox_win.h for complete details. CefScopedSandboxInfo scoped_sandbox; sandbox_info = scoped_sandbox.sandbox_info(); #endif // Provide CEF with command-line arguments. CefMainArgs main_args(hInstance); // CEF applications have multiple sub-processes (render, GPU, etc) that share // the same executable. This function checks the command-line and, if this is // a sub-process, executes the appropriate logic. exit_code = CefExecuteProcess(main_args, nullptr, sandbox_info); if (exit_code >= 0) { // The sub-process has completed so return here. return exit_code; } // Parse command-line arguments for use in this method. CefRefPtr command_line = CefCommandLine::CreateCommandLine(); command_line->InitFromString(::GetCommandLineW()); // Specify CEF global settings here. CefSettings settings; #if !defined(DISABLE_ALLOY_BOOTSTRAP) // Use the CEF Chrome bootstrap unless "--disable-chrome-runtime" is specified // via the command-line. Otherwise, use the CEF Alloy bootstrap. The Alloy // bootstrap is deprecated and will be removed in ~M127. See // https://github.com/chromiumembedded/cef/issues/3685 settings.chrome_runtime = !command_line->HasSwitch("disable-chrome-runtime"); #endif #if !defined(CEF_USE_SANDBOX) settings.no_sandbox = true; #endif // SimpleApp implements application-level callbacks for the browser process. // It will create the first browser instance in OnContextInitialized() after // CEF has initialized. CefRefPtr app(new SimpleApp); // Initialize the CEF browser process. May return false if initialization // fails or if early exit is desired (for example, due to process singleton // relaunch behavior). if (!CefInitialize(main_args, settings, app.get(), sandbox_info)) { return CefGetExitCode(); } // Run the CEF message loop. This will block until CefQuitMessageLoop() is // called. CefRunMessageLoop(); // Shut down CEF. CefShutdown(); return 0; }