mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
chrome: mac: Support dispatch of window commands (see #3462)
This commit is contained in:
@@ -8,6 +8,12 @@
|
||||
#include "chrome/browser/ui/browser.h"
|
||||
#include "chrome/browser/ui/views/frame/browser_view.h"
|
||||
|
||||
#if BUILDFLAG(IS_MAC)
|
||||
#include "libcef/browser/views/native_widget_mac.h"
|
||||
#include "libcef/browser/views/view_util.h"
|
||||
#include "ui/views/widget/native_widget_private.h"
|
||||
#endif
|
||||
|
||||
void ChromeBrowserFrame::Init(BrowserView* browser_view,
|
||||
std::unique_ptr<Browser> browser) {
|
||||
DCHECK(browser_view);
|
||||
@@ -21,6 +27,19 @@ void ChromeBrowserFrame::Init(BrowserView* browser_view,
|
||||
|
||||
// Initialize BrowserView state.
|
||||
browser_view->InitBrowser(std::move(browser));
|
||||
|
||||
#if BUILDFLAG(IS_MAC)
|
||||
// Initialize native window state.
|
||||
if (auto native_window = view_util::GetNativeWindow(this)) {
|
||||
if (auto* native_widget_private = views::internal::NativeWidgetPrivate::
|
||||
GetNativeWidgetForNativeWindow(native_window)) {
|
||||
auto* native_widget_mac =
|
||||
static_cast<CefNativeWidgetMac*>(native_widget_private);
|
||||
native_widget_mac->SetBrowserView(browser_view);
|
||||
native_widget_mac->OnWindowInitialized();
|
||||
}
|
||||
}
|
||||
#endif // BUILDFLAG(IS_MAC)
|
||||
}
|
||||
|
||||
views::internal::RootView* ChromeBrowserFrame::CreateRootView() {
|
||||
|
@@ -10,6 +10,7 @@
|
||||
|
||||
#include "ui/views/widget/native_widget_mac.h"
|
||||
|
||||
class BrowserView;
|
||||
class CefWindow;
|
||||
class CefWindowDelegate;
|
||||
|
||||
@@ -23,19 +24,31 @@ class CefNativeWidgetMac : public views::NativeWidgetMac {
|
||||
CefNativeWidgetMac(const CefNativeWidgetMac&) = delete;
|
||||
CefNativeWidgetMac& operator=(const CefNativeWidgetMac&) = delete;
|
||||
|
||||
protected:
|
||||
void SetBrowserView(BrowserView* browser_view);
|
||||
|
||||
// NativeWidgetMac:
|
||||
void ValidateUserInterfaceItem(
|
||||
int32_t command,
|
||||
remote_cocoa::mojom::ValidateUserInterfaceItemResult* result) override;
|
||||
bool WillExecuteCommand(int32_t command,
|
||||
WindowOpenDisposition window_open_disposition,
|
||||
bool is_before_first_responder) override;
|
||||
bool ExecuteCommand(int32_t command,
|
||||
WindowOpenDisposition window_open_disposition,
|
||||
bool is_before_first_responder) override;
|
||||
NativeWidgetMacNSWindow* CreateNSWindow(
|
||||
const remote_cocoa::mojom::CreateWindowParams* params) override;
|
||||
|
||||
void GetWindowFrameTitlebarHeight(bool* override_titlebar_height,
|
||||
float* titlebar_height) override;
|
||||
void OnWindowFullscreenTransitionStart() override;
|
||||
void OnWindowFullscreenTransitionComplete() override;
|
||||
void OnWindowInitialized() override;
|
||||
|
||||
private:
|
||||
const CefRefPtr<CefWindow> window_;
|
||||
CefWindowDelegate* const window_delegate_;
|
||||
|
||||
BrowserView* browser_view_ = nullptr;
|
||||
};
|
||||
|
||||
#endif // CEF_LIBCEF_BROWSER_VIEWS_NATIVE_WIDGET_MAC_H_
|
||||
|
@@ -8,6 +8,27 @@
|
||||
#include "include/views/cef_window_delegate.h"
|
||||
#include "libcef/browser/views/ns_window.h"
|
||||
|
||||
#include "chrome/browser/apps/app_shim/app_shim_host_mac.h"
|
||||
#include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
|
||||
#import "chrome/browser/ui/cocoa/browser_window_command_handler.h"
|
||||
#import "chrome/browser/ui/cocoa/chrome_command_dispatcher_delegate.h"
|
||||
#include "chrome/browser/ui/views/frame/browser_frame_mac.h"
|
||||
#include "chrome/browser/ui/views/frame/browser_view.h"
|
||||
#import "components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h"
|
||||
#import "ui/views/cocoa/native_widget_mac_ns_window_host.h"
|
||||
|
||||
namespace {
|
||||
|
||||
AppShimHost* GetHostForBrowser(Browser* browser) {
|
||||
auto* const shim_manager = apps::AppShimManager::Get();
|
||||
if (!shim_manager) {
|
||||
return nullptr;
|
||||
}
|
||||
return shim_manager->GetHostForRemoteCocoaBrowser(browser);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
CefNativeWidgetMac::CefNativeWidgetMac(
|
||||
views::internal::NativeWidgetDelegate* delegate,
|
||||
CefRefPtr<CefWindow> window,
|
||||
@@ -16,6 +37,48 @@ CefNativeWidgetMac::CefNativeWidgetMac(
|
||||
window_(window),
|
||||
window_delegate_(window_delegate) {}
|
||||
|
||||
void CefNativeWidgetMac::SetBrowserView(BrowserView* browser_view) {
|
||||
browser_view_ = browser_view;
|
||||
}
|
||||
|
||||
void CefNativeWidgetMac::ValidateUserInterfaceItem(
|
||||
int32_t tag,
|
||||
remote_cocoa::mojom::ValidateUserInterfaceItemResult* result) {
|
||||
if (!browser_view_) {
|
||||
result->enable = false;
|
||||
return;
|
||||
}
|
||||
|
||||
return BrowserFrameMac::ValidateUserInterfaceItem(browser_view_->browser(),
|
||||
tag, result);
|
||||
}
|
||||
|
||||
bool CefNativeWidgetMac::WillExecuteCommand(
|
||||
int32_t command,
|
||||
WindowOpenDisposition window_open_disposition,
|
||||
bool is_before_first_responder) {
|
||||
if (!browser_view_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return BrowserFrameMac::WillExecuteCommand(browser_view_->browser(), command,
|
||||
window_open_disposition,
|
||||
is_before_first_responder);
|
||||
}
|
||||
|
||||
bool CefNativeWidgetMac::ExecuteCommand(
|
||||
int32_t command,
|
||||
WindowOpenDisposition window_open_disposition,
|
||||
bool is_before_first_responder) {
|
||||
if (!browser_view_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return BrowserFrameMac::ExecuteCommand(browser_view_->browser(), command,
|
||||
window_open_disposition,
|
||||
is_before_first_responder);
|
||||
}
|
||||
|
||||
NativeWidgetMacNSWindow* CefNativeWidgetMac::CreateNSWindow(
|
||||
const remote_cocoa::mojom::CreateWindowParams* params) {
|
||||
NSUInteger style_mask =
|
||||
@@ -62,3 +125,21 @@ void CefNativeWidgetMac::OnWindowFullscreenTransitionComplete() {
|
||||
views::NativeWidgetMac::OnWindowFullscreenTransitionComplete();
|
||||
window_delegate_->OnWindowFullscreenTransition(window_, true);
|
||||
}
|
||||
|
||||
void CefNativeWidgetMac::OnWindowInitialized() {
|
||||
if (!browser_view_) {
|
||||
return;
|
||||
}
|
||||
|
||||
// From BrowserFrameMac::OnWindowInitialized.
|
||||
if (auto* bridge = GetInProcessNSWindowBridge()) {
|
||||
bridge->SetCommandDispatcher(
|
||||
[[[ChromeCommandDispatcherDelegate alloc] init] autorelease],
|
||||
[[[BrowserWindowCommandHandler alloc] init] autorelease]);
|
||||
} else {
|
||||
if (auto* host = GetHostForBrowser(browser_view_->browser())) {
|
||||
host->GetAppShim()->CreateCommandDispatcherForWidget(
|
||||
GetNSWindowHost()->bridged_native_widget_id());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user