From 1e562dd13b144e10b4b21e276a82bf42315e5c4c Mon Sep 17 00:00:00 2001 From: Jason Tsai Date: Wed, 20 Mar 2024 12:11:53 +0800 Subject: [PATCH] fix(mac): unsuppressing media permission request only for macOS 14.0 --- .../fix-unsuppress-media-request-for-mac.md | 5 +++ src/wkwebview/mod.rs | 33 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 .changes/fix-unsuppress-media-request-for-mac.md diff --git a/.changes/fix-unsuppress-media-request-for-mac.md b/.changes/fix-unsuppress-media-request-for-mac.md new file mode 100644 index 000000000..b94d98b5e --- /dev/null +++ b/.changes/fix-unsuppress-media-request-for-mac.md @@ -0,0 +1,5 @@ +--- +"wry": patch +--- + +On macOS 14.0, unsuppressing the media permission request. diff --git a/src/wkwebview/mod.rs b/src/wkwebview/mod.rs index 9a51d86fe..eea06ff8e 100644 --- a/src/wkwebview/mod.rs +++ b/src/wkwebview/mod.rs @@ -15,7 +15,9 @@ mod synthetic_mouse_events; use cocoa::appkit::{NSView, NSViewHeightSizable, NSViewMinYMargin, NSViewWidthSizable}; use cocoa::{ base::{id, nil, NO, YES}, - foundation::{NSDictionary, NSFastEnumeration, NSInteger}, + foundation::{ + NSDictionary, NSFastEnumeration, NSInteger, NSOperatingSystemVersion, NSProcessInfo, + }, }; use raw_window_handle::{HasWindowHandle, RawWindowHandle}; @@ -806,10 +808,17 @@ impl InnerWebView { run_file_upload_panel as extern "C" fn(&Object, Sel, id, id, id, id), ); - ctl.add_method( - sel!(webView:requestMediaCapturePermissionForOrigin:initiatedByFrame:type:decisionHandler:), - request_media_capture_permission as extern "C" fn(&Object, Sel, id, id, id, id, id), - ); + // https://github.com/tauri-apps/wry/issues/1101 + #[cfg(target_os = "macos")] + match operating_system_version() { + (14, 0, _) => {} + _ => { + ctl.add_method( + sel!(webView:requestMediaCapturePermissionForOrigin:initiatedByFrame:type:decisionHandler:), + request_media_capture_permission as extern "C" fn(&Object, Sel, id, id, id, id, id), + ); + } + } ctl.register() } @@ -1201,8 +1210,22 @@ pub fn url_from_webview(webview: id) -> Result { .map_err(Into::into) } +pub fn operating_system_version() -> (u64, u64, u64) { + unsafe { + let process_info: id = msg_send![class!(NSProcessInfo), processInfo]; + let version: NSOperatingSystemVersion = msg_send![process_info, operatingSystemVersion]; + ( + version.majorVersion, + version.minorVersion, + version.patchVersion, + ) + } +} + +/// **Warning:** Panic occurs when caller application's `CFBundleDisplayName` contains non-ASCII characters. pub fn platform_webview_version() -> Result { unsafe { + // bundleWithIdentifier: panic when CFBundleDisplayName contains non-ASCII characters. let bundle: id = msg_send![class!(NSBundle), bundleWithIdentifier: NSString::new("com.apple.WebKit")]; let dict: id = msg_send![bundle, infoDictionary];