@@ -10,6 +10,7 @@ import android.webkit.PermissionRequest
1010import android.webkit.WebChromeClient
1111import android.webkit.WebResourceError
1212import android.webkit.WebResourceRequest
13+ import android.webkit.WebResourceResponse
1314import android.webkit.WebView
1415import android.webkit.WebViewClient
1516import android.widget.FrameLayout
@@ -24,10 +25,12 @@ import androidx.compose.ui.viewinterop.AndroidView
2425import androidx.core.content.ContextCompat
2526import androidx.core.graphics.createBitmap
2627import androidx.webkit.WebSettingsCompat
28+ import androidx.webkit.WebViewAssetLoader
2729import androidx.webkit.WebViewFeature
2830import com.multiplatform.webview.jsbridge.WebViewJsBridge
2931import com.multiplatform.webview.request.WebRequest
3032import com.multiplatform.webview.request.WebRequestInterceptResult
33+ import com.multiplatform.webview.util.InternalStoragePathHandler
3134import com.multiplatform.webview.util.KLogger
3235
3336/* *
@@ -189,7 +192,6 @@ fun AccompanistWebView(
189192 userAgentString = it.customUserAgentString
190193 allowFileAccessFromFileURLs = it.allowFileAccessFromFileURLs
191194 allowUniversalAccessFromFileURLs = it.allowUniversalAccessFromFileURLs
192- setSupportZoom(it.supportZoom)
193195 }
194196
195197 state.webSettings.androidWebSettings.let {
@@ -208,6 +210,16 @@ fun AccompanistWebView(
208210 loadsImagesAutomatically = it.loadsImagesAutomatically
209211 domStorageEnabled = it.domStorageEnabled
210212 mediaPlaybackRequiresUserGesture = it.mediaPlaybackRequiresUserGesture
213+
214+ if (it.enableSandbox) {
215+ client.assetLoader =
216+ WebViewAssetLoader
217+ .Builder ()
218+ .addPathHandler(
219+ it.sandboxSubdomain,
220+ InternalStoragePathHandler (),
221+ ).build()
222+ }
211223 }
212224 }
213225 if (WebViewFeature .isFeatureSupported(WebViewFeature .FORCE_DARK )) {
@@ -261,6 +273,8 @@ open class AccompanistWebViewClient : WebViewClient() {
261273 internal set
262274 private var isRedirect = false
263275
276+ var assetLoader: WebViewAssetLoader ? = null
277+
264278 override fun onPageStarted (
265279 view : WebView ,
266280 url : String? ,
@@ -274,14 +288,26 @@ open class AccompanistWebViewClient : WebViewClient() {
274288 state.errorsForCurrentRequest.clear()
275289 state.pageTitle = null
276290 state.lastLoadedUrl = url
291+ val supportZoom = if (state.webSettings.supportZoom) " yes" else " no"
277292
278293 // set scale level
279294 @Suppress(" ktlint:standard:max-line-length" )
280295 val script =
281- " var meta = document.createElement('meta');meta.setAttribute('name', 'viewport');meta.setAttribute('content', 'width=device-width, initial-scale=${state.webSettings.zoomLevel} , maximum-scale=10.0, minimum-scale=0.1,user-scalable=yes ');document.getElementsByTagName('head')[0].appendChild(meta);"
296+ " var meta = document.createElement('meta');meta.setAttribute('name', 'viewport');meta.setAttribute('content', 'width=device-width, initial-scale=${state.webSettings.zoomLevel} , maximum-scale=10.0, minimum-scale=0.1,user-scalable=$supportZoom ');document.getElementsByTagName('head')[0].appendChild(meta);"
282297 navigator.evaluateJavaScript(script)
283298 }
284299
300+ override fun shouldInterceptRequest (
301+ view : WebView ? ,
302+ request : WebResourceRequest ? ,
303+ ): WebResourceResponse ? {
304+ val url = request?.url
305+ KLogger .d { " Intercepting request for URL: $url " }
306+ return url?.let {
307+ assetLoader?.shouldInterceptRequest(it)
308+ } ? : super .shouldInterceptRequest(view, request)
309+ }
310+
285311 override fun onPageFinished (
286312 view : WebView ,
287313 url : String? ,
0 commit comments