diff --git a/.gitignore b/.gitignore index 88732f329..50710fa4b 100644 --- a/.gitignore +++ b/.gitignore @@ -46,5 +46,6 @@ Thumbs.db /binary_distrib /docs # CEF generated files +/include/cef_config.h /include/cef_version.h -.ccls-cache/ \ No newline at end of file +.ccls-cache/ diff --git a/BUILD.gn b/BUILD.gn index 2ec98d61b..38367b47e 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -196,10 +196,13 @@ gypi_paths2 = exec_script("//cef/tools/gypi_to_gn.py", group("cef") { testonly = true deps = [ - ":cefclient", ":cefsimple", ":ceftests", ] + + if (!is_linux || use_x11) { + deps += [ ":cefclient" ] + } } @@ -769,14 +772,25 @@ static_library("libcef_static") { "libcef/browser/osr/render_widget_host_view_osr_linux.cc", "libcef/browser/printing/print_dialog_linux.cc", "libcef/browser/printing/print_dialog_linux.h", - "libcef/browser/native/window_x11.cc", - "libcef/browser/native/window_x11.h", ] + if (use_x11) { + sources += [ + "libcef/browser/native/window_x11.cc", + "libcef/browser/native/window_x11.h", + ] + } + deps += [ "//build/config/freetype", "//third_party/fontconfig", ] + + if (is_linux && !use_x11) { + deps += [ + "//third_party/angle:libEGL", + ] + } } if (is_mac) { @@ -894,6 +908,15 @@ static_library("libcef_static") { "//ui/aura/test/ui_controls_factory_aura.h", ] + if (is_linux && !use_x11) { + sources += [ + "//ui/aura/test/mus/window_tree_client_test_api.h", + "//ui/aura/test/mus/window_tree_client_test_api.cc", + "//ui/aura/test/ui_controls_factory_ozone.cc", + "//ui/events/test/events_test_utils.cc" + ] + } + deps += [ "//ui/aura", "//ui/events", @@ -931,16 +954,23 @@ static_library("libcef_static") { # Part of //ui/aura:test_support which is testingonly. "//ui/aura/test/aura_test_utils.cc", "//ui/aura/test/aura_test_utils.h", - "//ui/aura/test/ui_controls_factory_aurax11.cc", - "//ui/aura/test/x11_event_sender.cc", - "//ui/aura/test/x11_event_sender.h", # Part of //ui/events:test_support which is testingonly. "//ui/events/test/platform_event_waiter.cc", "//ui/events/test/platform_event_waiter.h", - # Part of //ui/views:test_support which is testingonly. - "//ui/views/test/ui_controls_factory_desktop_aurax11.cc", - "//ui/views/test/ui_controls_factory_desktop_aurax11.h", ] + + if (use_x11) { + sources += [ + # Support for UI input events. + # Part of //ui/aura:test_support which is testingonly. + "//ui/aura/test/ui_controls_factory_aurax11.cc", + "//ui/aura/test/x11_event_sender.cc", + "//ui/aura/test/x11_event_sender.h", + # Part of //ui/views:test_support which is testingonly. + "//ui/views/test/ui_controls_factory_desktop_aurax11.cc", + "//ui/views/test/ui_controls_factory_desktop_aurax11.h", + ] + } } } else { sources += [ @@ -1952,6 +1982,12 @@ if (is_mac) { # The cefclient target depends on packages that are not available in the # default sysroot environment. if (is_linux && !use_sysroot) { + pkg_config("glib") { + packages = [ + "glib-2.0", + ] + } + pkg_config("gtk") { packages = [ "gmodule-2.0", @@ -2111,9 +2147,11 @@ if (is_mac) { sources += gypi_paths2.includes_linux + gypi_paths2.cefsimple_sources_linux - libs = [ - "X11", - ] + if (use_x11) { + libs = [ + "X11", + ] + } if (!is_component_build) { # Set rpath to find our own libfreetype even in a non-component build. @@ -2170,9 +2208,15 @@ if (is_mac) { sources += gypi_paths2.shared_sources_linux + gypi_paths2.ceftests_sources_linux - libs = [ - "X11", - ] + if (use_x11) { + libs = [ + "X11", + ] + } else { + if (!use_sysroot) { + configs += [ ":glib" ] + } + } deps += [ ":copy_ceftests_files", diff --git a/CMakeLists.txt.in b/CMakeLists.txt.in index 034ce56a0..120db2bde 100644 --- a/CMakeLists.txt.in +++ b/CMakeLists.txt.in @@ -200,11 +200,14 @@ add_subdirectory(${CEF_LIBCEF_DLL_WRAPPER_PATH} libcef_dll_wrapper) # Comes from the /CMakeLists.txt file in the current directory. # TODO: Change these lines to match your project target when you copy this file. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests") - add_subdirectory(tests/cefclient) add_subdirectory(tests/cefsimple) add_subdirectory(tests/gtest) add_subdirectory(tests/ceftests) endif() +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/tests/cefclient") + add_subdirectory(tests/cefclient) +endif() + # Display configuration settings. PRINT_CEF_CONFIG() diff --git a/cef_paths2.gypi b/cef_paths2.gypi index 81ac6234b..ef9055c60 100644 --- a/cef_paths2.gypi +++ b/cef_paths2.gypi @@ -36,6 +36,7 @@ 'include/base/internal/cef_thread_checker_impl.h', 'include/cef_api_hash.h', 'include/cef_base.h', + 'include/cef_config.h', 'include/cef_version.h', 'include/internal/cef_export.h', 'include/internal/cef_logging_internal.h', diff --git a/include/internal/cef_types_linux.h b/include/internal/cef_types_linux.h index 627d28e76..b21d6551e 100644 --- a/include/internal/cef_types_linux.h +++ b/include/internal/cef_types_linux.h @@ -32,18 +32,27 @@ #pragma once #include "include/base/cef_build.h" +#include "include/cef_config.h" #if defined(OS_LINUX) +#if defined(CEF_X11) typedef union _XEvent XEvent; typedef struct _XDisplay XDisplay; +#endif #include "include/internal/cef_export.h" #include "include/internal/cef_string.h" // Handle types. +#if defined(CEF_X11) #define cef_cursor_handle_t unsigned long #define cef_event_handle_t XEvent* +#else +#define cef_cursor_handle_t void* +#define cef_event_handle_t void* +#endif + #define cef_window_handle_t unsigned long #define kNullCursorHandle 0 @@ -58,7 +67,9 @@ extern "C" { // Return the singleton X11 display shared with Chromium. The display is not // thread-safe and must only be accessed on the browser process UI thread. /// +#if defined(CEF_X11) CEF_EXPORT XDisplay* cef_get_xdisplay(); +#endif /// // Structure representing CefExecuteProcess arguments. diff --git a/libcef/browser/native/browser_platform_delegate_native_linux.cc b/libcef/browser/native/browser_platform_delegate_native_linux.cc index 21fb0a992..390e52e0c 100644 --- a/libcef/browser/native/browser_platform_delegate_native_linux.cc +++ b/libcef/browser/native/browser_platform_delegate_native_linux.cc @@ -10,7 +10,6 @@ #include "libcef/browser/context.h" #include "libcef/browser/native/menu_runner_linux.h" #include "libcef/browser/native/window_delegate_view.h" -#include "libcef/browser/native/window_x11.h" #include "libcef/browser/thread_util.h" #include "base/no_destructor.h" @@ -23,10 +22,14 @@ #include "ui/events/keycodes/keyboard_code_conversion_xkb.h" #include "ui/events/keycodes/keysym_to_unicode.h" #include "ui/gfx/font_render_params.h" -#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" #include "ui/views/widget/widget.h" #include "third_party/blink/public/mojom/renderer_preferences.mojom.h" +#if defined(USE_X11) +#include "libcef/browser/native/window_x11.h" +#include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" +#endif + namespace { // Returns the number of seconds since system boot. @@ -48,8 +51,7 @@ CefBrowserPlatformDelegateNativeLinux::CefBrowserPlatformDelegateNativeLinux( false, use_external_begin_frame), host_window_created_(false), - window_widget_(nullptr), - window_x11_(nullptr) {} + window_widget_(nullptr) {} void CefBrowserPlatformDelegateNativeLinux::BrowserDestroyed( CefBrowserHostImpl* browser) { @@ -62,7 +64,6 @@ void CefBrowserPlatformDelegateNativeLinux::BrowserDestroyed( } bool CefBrowserPlatformDelegateNativeLinux::CreateHostWindow() { - DCHECK(!window_x11_); DCHECK(!window_widget_); if (window_info_.width == 0) @@ -73,6 +74,8 @@ bool CefBrowserPlatformDelegateNativeLinux::CreateHostWindow() { gfx::Rect rect(window_info_.x, window_info_.y, window_info_.width, window_info_.height); +#if defined(USE_X11) + DCHECK(!window_x11_); // Create a new window object. It will delete itself when the associated X11 // window is destroyed. window_x11_ = new CefWindowX11(browser_, window_info_.parent_window, rect, @@ -93,6 +96,7 @@ bool CefBrowserPlatformDelegateNativeLinux::CreateHostWindow() { window_widget_->Show(); window_x11_->Show(); +#endif // defined(USE_X11) // As an additional requirement on Linux, we must set the colors for the // render widgets in webkit. @@ -121,8 +125,10 @@ bool CefBrowserPlatformDelegateNativeLinux::CreateHostWindow() { } void CefBrowserPlatformDelegateNativeLinux::CloseHostWindow() { +#if defined(USE_X11) if (window_x11_) window_x11_->Close(); +#endif } CefWindowHandle CefBrowserPlatformDelegateNativeLinux::GetHostWindowHandle() @@ -146,18 +152,21 @@ void CefBrowserPlatformDelegateNativeLinux::SendFocusEvent(bool setFocus) { browser_->web_contents()->Focus(); } +#if defined(USE_X11) if (window_x11_) { // Give native focus to the DesktopNativeWidgetAura for the root window. // Needs to be done via the ::Window so that keyboard focus is assigned // correctly. window_x11_->Focus(); } +#endif // defined(USE_X11) } void CefBrowserPlatformDelegateNativeLinux::NotifyMoveOrResizeStarted() { // Call the parent method to dismiss any existing popups. CefBrowserPlatformDelegate::NotifyMoveOrResizeStarted(); +#if defined(USE_X11) if (!window_x11_) return; @@ -175,13 +184,16 @@ void CefBrowserPlatformDelegateNativeLinux::NotifyMoveOrResizeStarted() { content::RenderWidgetHostImpl::From( browser_->web_contents()->GetRenderViewHost()->GetWidget()) ->SendScreenRects(); +#endif // defined(USE_X11) } void CefBrowserPlatformDelegateNativeLinux::SizeTo(int width, int height) { +#if defined(USE_X11) if (window_x11_) { window_x11_->SetBounds( gfx::Rect(window_x11_->bounds().origin(), gfx::Size(width, height))); } +#endif // defined(USE_X11) } gfx::Point CefBrowserPlatformDelegateNativeLinux::GetScreenPoint( @@ -189,6 +201,7 @@ gfx::Point CefBrowserPlatformDelegateNativeLinux::GetScreenPoint( if (windowless_handler_) return windowless_handler_->GetParentScreenPoint(view); +#if defined(USE_X11) if (!window_x11_) return view; @@ -198,6 +211,8 @@ gfx::Point CefBrowserPlatformDelegateNativeLinux::GetScreenPoint( const gfx::Rect& bounds_in_screen = window_x11_->GetBoundsInScreen(); return gfx::Point(bounds_in_screen.x() + view.x(), bounds_in_screen.y() + view.y()); +#endif // defined(USE_X11) + return gfx::Point(); } void CefBrowserPlatformDelegateNativeLinux::ViewText(const std::string& text) { @@ -260,6 +275,7 @@ void CefBrowserPlatformDelegateNativeLinux::TranslateKeyEvent( NOTREACHED(); } +#if defined(USE_X11) // Populate DOM values that will be passed to JavaScript handlers via // KeyboardEvent. result.dom_code = static_cast( @@ -275,6 +291,7 @@ void CefBrowserPlatformDelegateNativeLinux::TranslateKeyEvent( result.SetModifiers(result.GetModifiers() | TranslateModifiers(key_event.modifiers)); +#endif // defined(USE_X11) } void CefBrowserPlatformDelegateNativeLinux::TranslateClickEvent( @@ -363,7 +380,8 @@ CefEventHandle CefBrowserPlatformDelegateNativeLinux::GetEventHandle( const content::NativeWebKeyboardEvent& event) const { if (!event.os_event) return NULL; - return const_cast(event.os_event->native_event()); + return const_cast( + static_cast(event.os_event->native_event())); } std::unique_ptr diff --git a/libcef/browser/native/browser_platform_delegate_native_linux.h b/libcef/browser/native/browser_platform_delegate_native_linux.h index 771d15134..98b014fae 100644 --- a/libcef/browser/native/browser_platform_delegate_native_linux.h +++ b/libcef/browser/native/browser_platform_delegate_native_linux.h @@ -7,7 +7,9 @@ #include "libcef/browser/native/browser_platform_delegate_native.h" +#if defined(USE_X11) class CefWindowX11; +#endif // Windowed browser implementation for Linux. class CefBrowserPlatformDelegateNativeLinux @@ -60,7 +62,9 @@ class CefBrowserPlatformDelegateNativeLinux // associated root window is destroyed. views::Widget* window_widget_; - CefWindowX11* window_x11_; +#if defined(USE_X11) + CefWindowX11* window_x11_ = nullptr; +#endif }; #endif // CEF_LIBCEF_BROWSER_NATIVE_BROWSER_PLATFORM_DELEGATE_NATIVE_LINUX_H_ diff --git a/libcef/browser/osr/render_widget_host_view_osr.cc b/libcef/browser/osr/render_widget_host_view_osr.cc index 218ecaa16..567ef853c 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.cc +++ b/libcef/browser/osr/render_widget_host_view_osr.cc @@ -9,7 +9,6 @@ #include -#include "libcef/browser/browser_host_impl.h" #include "libcef/browser/osr/osr_util.h" #include "libcef/browser/osr/software_output_device_osr.h" #include "libcef/browser/osr/synthetic_gesture_target_osr.h" diff --git a/libcef/browser/osr/render_widget_host_view_osr.h b/libcef/browser/osr/render_widget_host_view_osr.h index 4ee0459b0..7d3a44fa7 100644 --- a/libcef/browser/osr/render_widget_host_view_osr.h +++ b/libcef/browser/osr/render_widget_host_view_osr.h @@ -13,7 +13,7 @@ #include "include/cef_base.h" #include "include/cef_browser.h" - +#include "libcef/browser/browser_host_impl.h" #include "libcef/browser/osr/motion_event_osr.h" #include "base/memory/weak_ptr.h" @@ -60,7 +60,6 @@ class CursorManager; } // namespace content class CefBeginFrameTimer; -class CefBrowserHostImpl; class CefCopyFrameGenerator; class CefSoftwareOutputDeviceOSR; class CefWebContentsViewOSR; diff --git a/libcef/browser/osr/render_widget_host_view_osr_linux.cc b/libcef/browser/osr/render_widget_host_view_osr_linux.cc index c56258005..b397364de 100644 --- a/libcef/browser/osr/render_widget_host_view_osr_linux.cc +++ b/libcef/browser/osr/render_widget_host_view_osr_linux.cc @@ -5,16 +5,20 @@ #include "libcef/browser/osr/render_widget_host_view_osr.h" +#include "third_party/blink/public/platform/web_cursor_info.h" + +#if defined(USE_X11) #include #include #undef Status // Avoid conflicts with url_request_status.h #include "libcef/browser/native/window_x11.h" -#include "third_party/blink/public/platform/web_cursor_info.h" #include "ui/base/x/x11_util.h" #include "ui/gfx/x/x11_types.h" +#endif // defined(USE_X11) +#if defined(USE_X11) namespace { // Based on ui/base/cursor/cursor_loader_x11.cc. @@ -163,25 +167,31 @@ XCursorCache* cursor_cache = nullptr; } } // namespace +#endif // defined(USE_X11) void CefRenderWidgetHostViewOSR::PlatformCreateCompositorWidget( bool is_guest_view_hack) { +#if defined(USE_X11) // Create a hidden 1x1 window. It will delete itself on close. window_ = new CefWindowX11(NULL, None, gfx::Rect(0, 0, 1, 1), ""); compositor_widget_ = window_->xwindow(); +#endif } void CefRenderWidgetHostViewOSR::PlatformResizeCompositorWidget( const gfx::Size&) {} void CefRenderWidgetHostViewOSR::PlatformDestroyCompositorWidget() { +#if defined(USE_X11) DCHECK(window_); window_->Close(); +#endif compositor_widget_ = gfx::kNullAcceleratedWidget; } ui::PlatformCursor CefRenderWidgetHostViewOSR::GetPlatformCursor( blink::WebCursorInfo::Type type) { +#if defined(USE_X11) if (type == WebCursorInfo::kTypeNone) { if (!invisible_cursor_) { invisible_cursor_.reset(new ui::XScopedCursor(ui::CreateInvisibleCursor(), @@ -191,4 +201,6 @@ ui::PlatformCursor CefRenderWidgetHostViewOSR::GetPlatformCursor( } else { return GetXCursor(ToCursorID(type)); } +#endif // defined(USE_X11) + return 0; } diff --git a/libcef/browser/views/window_impl.cc b/libcef/browser/views/window_impl.cc index afd82157f..ea1af283e 100644 --- a/libcef/browser/views/window_impl.cc +++ b/libcef/browser/views/window_impl.cc @@ -20,7 +20,7 @@ #include "ui/aura/test/ui_controls_factory_aura.h" #include "ui/aura/window.h" #include "ui/base/test/ui_controls_aura.h" -#if defined(OS_LINUX) +#if defined(OS_LINUX) && defined(USE_X11) #include "ui/views/test/ui_controls_factory_desktop_aurax11.h" #endif #endif @@ -37,8 +37,9 @@ void InitializeUITesting() { if (!initialized) { ui_controls::EnableUIControls(); + #if defined(USE_AURA) -#if defined(OS_LINUX) +#if defined(OS_LINUX) && defined(USE_X11) ui_controls::InstallUIControlsAura( views::test::CreateUIControlsDesktopAura()); #else diff --git a/libcef/browser/views/window_view.cc b/libcef/browser/views/window_view.cc index 461a14904..6d21ccf37 100644 --- a/libcef/browser/views/window_view.cc +++ b/libcef/browser/views/window_view.cc @@ -13,7 +13,7 @@ #include "ui/views/widget/widget.h" #include "ui/views/window/native_frame_view.h" -#if defined(OS_LINUX) +#if defined(OS_LINUX) && defined(USE_X11) #include #include "ui/gfx/x/x11_types.h" #endif @@ -250,6 +250,7 @@ void CefWindowView::CreateWidget() { views::Widget::InitParams params; params.delegate = this; params.type = views::Widget::InitParams::TYPE_WINDOW; + params.bounds = gfx::Rect(CalculatePreferredSize()); bool can_activate = true; if (cef_delegate()) { @@ -294,7 +295,7 @@ void CefWindowView::CreateWidget() { DCHECK(widget->widget_delegate()->CanActivate()); } -#if defined(OS_LINUX) +#if defined(OS_LINUX) && defined(USE_X11) if (is_frameless_) { ::Window window = view_util::GetWindowHandle(widget); DCHECK(window); @@ -329,7 +330,7 @@ void CefWindowView::CreateWidget() { XChangeProperty(display, window, mwmHintsProperty, mwmHintsProperty, 32, PropModeReplace, (unsigned char*)&hints, 5); } -#endif // defined(OS_LINUX) +#endif // defined(OS_LINUX) && defined(USE_X11) } CefRefPtr CefWindowView::GetCefWindow() const { diff --git a/tests/cefsimple/CMakeLists.txt.in b/tests/cefsimple/CMakeLists.txt.in index 471f1d82f..917778444 100644 --- a/tests/cefsimple/CMakeLists.txt.in +++ b/tests/cefsimple/CMakeLists.txt.in @@ -73,6 +73,9 @@ if(OS_LINUX) # Copy binary and resource files to the target output directory. COPY_FILES("${CEF_TARGET}" "${CEF_BINARY_FILES}" "${CEF_BINARY_DIR}" "${CEF_TARGET_OUT_DIR}") COPY_FILES("${CEF_TARGET}" "${CEF_RESOURCE_FILES}" "${CEF_RESOURCE_DIR}" "${CEF_TARGET_OUT_DIR}") + if (EXISTS "${CEF_BINARY_DIR}/libminigbm.so") + COPY_FILES("${CEF_TARGET}" "libminigbm.so" "${CEF_BINARY_DIR}" "${CEF_TARGET_OUT_DIR}") + endif() # Set SUID permissions on the chrome-sandbox target. SET_LINUX_SUID_PERMISSIONS("${CEF_TARGET}" "${CEF_TARGET_OUT_DIR}/chrome-sandbox") diff --git a/tests/cefsimple/cefsimple_linux.cc b/tests/cefsimple/cefsimple_linux.cc index 94a63f77a..e67ed2631 100644 --- a/tests/cefsimple/cefsimple_linux.cc +++ b/tests/cefsimple/cefsimple_linux.cc @@ -4,10 +4,13 @@ #include "tests/cefsimple/simple_app.h" +#if defined(CEF_X11) #include +#endif #include "include/base/cef_logging.h" +#if defined(CEF_X11) namespace { int XErrorHandlerImpl(Display* display, XErrorEvent* event) { @@ -26,6 +29,7 @@ int XIOErrorHandlerImpl(Display* display) { } } // namespace +#endif // defined(CEF_X11) // Entry point function for all processes. int main(int argc, char* argv[]) { @@ -41,10 +45,12 @@ int main(int argc, char* argv[]) { return exit_code; } +#if defined(CEF_X11) // Install xlib error handlers so that the application won't be terminated // on non-fatal errors. XSetErrorHandler(XErrorHandlerImpl); XSetIOErrorHandler(XIOErrorHandlerImpl); +#endif // Specify CEF global settings here. CefSettings settings; diff --git a/tests/cefsimple/simple_app.cc b/tests/cefsimple/simple_app.cc index 5b0a7ef54..5d824ee5d 100644 --- a/tests/cefsimple/simple_app.cc +++ b/tests/cefsimple/simple_app.cc @@ -43,6 +43,10 @@ class SimpleWindowDelegate : public CefWindowDelegate { return true; } + CefSize GetPreferredSize(CefRefPtr view) OVERRIDE { + return CefSize(800, 600); + } + private: CefRefPtr browser_view_; diff --git a/tests/cefsimple/simple_handler_linux.cc b/tests/cefsimple/simple_handler_linux.cc index c4b677e68..239791cd3 100644 --- a/tests/cefsimple/simple_handler_linux.cc +++ b/tests/cefsimple/simple_handler_linux.cc @@ -4,8 +4,11 @@ #include "tests/cefsimple/simple_handler.h" +#if defined(CEF_X11) #include #include +#endif + #include #include "include/base/cef_logging.h" @@ -15,6 +18,7 @@ void SimpleHandler::PlatformTitleChange(CefRefPtr browser, const CefString& title) { std::string titleStr(title); +#if defined(CEF_X11) // Retrieve the X11 display shared with Chromium. ::Display* display = cef_get_xdisplay(); DCHECK(display); @@ -41,4 +45,5 @@ void SimpleHandler::PlatformTitleChange(CefRefPtr browser, // is Compound Text. This shouldn't matter 90% of the time since this is the // fallback to the UTF8 property above. XStoreName(display, browser->GetHost()->GetWindowHandle(), titleStr.c_str()); +#endif // defined(CEF_X11) } diff --git a/tests/ceftests/run_all_unittests.cc b/tests/ceftests/run_all_unittests.cc index 30b0d850a..6c8d9a54d 100644 --- a/tests/ceftests/run_all_unittests.cc +++ b/tests/ceftests/run_all_unittests.cc @@ -3,8 +3,9 @@ // can be found in the LICENSE file. #include "include/base/cef_build.h" +#include "include/cef_config.h" -#if defined(OS_LINUX) +#if defined(OS_LINUX) && defined(CEF_X11) #include // Definitions conflict with gtest. #undef None @@ -84,7 +85,7 @@ void ContinueOnUIThread(CefRefPtr test_task_runner) { CefCreateClosureTask(base::Bind(&RunTestsOnTestThread))); } -#if defined(OS_LINUX) +#if defined(OS_LINUX) && defined(CEF_X11) int XErrorHandlerImpl(Display* display, XErrorEvent* event) { LOG(WARNING) << "X error received: " << "type " << event->type << ", " @@ -99,7 +100,7 @@ int XErrorHandlerImpl(Display* display, XErrorEvent* event) { int XIOErrorHandlerImpl(Display* display) { return 0; } -#endif // defined(OS_LINUX) +#endif // defined(OS_LINUX) && defined(CEF_X11) } // namespace @@ -173,7 +174,7 @@ int main(int argc, char* argv[]) { PlatformInit(); #endif -#if defined(OS_LINUX) +#if defined(OS_LINUX) && defined(CEF_X11) // Install xlib error handlers so that the application won't be terminated // on non-fatal errors. XSetErrorHandler(XErrorHandlerImpl); diff --git a/tools/gclient_hook.py b/tools/gclient_hook.py index b3bfa7b96..ab79a6741 100644 --- a/tools/gclient_hook.py +++ b/tools/gclient_hook.py @@ -132,3 +132,14 @@ for dir, config in configs.items(): RunAction(src_dir, cmd) if platform == 'windows': issue_1999.apply(out_path) + +gn_dir = configs.keys()[0] +out_gn_path = os.path.join(src_dir, 'out', gn_dir) +gn_path = os.path.join(out_gn_path, 'args.gn') +print "\nGenerating CEF buildinfo header file..." +cmd = [ + 'python', 'tools/make_config_header.py', '--header', 'include/cef_config.h', + '--cef_gn_config', gn_path +] + +RunAction(cef_dir, cmd) diff --git a/tools/make_config_header.py b/tools/make_config_header.py new file mode 100644 index 000000000..54107018a --- /dev/null +++ b/tools/make_config_header.py @@ -0,0 +1,121 @@ +# Copyright (c) 2019 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. + +from date_util import * +from file_util import * +from optparse import OptionParser +import sys + +# cannot be loaded as a module +if __name__ != "__main__": + sys.stderr.write('This file cannot be loaded as a module!') + sys.exit() + +# parse command-line options +disc = """ +This utility creates the config header file. +""" +parser = OptionParser(description=disc) +parser.add_option( + '--header', + dest='header', + metavar='FILE', + help='output config header file [required]') +parser.add_option( + '--cef_gn_config', + dest='cef_gn_config', + metavar='FILE', + help='input CEF gn config file [required]') +parser.add_option( + '-q', + '--quiet', + action='store_true', + dest='quiet', + default=False, + help='do not output detailed status information') +(options, args) = parser.parse_args() + +# the header option is required +if options.header is None or options.cef_gn_config is None: + parser.print_help(sys.stdout) + sys.exit() + + +def check_x11_build(gn_config): + """ Scan gn configuration file and decide whether it's x11 build or not """ + lines = read_file(gn_config).split("\n") + for line in lines: + parts = line.split('=', 1) + if (parts[0] == "use_x11" and + parts[1] == "false") or (parts[0] == "use_ozone" and + parts[1] == "true"): + return False + + return True + +def write_config_header(header, cef_gn_config): + """ Creates the header file for the cef build configuration + if the information has changed or if the file doesn't already exist. """ + + if not path_exists(cef_gn_config): + raise Exception('file ' + cef_gn_config + ' does not exist.') + + if path_exists(header): + oldcontents = read_file(header) + else: + oldcontents = '' + + year = get_year() + + cef_x11_defines = "#define CEF_X11 1" if check_x11_build( + cef_gn_config) else "" + + newcontents = '// Copyright (c) '+year+' Marshall A. Greenblatt. All rights reserved.\n'+\ + '//\n'+\ + '// Redistribution and use in source and binary forms, with or without\n'+\ + '// modification, are permitted provided that the following conditions are\n'+\ + '// met:\n'+\ + '//\n'+\ + '// * Redistributions of source code must retain the above copyright\n'+\ + '// notice, this list of conditions and the following disclaimer.\n'+\ + '// * Redistributions in binary form must reproduce the above\n'+\ + '// copyright notice, this list of conditions and the following disclaimer\n'+\ + '// in the documentation and/or other materials provided with the\n'+\ + '// distribution.\n'+\ + '// * Neither the name of Google Inc. nor the name Chromium Embedded\n'+\ + '// Framework nor the names of its contributors may be used to endorse\n'+\ + '// or promote products derived from this software without specific prior\n'+\ + '// written permission.\n'+\ + '//\n'+\ + '// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n'+\ + '// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n'+\ + '// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n'+\ + '// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n'+\ + '// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n'+\ + '// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n'+\ + '// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n'+\ + '// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n'+\ + '// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n'+\ + '// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n'+\ + '// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n'+\ + '//\n'+\ + '// ---------------------------------------------------------------------------\n'+\ + '//\n'+\ + '// This file is generated by the make_config_header.py tool.\n'+\ + '//\n\n'+\ + '#ifndef CEF_INCLUDE_CEF_CONFIG_H_\n'+\ + '#define CEF_INCLUDE_CEF_CONFIG_H_\n\n'+\ + '' + cef_x11_defines + '\n'+\ + '#endif // CEF_INCLUDE_CEF_CONFIG_H_\n' + if newcontents != oldcontents: + write_file(header, newcontents) + return True + return False + +written = write_config_header(options.header, options.cef_gn_config) +if not options.quiet: + if written: + sys.stdout.write('File ' + options.header + ' updated.\n') + else: + sys.stdout.write('File ' + options.header + ' is already up to date.\n') diff --git a/tools/make_distrib.py b/tools/make_distrib.py index 165b402f4..5f4a4ea04 100644 --- a/tools/make_distrib.py +++ b/tools/make_distrib.py @@ -496,6 +496,12 @@ parser.add_option( dest='sandbox', default=False, help='include only the cef_sandbox static library (macOS and Windows only)') +parser.add_option( + '--ozone', + action='store_true', + dest='ozone', + default=False, + help='include ozone build related files (Linux only)') parser.add_option( '-q', '--quiet', @@ -541,6 +547,10 @@ if not options.ninjabuild: print 'Ninja build is required on all platforms' sys.exit() +if options.ozone and platform != 'linux': + print '--ozone is only supported on Linux.' + sys.exit() + # script directory script_dir = os.path.dirname(__file__) @@ -602,6 +612,9 @@ elif options.sandbox: else: mode = 'standard' +if options.ozone: + output_dir_name = output_dir_name + '_ozone' + output_dir = create_output_dir(output_dir_name, options.outputdir) # create the README.TXT file @@ -711,9 +724,10 @@ if mode == 'standard': shared_dir = os.path.join(tests_dir, 'shared') make_dir(shared_dir, options.quiet) - # create the tests/cefclient directory - cefclient_dir = os.path.join(tests_dir, 'cefclient') - make_dir(cefclient_dir, options.quiet) + if not options.ozone: + # create the tests/cefclient directory + cefclient_dir = os.path.join(tests_dir, 'cefclient') + make_dir(cefclient_dir, options.quiet) # create the tests/cefsimple directory cefsimple_dir = os.path.join(tests_dir, 'cefsimple') @@ -733,17 +747,18 @@ if mode == 'standard': transfer_gypi_files(cef_dir, cef_paths2['shared_sources_resources'], \ 'tests/shared/', shared_dir, options.quiet) - # transfer common cefclient files - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_browser'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_common'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_renderer'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_resources'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_resources_extensions_set_page_color'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) + if not options.ozone: + # transfer common cefclient files + transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_browser'], \ + 'tests/cefclient/', cefclient_dir, options.quiet) + transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_common'], \ + 'tests/cefclient/', cefclient_dir, options.quiet) + transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_renderer'], \ + 'tests/cefclient/', cefclient_dir, options.quiet) + transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_resources'], \ + 'tests/cefclient/', cefclient_dir, options.quiet) + transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_resources_extensions_set_page_color'], \ + 'tests/cefclient/', cefclient_dir, options.quiet) # transfer common cefsimple files transfer_gypi_files(cef_dir, cef_paths2['cefsimple_sources_common'], \ @@ -757,9 +772,10 @@ if mode == 'standard': create_fuzed_gtest(tests_dir) # process cmake templates - process_cmake_template(os.path.join(cef_dir, 'tests', 'cefclient', 'CMakeLists.txt.in'), \ - os.path.join(cefclient_dir, 'CMakeLists.txt'), \ - variables, options.quiet) + if not options.ozone: + process_cmake_template(os.path.join(cef_dir, 'tests', 'cefclient', 'CMakeLists.txt.in'), \ + os.path.join(cefclient_dir, 'CMakeLists.txt'), \ + variables, options.quiet) process_cmake_template(os.path.join(cef_dir, 'tests', 'cefsimple', 'CMakeLists.txt.in'), \ os.path.join(cefsimple_dir, 'CMakeLists.txt'), \ variables, options.quiet) @@ -1101,6 +1117,8 @@ elif platform == 'linux': {'path': 'swiftshader/libGLESv2.so'}, ] # yapf: enable + if options.ozone: + binaries.append({'path': 'libminigbm.so', 'conditional': True}) if mode == 'client': binaries.append({'path': 'cefsimple'}) @@ -1163,9 +1181,10 @@ elif platform == 'linux': transfer_gypi_files(cef_dir, cef_paths2['shared_sources_linux'], \ 'tests/shared/', shared_dir, options.quiet) - # transfer cefclient files - transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_linux'], \ - 'tests/cefclient/', cefclient_dir, options.quiet) + if not options.ozone: + # transfer cefclient files + transfer_gypi_files(cef_dir, cef_paths2['cefclient_sources_linux'], \ + 'tests/cefclient/', cefclient_dir, options.quiet) # transfer cefsimple files transfer_gypi_files(cef_dir, cef_paths2['cefsimple_sources_linux'], \