views: Add support for absolute positioned overlay views.

To test:
Run `cefclient.exe --use-views --hide-frame --hide-controls`
Add `--enable-chrome-runtime` for the same behavior using the Chrome location
bar instead of a text field.
This commit is contained in:
Marshall Greenblatt
2021-08-27 21:55:15 -04:00
parent 6f6072b857
commit 4a44e16a09
96 changed files with 3875 additions and 230 deletions

View File

@@ -6,19 +6,24 @@
#define CEF_LIBCEF_BROWSER_VIEWS_WINDOW_VIEW_H_
#pragma once
#include <vector>
#include "include/views/cef_window.h"
#include "include/views/cef_window_delegate.h"
#include "libcef/browser/views/overlay_view_host.h"
#include "libcef/browser/views/panel_view.h"
#include "third_party/skia/include/core/SkRegion.h"
#include "ui/display/display.h"
#include "ui/views/widget/widget_delegate.h"
#include "ui/views/widget/widget_observer.h"
// Manages the views-based root window. This object will be deleted
// automatically when the associated root window is destroyed.
class CefWindowView
: public CefPanelView<views::WidgetDelegateView, CefWindowDelegate> {
: public CefPanelView<views::WidgetDelegateView, CefWindowDelegate>,
public views::WidgetObserver {
public:
typedef CefPanelView<views::WidgetDelegateView, CefWindowDelegate>
ParentClass;
@@ -70,6 +75,10 @@ class CefWindowView
void ViewHierarchyChanged(
const views::ViewHierarchyChangedDetails& details) override;
// views::WidgetObserver methods:
void OnWidgetBoundsChanged(views::Widget* widget,
const gfx::Rect& new_bounds) override;
// Returns the Display containing this Window.
display::Display GetDisplay() const;
@@ -89,6 +98,10 @@ class CefWindowView
void SetWindowAppIcon(CefRefPtr<CefImage> window_app_icon);
CefRefPtr<CefImage> window_app_icon() const { return window_app_icon_; }
CefRefPtr<CefOverlayController> AddOverlayView(
CefRefPtr<CefView> view,
cef_docking_mode_t docking_mode);
// Set/get the draggable regions.
void SetDraggableRegions(const std::vector<CefDraggableRegion>& regions);
SkRegion* draggable_region() const { return draggable_region_.get(); }
@@ -100,6 +113,8 @@ class CefWindowView
// Called when removed from the Widget and before |this| is deleted.
void DeleteDelegate();
void MoveOverlaysIfNecessary();
// Not owned by this object.
Delegate* window_delegate_;
@@ -112,6 +127,9 @@ class CefWindowView
std::unique_ptr<SkRegion> draggable_region_;
// Hosts for overlay widgets.
std::vector<std::unique_ptr<CefOverlayViewHost>> overlay_hosts_;
DISALLOW_COPY_AND_ASSIGN(CefWindowView);
};