chrome: mac: Support dispatch of window commands (see #3462)

This commit is contained in:
Marshall Greenblatt 2023-04-18 17:20:44 -04:00
parent a39c2a0068
commit 7ade772e0b
5 changed files with 217 additions and 2 deletions

View File

@ -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() {

View File

@ -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_

View File

@ -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());
}
}
}

View File

@ -258,6 +258,11 @@ patches = [
# https://github.com/chromiumembedded/cef/issues/2969
'name': 'chrome_browser_extensions',
},
{
# chrome: Expose static access to BrowserFrameMac methods.
# https://github.com/chromiumembedded/cef/issues/3462
'name': 'chrome_browser_frame_mac',
},
{
# alloy: Disable ProxyErrorClient callbacks when extensions are disabled.
# https://github.com/chromiumembedded/cef/issues/2830

View File

@ -0,0 +1,97 @@
diff --git chrome/browser/ui/views/frame/browser_frame_mac.h chrome/browser/ui/views/frame/browser_frame_mac.h
index ab1d8fd9bfa84..77f65b44e591a 100644
--- chrome/browser/ui/views/frame/browser_frame_mac.h
+++ chrome/browser/ui/views/frame/browser_frame_mac.h
@@ -12,6 +12,7 @@
#include "chrome/browser/command_observer.h"
#include "ui/views/widget/native_widget_mac.h"
+class Browser;
class BrowserFrame;
class BrowserView;
@class BrowserWindowTouchBarController;
@@ -55,6 +56,21 @@ class BrowserFrameMac : public views::NativeWidgetMac,
bool ShouldUseInitialVisibleOnAllWorkspaces() const override;
void AnnounceTextInInProcessWindow(const std::u16string& text) override;
+ static void ValidateUserInterfaceItem(
+ Browser* browser,
+ int32_t command,
+ remote_cocoa::mojom::ValidateUserInterfaceItemResult* result);
+ static bool WillExecuteCommand(
+ Browser* browser,
+ int32_t command,
+ WindowOpenDisposition window_open_disposition,
+ bool is_before_first_responder);
+ static bool ExecuteCommand(
+ Browser* browser,
+ int32_t command,
+ WindowOpenDisposition window_open_disposition,
+ bool is_before_first_responder);
+
protected:
~BrowserFrameMac() override;
diff --git chrome/browser/ui/views/frame/browser_frame_mac.mm chrome/browser/ui/views/frame/browser_frame_mac.mm
index 95c64d44044a3..18b017166320f 100644
--- chrome/browser/ui/views/frame/browser_frame_mac.mm
+++ chrome/browser/ui/views/frame/browser_frame_mac.mm
@@ -176,7 +176,14 @@ - (NSTouchBar*)makeTouchBar {
void BrowserFrameMac::ValidateUserInterfaceItem(
int32_t tag,
remote_cocoa::mojom::ValidateUserInterfaceItemResult* result) {
- Browser* browser = browser_view_->browser();
+ return ValidateUserInterfaceItem(browser_view_->browser(), tag, result);
+}
+
+// static
+void BrowserFrameMac::ValidateUserInterfaceItem(
+ Browser* browser,
+ int32_t tag,
+ remote_cocoa::mojom::ValidateUserInterfaceItemResult* result) {
if (!chrome::SupportsCommand(browser, tag)) {
result->enable = false;
return;
@@ -304,8 +311,16 @@ - (NSTouchBar*)makeTouchBar {
int32_t command,
WindowOpenDisposition window_open_disposition,
bool is_before_first_responder) {
- Browser* browser = browser_view_->browser();
+ return WillExecuteCommand(browser_view_->browser(), command,
+ window_open_disposition, is_before_first_responder);
+}
+// static
+bool BrowserFrameMac::WillExecuteCommand(
+ Browser* browser,
+ int32_t command,
+ WindowOpenDisposition window_open_disposition,
+ bool is_before_first_responder) {
if (is_before_first_responder) {
// The specification for this private extensions API is incredibly vague.
// For now, we avoid triggering chrome commands prior to giving the
@@ -336,11 +351,20 @@ - (NSTouchBar*)makeTouchBar {
int32_t command,
WindowOpenDisposition window_open_disposition,
bool is_before_first_responder) {
- if (!WillExecuteCommand(command, window_open_disposition,
- is_before_first_responder))
- return false;
+ return ExecuteCommand(browser_view_->browser(), command,
+ window_open_disposition, is_before_first_responder);
+}
- Browser* browser = browser_view_->browser();
+// static
+bool BrowserFrameMac::ExecuteCommand(
+ Browser* browser,
+ int32_t command,
+ WindowOpenDisposition window_open_disposition,
+ bool is_before_first_responder) {
+ if (!WillExecuteCommand(browser, command, window_open_disposition,
+ is_before_first_responder)) {
+ return false;
+ }
chrome::ExecuteCommandWithDisposition(browser, command,
window_open_disposition);