@@ -92,10 +92,15 @@ class RustWebChromeClient(appActivity: WryActivity) : WebChromeClient() {
9292 }
9393
9494 override fun onPermissionRequest (request : PermissionRequest ) {
95+ val requestedResources = safePermissionRequestResources(request.resources)
9596 val response = onPermissionRequestNative(activity.currentWebViewId(), request.resources)
9697 when (response) {
9798 0 -> { // Allow
98- request.grant(request.resources)
99+ if (requestedResources.isNotEmpty()) {
100+ request.grant(requestedResources)
101+ } else {
102+ request.deny()
103+ }
99104 return
100105 }
101106 1 -> { // Deny
@@ -112,31 +117,34 @@ class RustWebChromeClient(appActivity: WryActivity) : WebChromeClient() {
112117
113118 val isRequestPermissionRequired = Build .VERSION .SDK_INT >= Build .VERSION_CODES .M
114119 val permissionList: MutableList <String > = ArrayList ()
115- if (listOf ( * request.resources). contains(" android.webkit.resource.VIDEO_CAPTURE " )) {
120+ if (requestedResources. contains(PermissionRequest . RESOURCE_VIDEO_CAPTURE )) {
116121 permissionList.add(Manifest .permission.CAMERA )
117122 }
118- if (listOf ( * request.resources). contains(" android.webkit.resource.AUDIO_CAPTURE " )) {
123+ if (requestedResources. contains(PermissionRequest . RESOURCE_AUDIO_CAPTURE )) {
119124 permissionList.add(Manifest .permission.MODIFY_AUDIO_SETTINGS )
120125 permissionList.add(Manifest .permission.RECORD_AUDIO )
121126 }
122- if (permissionList.isNotEmpty() && isRequestPermissionRequired) {
127+ if (requestedResources.isEmpty()) {
128+ request.deny()
129+ } else if (permissionList.isNotEmpty() && isRequestPermissionRequired) {
123130 val permissions = permissionList.toTypedArray()
124131 permissionListener = object : PermissionListener {
125132 override fun onPermissionSelect (isGranted : Boolean? ) {
126133 if (isGranted == true ) {
127- request.grant(request.resources )
134+ request.grant(requestedResources )
128135 } else {
129136 request.deny()
130137 }
131138 }
132139 }
133140 permissionLauncher.launch(permissions)
134141 } else {
135- request.grant(request.resources )
142+ request.grant(requestedResources )
136143 }
137144 }
138145
139146 private external fun onPermissionRequestNative (webviewId : String , resources : Array <String >): Int
147+ private external fun onGeolocationPermissionRequestNative (webviewId : String , origin : String ): Int
140148
141149 /* *
142150 * Show the browser alert modal
@@ -260,9 +268,20 @@ class RustWebChromeClient(appActivity: WryActivity) : WebChromeClient() {
260268 callback : GeolocationPermissions .Callback
261269 ) {
262270 super .onGeolocationPermissionsShowPrompt(origin, callback)
271+ when (onGeolocationPermissionRequestNative(activity.currentWebViewId(), origin)) {
272+ 1 -> {
273+ callback.invoke(origin, false , false )
274+ return
275+ }
276+ }
277+
263278 Logger .debug(" onGeolocationPermissionsShowPrompt: DOING IT HERE FOR ORIGIN: $origin " )
264- val geoPermissions =
265- arrayOf(Manifest .permission.ACCESS_COARSE_LOCATION , Manifest .permission.ACCESS_FINE_LOCATION )
279+ val geoPermissions = definedGeolocationPermissions()
280+ if (geoPermissions.isEmpty()) {
281+ callback.invoke(origin, false , false )
282+ return
283+ }
284+
266285 if (! PermissionHelper .hasPermissions(activity, geoPermissions)) {
267286 permissionListener = object : PermissionListener {
268287 override fun onPermissionSelect (isGranted : Boolean? ) {
@@ -289,6 +308,26 @@ class RustWebChromeClient(appActivity: WryActivity) : WebChromeClient() {
289308 }
290309 }
291310
311+ private fun safePermissionRequestResources (resources : Array <String >): Array <String > {
312+ return resources.filter {
313+ it == PermissionRequest .RESOURCE_AUDIO_CAPTURE ||
314+ it == PermissionRequest .RESOURCE_VIDEO_CAPTURE ||
315+ it == PermissionRequest .RESOURCE_PROTECTED_MEDIA_ID ||
316+ it == PermissionRequest .RESOURCE_MIDI_SYSEX
317+ }.toTypedArray()
318+ }
319+
320+ private fun definedGeolocationPermissions (): Array <String > {
321+ val permissions = ArrayList <String >()
322+ if (PermissionHelper .hasDefinedPermission(activity, Manifest .permission.ACCESS_COARSE_LOCATION )) {
323+ permissions.add(Manifest .permission.ACCESS_COARSE_LOCATION )
324+ }
325+ if (PermissionHelper .hasDefinedPermission(activity, Manifest .permission.ACCESS_FINE_LOCATION )) {
326+ permissions.add(Manifest .permission.ACCESS_FINE_LOCATION )
327+ }
328+ return permissions.toTypedArray()
329+ }
330+
292331 override fun onShowFileChooser (
293332 webView : WebView ,
294333 filePathCallback : ValueCallback <Array <Uri ?>? >,
0 commit comments