diff --git a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKNavigationDelegate.swift b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKNavigationDelegate.swift index 317b214a10f3..f2bf24393dfb 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKNavigationDelegate.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKNavigationDelegate.swift @@ -1359,48 +1359,65 @@ extension BrowserViewController: WKUIDelegate { type: WKMediaCaptureType, decisionHandler: @escaping (WKPermissionDecision) -> Void ) { - let titleFormat: String = { - switch type { - case .camera: - return Strings.requestCameraPermissionPrompt - case .microphone: - return Strings.requestMicrophonePermissionPrompt - case .cameraAndMicrophone: - return Strings.requestCameraAndMicrophonePermissionPrompt - @unknown default: - return Strings.requestCaptureDevicePermissionPrompt - } - }() - let title = String.localizedStringWithFormat(titleFormat, origin.host) - let alertController = BrowserAlertController(title: title, message: nil, preferredStyle: .alert) - alertController.addAction( - .init( - title: Strings.requestCaptureDevicePermissionAllowButtonTitle, - style: .default, - handler: { _ in - decisionHandler(.grant) + let presentAlert = { [weak self] in + guard let self = self else { return } + + let titleFormat: String = { + switch type { + case .camera: + return Strings.requestCameraPermissionPrompt + case .microphone: + return Strings.requestMicrophonePermissionPrompt + case .cameraAndMicrophone: + return Strings.requestCameraAndMicrophonePermissionPrompt + @unknown default: + return Strings.requestCaptureDevicePermissionPrompt } + }() + let title = String.localizedStringWithFormat(titleFormat, origin.host) + let alertController = BrowserAlertController( + title: title, + message: nil, + preferredStyle: .alert ) - ) - alertController.addAction( - .init( - title: Strings.CancelString, - style: .cancel, - handler: { _ in - decisionHandler(.deny) - } + alertController.addAction( + .init( + title: Strings.requestCaptureDevicePermissionAllowButtonTitle, + style: .default, + handler: { _ in + decisionHandler(.grant) + } + ) ) - ) - alertController.dismissedWithoutAction = { - decisionHandler(.prompt) + alertController.addAction( + .init( + title: Strings.CancelString, + style: .cancel, + handler: { _ in + decisionHandler(.deny) + } + ) + ) + alertController.dismissedWithoutAction = { + decisionHandler(.prompt) + } + if webView.fullscreenState == .inFullscreen || webView.fullscreenState == .enteringFullscreen + { + webView.closeAllMediaPresentations { + self.present(alertController, animated: true) + } + return + } + self.present(alertController, animated: true) } - if webView.fullscreenState == .inFullscreen || webView.fullscreenState == .enteringFullscreen { - webView.closeAllMediaPresentations { - self.present(alertController, animated: true) + + if let presentedViewController = presentedViewController as? BrowserAlertController { + presentedViewController.dismiss(animated: true) { + presentAlert() } - return + } else { + presentAlert() } - present(alertController, animated: true) } fileprivate func shouldDisplayJSAlertForWebView(_ webView: WKWebView) -> Bool {