mirror of
				https://bitbucket.org/chromiumembedded/cef
				synced 2025-06-05 21:39:12 +02:00 
			
		
		
		
	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:
		@@ -120,10 +120,25 @@ index 0ce7abdeb7d9f..8197a6bb7da98 100644
 | 
			
		||||
 
 | 
			
		||||
   // Initialize the frame (creates the underlying native window).
 | 
			
		||||
diff --git chrome/browser/ui/views/frame/browser_view.cc chrome/browser/ui/views/frame/browser_view.cc
 | 
			
		||||
index 621fbe0c72d07..f556734d79428 100644
 | 
			
		||||
index 621fbe0c72d07..cf658ca239889 100644
 | 
			
		||||
--- chrome/browser/ui/views/frame/browser_view.cc
 | 
			
		||||
+++ chrome/browser/ui/views/frame/browser_view.cc
 | 
			
		||||
@@ -594,11 +594,22 @@ class BrowserView::AccessibilityModeObserver : public ui::AXModeObserver {
 | 
			
		||||
@@ -275,11 +275,10 @@ using content::WebContents;
 | 
			
		||||
 using views::ColumnSet;
 | 
			
		||||
 using web_modal::WebContentsModalDialogHost;
 | 
			
		||||
 
 | 
			
		||||
-namespace {
 | 
			
		||||
+// static
 | 
			
		||||
+const char BrowserView::kBrowserViewKey[] = "__BROWSER_VIEW__";
 | 
			
		||||
 
 | 
			
		||||
-// The name of a key to store on the window handle so that other code can
 | 
			
		||||
-// locate this object using just the handle.
 | 
			
		||||
-const char* const kBrowserViewKey = "__BROWSER_VIEW__";
 | 
			
		||||
+namespace {
 | 
			
		||||
 
 | 
			
		||||
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 | 
			
		||||
 // UMA histograms that record animation smoothness for tab loading animation.
 | 
			
		||||
@@ -594,11 +593,22 @@ class BrowserView::AccessibilityModeObserver : public ui::AXModeObserver {
 | 
			
		||||
 ///////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 // BrowserView, public:
 | 
			
		||||
 
 | 
			
		||||
@@ -147,7 +162,7 @@ index 621fbe0c72d07..f556734d79428 100644
 | 
			
		||||
   SetShowIcon(::ShouldShowWindowIcon(browser_.get()));
 | 
			
		||||
 
 | 
			
		||||
   // In forced app mode, all size controls are always disabled. Otherwise, use
 | 
			
		||||
@@ -612,7 +623,6 @@ BrowserView::BrowserView(std::unique_ptr<Browser> browser)
 | 
			
		||||
@@ -612,7 +622,6 @@ BrowserView::BrowserView(std::unique_ptr<Browser> browser)
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
   browser_->tab_strip_model()->AddObserver(this);
 | 
			
		||||
@@ -155,7 +170,7 @@ index 621fbe0c72d07..f556734d79428 100644
 | 
			
		||||
 
 | 
			
		||||
   // Top container holds tab strip region and toolbar and lives at the front of
 | 
			
		||||
   // the view hierarchy.
 | 
			
		||||
@@ -656,8 +666,15 @@ BrowserView::BrowserView(std::unique_ptr<Browser> browser)
 | 
			
		||||
@@ -656,8 +665,15 @@ BrowserView::BrowserView(std::unique_ptr<Browser> browser)
 | 
			
		||||
   contents_container->SetLayoutManager(std::make_unique<ContentsLayoutManager>(
 | 
			
		||||
       devtools_web_view_, contents_web_view_));
 | 
			
		||||
 
 | 
			
		||||
@@ -173,7 +188,7 @@ index 621fbe0c72d07..f556734d79428 100644
 | 
			
		||||
 
 | 
			
		||||
   contents_separator_ =
 | 
			
		||||
       top_container_->AddChildView(std::make_unique<ContentsSeparator>());
 | 
			
		||||
@@ -1441,6 +1458,8 @@ bool BrowserView::ShouldHideUIForFullscreen() const {
 | 
			
		||||
@@ -1441,6 +1457,8 @@ bool BrowserView::ShouldHideUIForFullscreen() const {
 | 
			
		||||
   if (immersive_mode_controller_->IsEnabled())
 | 
			
		||||
     return false;
 | 
			
		||||
 
 | 
			
		||||
@@ -182,7 +197,7 @@ index 621fbe0c72d07..f556734d79428 100644
 | 
			
		||||
   return frame_->GetFrameView()->ShouldHideTopUIForFullscreen();
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
@@ -2492,7 +2511,8 @@ BrowserView::GetNativeViewHostsForTopControlsSlide() const {
 | 
			
		||||
@@ -2492,7 +2510,8 @@ BrowserView::GetNativeViewHostsForTopControlsSlide() const {
 | 
			
		||||
 }
 | 
			
		||||
 
 | 
			
		||||
 void BrowserView::ReparentTopContainerForEndOfImmersive() {
 | 
			
		||||
@@ -192,7 +207,7 @@ index 621fbe0c72d07..f556734d79428 100644
 | 
			
		||||
   top_container()->DestroyLayer();
 | 
			
		||||
   AddChildViewAt(top_container(), 0);
 | 
			
		||||
   EnsureFocusOrder();
 | 
			
		||||
@@ -2944,8 +2964,10 @@ void BrowserView::Layout() {
 | 
			
		||||
@@ -2944,8 +2963,10 @@ void BrowserView::Layout() {
 | 
			
		||||
 
 | 
			
		||||
   // TODO(jamescook): Why was this in the middle of layout code?
 | 
			
		||||
   toolbar_->location_bar()->omnibox_view()->SetFocusBehavior(
 | 
			
		||||
@@ -205,7 +220,7 @@ index 621fbe0c72d07..f556734d79428 100644
 | 
			
		||||
 
 | 
			
		||||
   // Some of the situations when the BrowserView is laid out are:
 | 
			
		||||
   // - Enter/exit immersive fullscreen mode.
 | 
			
		||||
@@ -3008,6 +3030,11 @@ void BrowserView::AddedToWidget() {
 | 
			
		||||
@@ -3008,6 +3029,11 @@ void BrowserView::AddedToWidget() {
 | 
			
		||||
   SetThemeProfileForWindow(GetNativeWindow(), browser_->profile());
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
@@ -217,7 +232,7 @@ index 621fbe0c72d07..f556734d79428 100644
 | 
			
		||||
   toolbar_->Init();
 | 
			
		||||
 
 | 
			
		||||
 #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 | 
			
		||||
@@ -3043,13 +3070,9 @@ void BrowserView::AddedToWidget() {
 | 
			
		||||
@@ -3043,13 +3069,9 @@ void BrowserView::AddedToWidget() {
 | 
			
		||||
 
 | 
			
		||||
   EnsureFocusOrder();
 | 
			
		||||
 
 | 
			
		||||
@@ -234,10 +249,10 @@ index 621fbe0c72d07..f556734d79428 100644
 | 
			
		||||
 
 | 
			
		||||
   MaybeInitializeWebUITabStrip();
 | 
			
		||||
diff --git chrome/browser/ui/views/frame/browser_view.h chrome/browser/ui/views/frame/browser_view.h
 | 
			
		||||
index 021f04720e567..8c4f2cbf34f25 100644
 | 
			
		||||
index 021f04720e567..98097fd4f11f5 100644
 | 
			
		||||
--- chrome/browser/ui/views/frame/browser_view.h
 | 
			
		||||
+++ chrome/browser/ui/views/frame/browser_view.h
 | 
			
		||||
@@ -114,7 +114,9 @@ class BrowserView : public BrowserWindow,
 | 
			
		||||
@@ -114,11 +114,16 @@ class BrowserView : public BrowserWindow,
 | 
			
		||||
                     public webapps::AppBannerManager::Observer {
 | 
			
		||||
  public:
 | 
			
		||||
   METADATA_HEADER(BrowserView);
 | 
			
		||||
@@ -247,7 +262,14 @@ index 021f04720e567..8c4f2cbf34f25 100644
 | 
			
		||||
   BrowserView(const BrowserView&) = delete;
 | 
			
		||||
   BrowserView& operator=(const BrowserView&) = delete;
 | 
			
		||||
   ~BrowserView() override;
 | 
			
		||||
@@ -668,6 +670,12 @@ class BrowserView : public BrowserWindow,
 | 
			
		||||
 
 | 
			
		||||
+  // Key used to bind BrowserView to the Widget with which it is associated.
 | 
			
		||||
+  static const char kBrowserViewKey[];
 | 
			
		||||
+
 | 
			
		||||
   void set_frame(BrowserFrame* frame) { frame_ = frame; }
 | 
			
		||||
   BrowserFrame* frame() const { return frame_; }
 | 
			
		||||
 
 | 
			
		||||
@@ -668,6 +673,12 @@ class BrowserView : public BrowserWindow,
 | 
			
		||||
     return accessibility_focus_highlight_.get();
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -261,15 +283,25 @@ index 021f04720e567..8c4f2cbf34f25 100644
 | 
			
		||||
   // Do not friend BrowserViewLayout. Use the BrowserViewLayoutDelegate
 | 
			
		||||
   // interface to keep these two classes decoupled and testable.
 | 
			
		||||
diff --git chrome/browser/ui/views/frame/browser_view_layout.cc chrome/browser/ui/views/frame/browser_view_layout.cc
 | 
			
		||||
index 18a85f436bd97..0d6e4c9f916e7 100644
 | 
			
		||||
index 18a85f436bd97..cf880936a8edf 100644
 | 
			
		||||
--- chrome/browser/ui/views/frame/browser_view_layout.cc
 | 
			
		||||
+++ chrome/browser/ui/views/frame/browser_view_layout.cc
 | 
			
		||||
@@ -441,6 +441,12 @@ int BrowserViewLayout::LayoutWebUITabStrip(int top) {
 | 
			
		||||
@@ -39,6 +39,10 @@
 | 
			
		||||
 #include "ui/views/widget/widget.h"
 | 
			
		||||
 #include "ui/views/window/client_view.h"
 | 
			
		||||
 
 | 
			
		||||
+#if BUILDFLAG(ENABLE_CEF)
 | 
			
		||||
+#include "cef/libcef/browser/chrome/views/chrome_views_util.h"
 | 
			
		||||
+#endif
 | 
			
		||||
+
 | 
			
		||||
 using views::View;
 | 
			
		||||
 using web_modal::WebContentsModalDialogHost;
 | 
			
		||||
 using web_modal::ModalDialogHostObserver;
 | 
			
		||||
@@ -441,6 +445,11 @@ int BrowserViewLayout::LayoutWebUITabStrip(int top) {
 | 
			
		||||
 
 | 
			
		||||
 int BrowserViewLayout::LayoutToolbar(int top) {
 | 
			
		||||
   TRACE_EVENT0("ui", "BrowserViewLayout::LayoutToolbar");
 | 
			
		||||
+  if (toolbar_->parent() && toolbar_->parent()->GetLayoutManager() != this &&
 | 
			
		||||
+      toolbar_->parent()->GetLayoutManager() != nullptr) {
 | 
			
		||||
+  if (cef::IsCefView(toolbar_)) {
 | 
			
		||||
+    // CEF may take ownership of the toolbar. Early exit to avoid the DCHECK
 | 
			
		||||
+    // in LayoutManager::SetViewVisibility().
 | 
			
		||||
+    return top;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user