mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-02-16 20:20:51 +01:00
chrome: mac: Support dispatch of window commands (see #3462)
This commit is contained in:
parent
a39c2a0068
commit
7ade772e0b
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
97
patch/patches/chrome_browser_frame_mac.patch
Normal file
97
patch/patches/chrome_browser_frame_mac.patch
Normal 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);
|
Loading…
x
Reference in New Issue
Block a user