mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	The Chrome browser can now be hosted in a Views-based application on Windows and Linux. To launch a fully-featured Chrome window using cefsimple: $ cefsimple --enable-chrome-runtime To launch a minimally-styled Views-hosted window using cefsimple: $ cefsimple --enable-chrome-runtime --use-views To launch a fully-styled Views-hosted window using cefclient: $ cefclient --enable-chrome-runtime --use-views Views unit tests also now pass with the Chrome runtime enabled: $ ceftests --gtest_filter=Views* --enable-chrome-runtime Known issues: - Popup browsers cannot be intercepted and reparented.
		
			
				
	
	
		
			110 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2021 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.
 | |
| 
 | |
| #ifndef CEF_LIBCEF_BROWSER_CHROME_VIEWS_CHROME_BROWSER_FRAME_H_
 | |
| #define CEF_LIBCEF_BROWSER_CHROME_VIEWS_CHROME_BROWSER_FRAME_H_
 | |
| #pragma once
 | |
| 
 | |
| #include "chrome/browser/ui/browser.h"
 | |
| #include "chrome/browser/ui/views/frame/browser_frame.h"
 | |
| 
 | |
| // An overview of the Chrome Browser object model is provided below. Object
 | |
| // creation normally begins with a call to Browser::Create(CreateParams) which
 | |
| // then creates the necessary Browser view, window and frame objects. CEF has
 | |
| // modified the default object creation model are described below to better
 | |
| // integrate with the existing CEF Views APIs.
 | |
| //
 | |
| // OVERVIEW
 | |
| //
 | |
| // Browser and BrowserWindow are the primary Chrome objects. Browser provides
 | |
| // the concrete state and mutation methods while BrowserWindow is an interface
 | |
| // implemented by the platform-specific "view" of the Browser window.
 | |
| //
 | |
| // Browser:
 | |
| // - Creates a BrowserView (aka BrowserWindow) and BrowserFrame (aka Widget) via
 | |
| //   a call to BrowserWindow::CreateBrowserWindow() in the Browser constructor.
 | |
| //   - An existing BrowserWindow can alternately be specified via the
 | |
| //     Browser::CreateParams::window parameter.
 | |
| // - Owned by the BrowserView after creation.
 | |
| //
 | |
| // The Chrome Views implementation uses BrowserView to represent the browser
 | |
| // client area and BrowserFrame (plus helpers) to represent the non-client
 | |
| // window frame.
 | |
| //
 | |
| // BrowserView:
 | |
| // - Extends BrowserWindow, views::ClientView, views::WidgetDelegate.
 | |
| // - Owns the Browser.
 | |
| // - References the BrowserFrame.
 | |
| // - Passed to Widget::Init() via Widget::InitParams::delegate to receive
 | |
| //   WidgetDelegate callbacks.
 | |
| // - Extended by CEF as ChromeBrowserView.
 | |
| // BrowserFrame:
 | |
| // - Extends Widget (aka views::internal::NativeWidgetDelegate).
 | |
| // - References the BrowserView.
 | |
| // - Creates/owns a DesktopBrowserFrameAura (aka NativeBrowserFrame) via
 | |
| //   BrowserFrame::InitBrowserFrame().
 | |
| // - Extended by CEF as ChromeBrowserFrame.
 | |
| //
 | |
| // Chrome custom window/frame handling is implemented using platform-specific
 | |
| // objects.
 | |
| //
 | |
| // DesktopBrowserFrameAura:
 | |
| // - Extends NativeBrowserFrame, DesktopNativeWidgetAura.
 | |
| // - Acts as a helper for BrowserFrame.
 | |
| // - Creates/references a BrowserDesktopWindowTreeHostWin via
 | |
| //   DesktopBrowserFrameAura::InitNativeWidget().
 | |
| // BrowserDesktopWindowTreeHostWin (for Windows):
 | |
| // - Extends DesktopWindowTreeHost.
 | |
| // - References DesktopBrowserFrameAura, BrowserView, BrowserFrame.
 | |
| // - Passed to Widget::Init() via Widget::InitParams::desktop_window_tree_host.
 | |
| //
 | |
| // CEF MODIFICATIONS
 | |
| //
 | |
| // The CEF Views integration uses an alternative approach of creating the
 | |
| // ChromeBrowserFrame in CefWindowView::CreateWidget() and the
 | |
| // ChromeBrowserView in CefBrowserViewImpl::CreateRootView().
 | |
| // The object associations described above are then configured via
 | |
| // ChromeBrowserView::AddedToWidget() and ChromeBrowserHostImpl::Create()
 | |
| // after the BrowserView is added to the Widget. The Chromium code has been
 | |
| // patched to allow later initialization of the Browser, BrowserFrame and
 | |
| // BrowserView members to support this model.
 | |
| //
 | |
| // CEF does not use Chrome's NativeBrowserFrame (aka DesktopBrowserFrameAura),
 | |
| // BrowserNonClientFrameView or BrowserRootView objects (all normally created by
 | |
| // BrowserFrame during Widget initialization). Consequently
 | |
| // |BrowserFrame::native_browser_frame_| and |BrowserFrame::browser_frame_view_|
 | |
| // (sometimes retrieved via BrowserFrame::GetFrameView) will be nullptr and the
 | |
| // Chromium code has been patched to add the necessary null checks.
 | |
| //
 | |
| // CEF does not pass ChromeBrowserView as the WidgetDelegate when the Widget is
 | |
| // initialized in CefWindowView::CreateWidget(). Some of the WidgetDelegate
 | |
| // callbacks may need to be routed from CefWindowView to ChromeBrowserView in
 | |
| // the future.
 | |
| //
 | |
| // See the chrome_runtime_views.patch file for the complete set of related
 | |
| // modifications.
 | |
| 
 | |
| class BrowserView;
 | |
| 
 | |
| // Widget for a Views-hosted Chrome browser. Created in
 | |
| // CefWindowView::CreateWidget() when the Chrome runtime is enabled.
 | |
| class ChromeBrowserFrame : public BrowserFrame {
 | |
|  public:
 | |
|   ChromeBrowserFrame() {}
 | |
|   ChromeBrowserFrame(const ChromeBrowserFrame&) = delete;
 | |
|   ChromeBrowserFrame& operator=(const ChromeBrowserFrame&) = delete;
 | |
| 
 | |
|   void Init(BrowserView* browser_view, std::unique_ptr<Browser> browser);
 | |
| 
 | |
|   // views::Widget methods:
 | |
|   views::internal::RootView* CreateRootView() override;
 | |
|   std::unique_ptr<views::NonClientFrameView> CreateNonClientFrameView()
 | |
|       override;
 | |
| 
 | |
|  private:
 | |
|   Browser* browser_ = nullptr;
 | |
| };
 | |
| 
 | |
| #endif  // CEF_LIBCEF_BROWSER_CHROME_VIEWS_CHROME_BROWSER_FRAME_H_
 |