Skip to content

Commit 0cdb300

Browse files
committed
Add proxy support to Compose side
Currently, the proxy won't be updated if it's changed after webview creation.
1 parent e87c453 commit 0cdb300

5 files changed

Lines changed: 36 additions & 8 deletions

File tree

webview-compose/src/commonMain/kotlin/io/github/kdroidfilter/webview/setting/PlatformWebSettings.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ sealed class PlatformWebSettings {
1414

1515
data class DesktopWebSettings(
1616
var transparent: Boolean = true,
17+
var proxyConfig: ProxyConfig? = null
1718
) : PlatformWebSettings()
1819

1920
data class IOSWebSettings(
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.github.kdroidfilter.webview.setting
2+
3+
sealed class ProxyConfig {
4+
abstract val host: String
5+
abstract val port: Int
6+
7+
data class Http(
8+
override val host: String,
9+
override val port: Int
10+
) : ProxyConfig()
11+
12+
data class Socks5(
13+
override val host: String,
14+
override val port: Int
15+
) : ProxyConfig()
16+
}

webview-compose/src/jvmMain/kotlin/io/github/kdroidfilter/webview/web/WebViewDesktop.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,20 @@ import io.github.kdroidfilter.webview.jsbridge.WebViewJsBridge
1717
import io.github.kdroidfilter.webview.jsbridge.parseJsMessage
1818
import io.github.kdroidfilter.webview.request.WebRequest
1919
import io.github.kdroidfilter.webview.request.WebRequestInterceptResult
20+
import io.github.kdroidfilter.webview.setting.ProxyConfig
2021
import kotlinx.coroutines.delay
2122

2223
actual class WebViewFactoryParam(
2324
val state: WebViewState,
2425
val fileContent: String = "",
2526
val userAgent: String? = null,
27+
val proxyConfig: ProxyConfig? = null
2628
)
2729

2830
actual fun defaultWebViewFactory(param: WebViewFactoryParam): NativeWebView =
2931
when (val content = param.state.content) {
30-
is WebContent.Url -> NativeWebView(content.url, param.userAgent ?: param.state.webSettings.customUserAgentString)
31-
else -> NativeWebView("about:blank", param.userAgent ?: param.state.webSettings.customUserAgentString)
32+
is WebContent.Url -> NativeWebView(content.url, param.userAgent ?: param.state.webSettings.customUserAgentString, param.proxyConfig?.toJvmProxyConfig())
33+
else -> NativeWebView("about:blank", param.userAgent ?: param.state.webSettings.customUserAgentString, param.proxyConfig?.toJvmProxyConfig())
3234
}
3335

3436
@Composable
@@ -44,6 +46,7 @@ actual fun ActualWebView(
4446
val currentOnDispose by rememberUpdatedState(onDispose)
4547
val scope = rememberCoroutineScope()
4648

49+
val proxyConfig = remember { state.webSettings.desktopWebSettings.proxyConfig }
4750
val desiredUserAgent = state.webSettings.customUserAgentString?.trim()?.takeIf { it.isNotEmpty() }
4851
var effectiveUserAgent by remember { mutableStateOf(desiredUserAgent) }
4952

@@ -55,7 +58,7 @@ actual fun ActualWebView(
5558
}
5659

5760
key(effectiveUserAgent) {
58-
val nativeWebView = remember(state, factory) { factory(WebViewFactoryParam(state, userAgent = effectiveUserAgent)) }
61+
val nativeWebView = remember(state, factory) { factory(WebViewFactoryParam(state, userAgent = effectiveUserAgent, proxyConfig = proxyConfig)) }
5962

6063
val desktopWebView =
6164
remember(nativeWebView, scope, webViewJsBridge) {
@@ -174,3 +177,8 @@ actual fun ActualWebView(
174177
}
175178
}
176179
}
180+
181+
internal fun ProxyConfig.toJvmProxyConfig(): io.github.kdroidfilter.webview.wry.JvmProxyConfig = when (this) {
182+
is ProxyConfig.Http -> io.github.kdroidfilter.webview.wry.JvmProxyConfig.Http(host, port)
183+
is ProxyConfig.Socks5 -> io.github.kdroidfilter.webview.wry.JvmProxyConfig.Socks5(host, port)
184+
}

wrywebview/src/main/kotlin/io/github/kdroidfilter/webview/wry/Proxy.kt renamed to wrywebview/src/main/kotlin/io/github/kdroidfilter/webview/wry/JvmProxyConfig.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
package io.github.kdroidfilter.webview.wry
22

3-
sealed class ProxyConfig {
3+
/**
4+
* JVM-specific proxy config
5+
*/
6+
sealed class JvmProxyConfig {
47
abstract val host: String
58
abstract val port: Int
69

710
data class Http(
811
override val host: String,
912
override val port: Int
10-
) : ProxyConfig() {
13+
) : JvmProxyConfig() {
1114
override fun toProxy(): Proxy.Http = Proxy.Http(Address(host, port.toUShort()))
1215
}
1316

1417
data class Socks5(
1518
override val host: String,
1619
override val port: Int
17-
) : ProxyConfig() {
20+
) : JvmProxyConfig() {
1821
override fun toProxy(): Proxy.Socks5 = Proxy.Socks5(Address(host, port.toUShort()))
1922
}
2023

wrywebview/src/main/kotlin/io/github/kdroidfilter/webview/wry/WryWebViewPanel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import kotlin.concurrent.thread
1414
class WryWebViewPanel(
1515
initialUrl: String,
1616
customUserAgent: String? = null,
17-
proxyConfig: ProxyConfig? = null,
17+
jvmProxyConfig: JvmProxyConfig? = null,
1818
private val bridgeLogger: (String) -> Unit = { System.err.println(it) }
1919
) : JPanel() {
2020
private val host = SkikoInterop.createHost()
@@ -23,7 +23,7 @@ class WryWebViewPanel(
2323
private var parentIsWindow: Boolean = false
2424
private var pendingUrl: String = initialUrl
2525
private val customUserAgent: String? = customUserAgent?.trim()?.takeIf { it.isNotEmpty() }
26-
private val proxy: Proxy? = proxyConfig?.toProxy()
26+
private val proxy: Proxy? = jvmProxyConfig?.toProxy()
2727
private var pendingUrlWithHeaders: String? = null
2828
private var pendingHeaders: Map<String, String> = emptyMap()
2929
private var pendingHtml: String? = null

0 commit comments

Comments
 (0)