mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
chrome: Support usage of the Chrome toolbar from Views (see issue #2969)
This commit is contained in:
@ -68,9 +68,12 @@ content::WebContents* CefBrowserContentsDelegate::OpenURLFromTab(
|
||||
|
||||
if (auto c = client()) {
|
||||
if (auto handler = c->GetRequestHandler()) {
|
||||
// May return nullptr for omnibox navigations.
|
||||
auto frame = browser()->GetFrame(params.frame_tree_node_id);
|
||||
if (!frame)
|
||||
frame = browser()->GetMainFrame();
|
||||
cancel = handler->OnOpenURLFromTab(
|
||||
browser(), browser()->GetFrame(params.frame_tree_node_id),
|
||||
params.url.spec(),
|
||||
browser(), frame, params.url.spec(),
|
||||
static_cast<cef_window_open_disposition_t>(params.disposition),
|
||||
params.user_gesture);
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ void ChromeBrowserContext::InitializeAsync(base::OnceClosure initialized_cb) {
|
||||
|
||||
if (cache_path_ == user_data_dir) {
|
||||
// Use the default disk-based profile.
|
||||
auto profile = profile_manager->GetActiveUserProfile();
|
||||
auto profile = profile_manager->GetPrimaryUserProfile();
|
||||
ProfileCreated(profile, Profile::CreateStatus::CREATE_STATUS_CREATED);
|
||||
ProfileCreated(profile, Profile::CreateStatus::CREATE_STATUS_INITIALIZED);
|
||||
return;
|
||||
@ -63,7 +63,7 @@ void ChromeBrowserContext::Shutdown() {
|
||||
// |g_browser_process| may be nullptr during shutdown.
|
||||
if (should_destroy_ && g_browser_process) {
|
||||
g_browser_process->profile_manager()
|
||||
->GetActiveUserProfile()
|
||||
->GetPrimaryUserProfile()
|
||||
->DestroyOffTheRecordProfile(profile_);
|
||||
}
|
||||
profile_ = nullptr;
|
||||
@ -83,7 +83,7 @@ void ChromeBrowserContext::ProfileCreated(Profile* profile,
|
||||
// new/unique OffTheRecord profile instead.
|
||||
const auto& profile_id = Profile::OTRProfileID::CreateUniqueForCEF();
|
||||
parent_profile =
|
||||
g_browser_process->profile_manager()->GetActiveUserProfile();
|
||||
g_browser_process->profile_manager()->GetPrimaryUserProfile();
|
||||
profile_ = parent_profile->GetOffTheRecordProfile(profile_id);
|
||||
otr_profile = static_cast<OffTheRecordProfileImpl*>(profile_);
|
||||
status = Profile::CreateStatus::CREATE_STATUS_INITIALIZED;
|
||||
|
@ -68,3 +68,31 @@ void ChromeBrowserView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
|
||||
ParentClass::OnBoundsChanged(previous_bounds);
|
||||
browser_view_delegate_->OnBoundsChanged();
|
||||
}
|
||||
|
||||
ToolbarView* ChromeBrowserView::OverrideCreateToolbar(
|
||||
Browser* browser,
|
||||
BrowserView* browser_view) {
|
||||
if (cef_delegate()) {
|
||||
auto toolbar_type = cef_delegate()->GetChromeToolbarType();
|
||||
base::Optional<ToolbarView::DisplayMode> display_mode;
|
||||
switch (toolbar_type) {
|
||||
case CEF_CTT_NORMAL:
|
||||
display_mode = ToolbarView::DisplayMode::NORMAL;
|
||||
break;
|
||||
case CEF_CTT_LOCATION:
|
||||
display_mode = ToolbarView::DisplayMode::LOCATION;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (display_mode) {
|
||||
cef_toolbar_ = CefToolbarViewImpl::Create(nullptr, browser, browser_view,
|
||||
display_mode);
|
||||
// Ownership will be taken by BrowserView.
|
||||
view_util::PassOwnership(cef_toolbar_).release();
|
||||
return cef_toolbar_->root_view();
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include "include/views/cef_browser_view.h"
|
||||
#include "include/views/cef_browser_view_delegate.h"
|
||||
#include "libcef/browser/chrome/views/toolbar_view_impl.h"
|
||||
#include "libcef/browser/views/browser_view_view.h"
|
||||
#include "libcef/browser/views/view_view.h"
|
||||
|
||||
@ -42,6 +43,12 @@ class ChromeBrowserView
|
||||
void AddedToWidget() override;
|
||||
void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
|
||||
|
||||
// BrowserView methods:
|
||||
ToolbarView* OverrideCreateToolbar(Browser* browser,
|
||||
BrowserView* browser_view) override;
|
||||
|
||||
CefRefPtr<CefToolbarViewImpl> cef_toolbar() const { return cef_toolbar_; }
|
||||
|
||||
private:
|
||||
// Not owned by this object.
|
||||
Delegate* browser_view_delegate_;
|
||||
@ -51,6 +58,8 @@ class ChromeBrowserView
|
||||
|
||||
bool destroyed_ = false;
|
||||
|
||||
CefRefPtr<CefToolbarViewImpl> cef_toolbar_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(ChromeBrowserView);
|
||||
};
|
||||
|
||||
|
40
libcef/browser/chrome/views/toolbar_view_impl.cc
Normal file
40
libcef/browser/chrome/views/toolbar_view_impl.cc
Normal file
@ -0,0 +1,40 @@
|
||||
// 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.
|
||||
|
||||
#include "libcef/browser/chrome/views/toolbar_view_impl.h"
|
||||
|
||||
// static
|
||||
CefRefPtr<CefToolbarViewImpl> CefToolbarViewImpl::Create(
|
||||
CefRefPtr<CefViewDelegate> delegate,
|
||||
Browser* browser,
|
||||
BrowserView* browser_view,
|
||||
base::Optional<ToolbarView::DisplayMode> display_mode) {
|
||||
CEF_REQUIRE_UIT_RETURN(nullptr);
|
||||
CefRefPtr<CefToolbarViewImpl> view =
|
||||
new CefToolbarViewImpl(delegate, browser, browser_view, display_mode);
|
||||
view->Initialize();
|
||||
return view;
|
||||
}
|
||||
|
||||
// static
|
||||
const char* const CefToolbarViewImpl::kTypeString = "ToolbarView";
|
||||
|
||||
CefToolbarViewImpl::CefToolbarViewImpl(
|
||||
CefRefPtr<CefViewDelegate> delegate,
|
||||
Browser* browser,
|
||||
BrowserView* browser_view,
|
||||
base::Optional<ToolbarView::DisplayMode> display_mode)
|
||||
: ParentClass(delegate),
|
||||
browser_(browser),
|
||||
browser_view_(browser_view),
|
||||
display_mode_(display_mode) {}
|
||||
|
||||
CefToolbarViewView* CefToolbarViewImpl::CreateRootView() {
|
||||
return new CefToolbarViewView(delegate(), browser_, browser_view_,
|
||||
display_mode_);
|
||||
}
|
||||
|
||||
void CefToolbarViewImpl::InitializeRootView() {
|
||||
static_cast<CefToolbarViewView*>(root_view())->Initialize();
|
||||
}
|
55
libcef/browser/chrome/views/toolbar_view_impl.h
Normal file
55
libcef/browser/chrome/views/toolbar_view_impl.h
Normal file
@ -0,0 +1,55 @@
|
||||
// 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_TOOLBAR_VIEW_IMPL_H_
|
||||
#define CEF_LIBCEF_BROWSER_CHROME_VIEWS_TOOLBAR_VIEW_IMPL_H_
|
||||
#pragma once
|
||||
|
||||
#include "include/views/cef_view_delegate.h"
|
||||
|
||||
#include "libcef/browser/chrome/views/toolbar_view_view.h"
|
||||
#include "libcef/browser/views/view_impl.h"
|
||||
|
||||
class Browser;
|
||||
class BrowserView;
|
||||
|
||||
class CefToolbarViewImpl
|
||||
: public CefViewImpl<CefToolbarViewView, CefView, CefViewDelegate> {
|
||||
public:
|
||||
typedef CefViewImpl<CefToolbarViewView, CefView, CefViewDelegate> ParentClass;
|
||||
|
||||
// Create a new CefToolbarViewImpl instance. |delegate| may be nullptr.
|
||||
static CefRefPtr<CefToolbarViewImpl> Create(
|
||||
CefRefPtr<CefViewDelegate> delegate,
|
||||
Browser* browser,
|
||||
BrowserView* browser_view,
|
||||
base::Optional<ToolbarView::DisplayMode> display_mode);
|
||||
|
||||
static const char* const kTypeString;
|
||||
|
||||
// CefViewAdapter methods:
|
||||
std::string GetDebugType() override { return kTypeString; }
|
||||
|
||||
private:
|
||||
// Create a new implementation object.
|
||||
// Always call Initialize() after creation.
|
||||
// |delegate| may be nullptr.
|
||||
CefToolbarViewImpl(CefRefPtr<CefViewDelegate> delegate,
|
||||
Browser* browser,
|
||||
BrowserView* browser_view,
|
||||
base::Optional<ToolbarView::DisplayMode> display_mode);
|
||||
|
||||
// CefViewImpl methods:
|
||||
CefToolbarViewView* CreateRootView() override;
|
||||
void InitializeRootView() override;
|
||||
|
||||
Browser* const browser_;
|
||||
BrowserView* const browser_view_;
|
||||
base::Optional<ToolbarView::DisplayMode> const display_mode_;
|
||||
|
||||
IMPLEMENT_REFCOUNTING_DELETE_ON_UIT(CefToolbarViewImpl);
|
||||
DISALLOW_COPY_AND_ASSIGN(CefToolbarViewImpl);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_VIEWS_SCROLL_VIEW_IMPL_H_
|
11
libcef/browser/chrome/views/toolbar_view_view.cc
Normal file
11
libcef/browser/chrome/views/toolbar_view_view.cc
Normal file
@ -0,0 +1,11 @@
|
||||
// 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.
|
||||
|
||||
#include "libcef/browser/chrome/views/toolbar_view_view.h"
|
||||
|
||||
CefToolbarViewView::CefToolbarViewView(CefViewDelegate* cef_delegate,
|
||||
Browser* browser,
|
||||
BrowserView* browser_view,
|
||||
base::Optional<DisplayMode> display_mode)
|
||||
: ParentClass(cef_delegate, browser, browser_view, display_mode) {}
|
27
libcef/browser/chrome/views/toolbar_view_view.h
Normal file
27
libcef/browser/chrome/views/toolbar_view_view.h
Normal file
@ -0,0 +1,27 @@
|
||||
// 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_TOOLBAR_VIEW_VIEW_H_
|
||||
#define CEF_LIBCEF_BROWSER_CHROME_VIEWS_TOOLBAR_VIEW_VIEW_H_
|
||||
#pragma once
|
||||
|
||||
#include "libcef/browser/views/view_view.h"
|
||||
|
||||
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
|
||||
|
||||
class CefToolbarViewView : public CefViewView<ToolbarView, CefViewDelegate> {
|
||||
public:
|
||||
typedef CefViewView<ToolbarView, CefViewDelegate> ParentClass;
|
||||
|
||||
// |cef_delegate| may be nullptr.
|
||||
explicit CefToolbarViewView(CefViewDelegate* cef_delegate,
|
||||
Browser* browser,
|
||||
BrowserView* browser_view,
|
||||
base::Optional<DisplayMode> display_mode);
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(CefToolbarViewView);
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_CHROME_VIEWS_TOOLBAR_VIEW_VIEW_H_
|
@ -123,6 +123,15 @@ CefRefPtr<CefBrowser> CefBrowserViewImpl::GetBrowser() {
|
||||
return browser_;
|
||||
}
|
||||
|
||||
CefRefPtr<CefView> CefBrowserViewImpl::GetChromeToolbar() {
|
||||
CEF_REQUIRE_VALID_RETURN(nullptr);
|
||||
if (cef::IsChromeRuntimeEnabled()) {
|
||||
return static_cast<ChromeBrowserView*>(root_view())->cef_toolbar();
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void CefBrowserViewImpl::SetPreferAccelerators(bool prefer_accelerators) {
|
||||
CEF_REQUIRE_VALID_RETURN_VOID();
|
||||
if (web_view())
|
||||
|
@ -53,6 +53,7 @@ class CefBrowserViewImpl
|
||||
|
||||
// CefBrowserView methods:
|
||||
CefRefPtr<CefBrowser> GetBrowser() override;
|
||||
CefRefPtr<CefView> GetChromeToolbar() override;
|
||||
void SetPreferAccelerators(bool prefer_accelerators) override;
|
||||
|
||||
// CefView methods:
|
||||
|
@ -28,8 +28,9 @@ CEF_BUTTON_VIEW_T class CefButtonView : public CEF_VIEW_VIEW_D {
|
||||
typedef CEF_VIEW_VIEW_D ParentClass;
|
||||
|
||||
// |cef_delegate| may be nullptr.
|
||||
explicit CefButtonView(CefViewDelegateClass* cef_delegate)
|
||||
: ParentClass(cef_delegate) {}
|
||||
template <typename... Args>
|
||||
explicit CefButtonView(CefViewDelegateClass* cef_delegate, Args... args)
|
||||
: ParentClass(cef_delegate, args...) {}
|
||||
|
||||
// Returns the CefButton associated with this view. See comments on
|
||||
// CefViewView::GetCefView.
|
||||
|
@ -25,8 +25,9 @@ CEF_LABEL_BUTTON_VIEW_T class CefLabelButtonView : public CEF_BUTTON_VIEW_D {
|
||||
typedef CEF_BUTTON_VIEW_D ParentClass;
|
||||
|
||||
// |cef_delegate| may be nullptr.
|
||||
explicit CefLabelButtonView(CefViewDelegateClass* cef_delegate)
|
||||
: ParentClass(cef_delegate) {}
|
||||
template <typename... Args>
|
||||
explicit CefLabelButtonView(CefViewDelegateClass* cef_delegate, Args... args)
|
||||
: ParentClass(cef_delegate, args...) {}
|
||||
|
||||
void Initialize() override {
|
||||
ParentClass::Initialize();
|
||||
|
@ -113,12 +113,14 @@ CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::AddChildView(CefRefPtr<CefView> view) {
|
||||
CEF_REQUIRE_VALID_RETURN_VOID();
|
||||
DCHECK(view.get());
|
||||
DCHECK(view->IsValid());
|
||||
DCHECK(!view->IsAttached());
|
||||
if (!view.get() || !view->IsValid() || view->IsAttached())
|
||||
if (!view.get() || !view->IsValid())
|
||||
return;
|
||||
|
||||
std::unique_ptr<views::View> view_ptr = view_util::PassOwnership(view);
|
||||
ParentClass::content_view()->AddChildView(view_ptr.release());
|
||||
auto* view_ptr = view->IsAttached()
|
||||
? view_util::GetFor(view)
|
||||
: view_util::PassOwnership(view).release();
|
||||
DCHECK(view_ptr);
|
||||
ParentClass::content_view()->AddChildView(view_ptr);
|
||||
}
|
||||
|
||||
CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::AddChildViewAt(CefRefPtr<CefView> view,
|
||||
@ -126,18 +128,20 @@ CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::AddChildViewAt(CefRefPtr<CefView> view,
|
||||
CEF_REQUIRE_VALID_RETURN_VOID();
|
||||
DCHECK(view.get());
|
||||
DCHECK(view->IsValid());
|
||||
DCHECK(!view->IsAttached());
|
||||
DCHECK_GE(index, 0);
|
||||
DCHECK_LE(static_cast<unsigned int>(index),
|
||||
ParentClass::content_view()->children().size());
|
||||
if (!view.get() || !view->IsValid() || view->IsAttached() || index < 0 ||
|
||||
if (!view.get() || !view->IsValid() || index < 0 ||
|
||||
(static_cast<unsigned int>(index) >
|
||||
ParentClass::content_view()->children().size())) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::unique_ptr<views::View> view_ptr = view_util::PassOwnership(view);
|
||||
ParentClass::content_view()->AddChildViewAt(view_ptr.release(), index);
|
||||
auto* view_ptr = view->IsAttached()
|
||||
? view_util::GetFor(view)
|
||||
: view_util::PassOwnership(view).release();
|
||||
DCHECK(view_ptr);
|
||||
ParentClass::content_view()->AddChildViewAt(view_ptr, index);
|
||||
}
|
||||
|
||||
CEF_PANEL_IMPL_T void CEF_PANEL_IMPL_D::ReorderChildView(
|
||||
|
@ -26,8 +26,9 @@ CEF_PANEL_VIEW_T class CefPanelView : public CEF_VIEW_VIEW_D {
|
||||
typedef CEF_VIEW_VIEW_D ParentClass;
|
||||
|
||||
// |cef_delegate| may be nullptr.
|
||||
explicit CefPanelView(CefViewDelegateClass* cef_delegate)
|
||||
: ParentClass(cef_delegate) {}
|
||||
template <typename... Args>
|
||||
explicit CefPanelView(CefViewDelegateClass* cef_delegate, Args... args)
|
||||
: ParentClass(cef_delegate, args...) {}
|
||||
|
||||
// Returns the CefPanel associated with this view. See comments on
|
||||
// CefViewView::GetCefView.
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include "libcef/browser/views/view_adapter.h"
|
||||
|
||||
#include "libcef/browser/chrome/views/toolbar_view_impl.h"
|
||||
#include "libcef/browser/views/basic_label_button_impl.h"
|
||||
#include "libcef/browser/views/basic_panel_impl.h"
|
||||
#include "libcef/browser/views/browser_view_impl.h"
|
||||
@ -40,6 +41,9 @@ CefViewAdapter* CefViewAdapter::GetFor(CefRefPtr<CefView> view) {
|
||||
adapter = static_cast<CefScrollViewImpl*>(view->AsScrollView().get());
|
||||
} else if (view->AsTextfield()) {
|
||||
adapter = static_cast<CefTextfieldImpl*>(view->AsTextfield().get());
|
||||
} else if (view->GetTypeString().ToString() ==
|
||||
CefToolbarViewImpl::kTypeString) {
|
||||
adapter = static_cast<CefToolbarViewImpl*>(view.get());
|
||||
}
|
||||
|
||||
DCHECK(adapter);
|
||||
|
@ -34,8 +34,9 @@ CEF_VIEW_VIEW_T class CefViewView : public ViewsViewClass {
|
||||
// Do not call complex views::View-derived methods from a CefViewView-derived
|
||||
// constructor as they may attempt to call back into CefViewImpl before
|
||||
// registration has been performed. |cef_delegate| may be nullptr.
|
||||
explicit CefViewView(CefViewDelegateClass* cef_delegate)
|
||||
: cef_delegate_(cef_delegate) {}
|
||||
template <typename... Args>
|
||||
explicit CefViewView(CefViewDelegateClass* cef_delegate, Args... args)
|
||||
: ParentClass(args...), cef_delegate_(cef_delegate) {}
|
||||
|
||||
// Should be called from InitializeRootView() in the CefViewImpl-derived
|
||||
// class that created this object. This method will be called after
|
||||
@ -70,6 +71,8 @@ CEF_VIEW_VIEW_T class CefViewView : public ViewsViewClass {
|
||||
void Layout() override;
|
||||
void ViewHierarchyChanged(
|
||||
const views::ViewHierarchyChangedDetails& details) override;
|
||||
void AddedToWidget() override;
|
||||
void RemovedFromWidget() override;
|
||||
void OnFocus() override;
|
||||
void OnBlur() override;
|
||||
|
||||
@ -84,7 +87,7 @@ CEF_VIEW_VIEW_T class CefViewView : public ViewsViewClass {
|
||||
const views::ViewHierarchyChangedDetails& details);
|
||||
|
||||
// Not owned by this object.
|
||||
CefViewDelegateClass* cef_delegate_;
|
||||
CefViewDelegateClass* const cef_delegate_;
|
||||
};
|
||||
|
||||
CEF_VIEW_VIEW_T gfx::Size CEF_VIEW_VIEW_D::CalculatePreferredSize() const {
|
||||
@ -162,6 +165,18 @@ CEF_VIEW_VIEW_T void CEF_VIEW_VIEW_D::ViewHierarchyChanged(
|
||||
ParentClass::ViewHierarchyChanged(details);
|
||||
}
|
||||
|
||||
CEF_VIEW_VIEW_T void CEF_VIEW_VIEW_D::AddedToWidget() {
|
||||
ParentClass::AddedToWidget();
|
||||
if (cef_delegate())
|
||||
cef_delegate()->OnWindowChanged(GetCefView(), /*added=*/true);
|
||||
}
|
||||
|
||||
CEF_VIEW_VIEW_T void CEF_VIEW_VIEW_D::RemovedFromWidget() {
|
||||
if (cef_delegate())
|
||||
cef_delegate()->OnWindowChanged(GetCefView(), /*added=*/false);
|
||||
ParentClass::RemovedFromWidget();
|
||||
}
|
||||
|
||||
CEF_VIEW_VIEW_T void CEF_VIEW_VIEW_D::OnFocus() {
|
||||
if (cef_delegate())
|
||||
cef_delegate()->OnFocus(GetCefView());
|
||||
|
Reference in New Issue
Block a user