You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by dp...@apache.org on 2024/12/16 20:35:36 UTC
(cordova-ios) branch master updated: (iOS) Avoid repetitive permission prompts (#1245)
This is an automated email from the ASF dual-hosted git repository.
dpogue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cordova-ios.git
The following commit(s) were added to refs/heads/master by this push:
new 3737f515 (iOS) Avoid repetitive permission prompts (#1245)
3737f515 is described below
commit 3737f515ba0b30ac8e32595a9ab9626e7ae9401d
Author: jancabadaj <32...@users.noreply.github.com>
AuthorDate: Mon Dec 16 21:35:31 2024 +0100
(iOS) Avoid repetitive permission prompts (#1245)
---
.../Plugins/CDVWebViewEngine/CDVWebViewEngine.m | 24 ++++++++++++++++++++
.../CDVWebViewEngine/CDVWebViewUIDelegate.h | 9 ++++++++
.../CDVWebViewEngine/CDVWebViewUIDelegate.m | 26 ++++++++++++++++++++++
templates/cordova/defaults.xml | 1 +
4 files changed, 60 insertions(+)
diff --git a/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m b/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m
index 88f2d9a9..45ad8ff8 100644
--- a/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m
+++ b/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewEngine.m
@@ -189,6 +189,7 @@
CDVWebViewUIDelegate* uiDelegate = [[CDVWebViewUIDelegate alloc] initWithViewController:self.viewController];
uiDelegate.title = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
+ uiDelegate.mediaPermissionGrantType = [self parsePermissionGrantType:[settings cordovaSettingForKey:@"MediaPermissionGrantType"]];
uiDelegate.allowNewWindows = [settings cordovaBoolSettingForKey:@"AllowNewWindows" defaultValue:NO];
self.uiDelegate = uiDelegate;
@@ -453,6 +454,29 @@
return self.engineWebView;
}
+- (CDVWebViewPermissionGrantType)parsePermissionGrantType:(NSString*)optionString
+{
+ CDVWebViewPermissionGrantType result = CDVWebViewPermissionGrantType_GrantIfSameHost_ElsePrompt;
+
+ if (optionString != nil){
+ if ([optionString isEqualToString:@"prompt"]) {
+ result = CDVWebViewPermissionGrantType_Prompt;
+ } else if ([optionString isEqualToString:@"deny"]) {
+ result = CDVWebViewPermissionGrantType_Deny;
+ } else if ([optionString isEqualToString:@"grant"]) {
+ result = CDVWebViewPermissionGrantType_Grant;
+ } else if ([optionString isEqualToString:@"grantIfSameHostElsePrompt"]) {
+ result = CDVWebViewPermissionGrantType_GrantIfSameHost_ElsePrompt;
+ } else if ([optionString isEqualToString:@"grantIfSameHostElseDeny"]) {
+ result = CDVWebViewPermissionGrantType_GrantIfSameHost_ElseDeny;
+ } else {
+ NSLog(@"Invalid \"MediaPermissionGrantType\" was detected. Fallback to default value of \"grantIfSameHostElsePrompt\"");
+ }
+ }
+
+ return result;
+}
+
#pragma mark WKScriptMessageHandler implementation
- (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message
diff --git a/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.h b/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.h
index 581eea0c..2e4ac894 100644
--- a/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.h
+++ b/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.h
@@ -32,8 +32,17 @@ NS_ASSUME_NONNULL_BEGIN
CDV_SWIFT_UI_ACTOR
@interface CDVWebViewUIDelegate : NSObject <WKUIDelegate>
+typedef NS_ENUM(NSInteger, CDVWebViewPermissionGrantType) {
+ CDVWebViewPermissionGrantType_Prompt,
+ CDVWebViewPermissionGrantType_Deny,
+ CDVWebViewPermissionGrantType_Grant,
+ CDVWebViewPermissionGrantType_GrantIfSameHost_ElsePrompt,
+ CDVWebViewPermissionGrantType_GrantIfSameHost_ElseDeny
+};
+
@property (nonatomic, nullable, copy) NSString* title;
@property (nonatomic, assign) BOOL allowNewWindows;
+@property (nonatomic, assign) CDVWebViewPermissionGrantType mediaPermissionGrantType;
- (instancetype)initWithViewController:(CDVViewController*)vc;
diff --git a/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.m b/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.m
index e06e5452..b07d7aae 100644
--- a/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.m
+++ b/CordovaLib/Classes/Private/Plugins/CDVWebViewEngine/CDVWebViewUIDelegate.m
@@ -159,6 +159,32 @@
// We do not allow closing the primary WebView
}
+- (void)webView:(WKWebView *)webView requestMediaCapturePermissionForOrigin:(nonnull WKSecurityOrigin *)origin initiatedByFrame:(nonnull WKFrameInfo *)frame type:(WKMediaCaptureType)type decisionHandler:(nonnull void (^)(WKPermissionDecision))decisionHandler
+ API_AVAILABLE(ios(15.0))
+{
+ WKPermissionDecision decision;
+
+ if (_mediaPermissionGrantType == CDVWebViewPermissionGrantType_Prompt) {
+ decision = WKPermissionDecisionPrompt;
+ }
+ else if (_mediaPermissionGrantType == CDVWebViewPermissionGrantType_Deny) {
+ decision = WKPermissionDecisionDeny;
+ }
+ else if (_mediaPermissionGrantType == CDVWebViewPermissionGrantType_Grant) {
+ decision = WKPermissionDecisionGrant;
+ }
+ else {
+ if ([origin.host isEqualToString:webView.URL.host]) {
+ decision = WKPermissionDecisionGrant;
+ }
+ else {
+ decision =_mediaPermissionGrantType == CDVWebViewPermissionGrantType_GrantIfSameHost_ElsePrompt ? WKPermissionDecisionPrompt : WKPermissionDecisionDeny;
+ }
+ }
+
+ decisionHandler(decision);
+}
+
#pragma mark - Utility Methods
- (nullable UIViewController *)topViewController
diff --git a/templates/cordova/defaults.xml b/templates/cordova/defaults.xml
index 1a7287d2..e7f2776d 100644
--- a/templates/cordova/defaults.xml
+++ b/templates/cordova/defaults.xml
@@ -25,6 +25,7 @@
<preference name="AllowInlineMediaPlayback" value="false" />
<preference name="DisallowOverscroll" value="false" />
<preference name="EnableViewportScale" value="false" />
+ <preference name="MediaPermissionGrantType" value="grantIfSameHostElsePrompt" />
<preference name="MediaTypesRequiringUserActionForPlayback" value="none" />
<preference name="SuppressesIncrementalRendering" value="false" />
<preference name="SuppressesLongPressGesture" value="false" />
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org