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