// 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; // Use the CEF Chrome runtime if "--enable-chrome-runtime" is specified via // the command-line. Otherwise, use the CEF Alloy runtime. For more // information about CEF runtimes see // https://bitbucket.org/chromiumembedded/cef/wiki/Architecture.md#markdown-header-cef3 if (command_line->HasSwitch("enable-chrome-runtime")) { settings.chrome_runtime = true; } #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; }