Skip to content

Commit df388c7

Browse files
aanorbelsdsantos
authored andcommitted
chore: update webview
1 parent c1c698b commit df388c7

File tree

2 files changed

+74
-11
lines changed

2 files changed

+74
-11
lines changed

composeApp/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ kotlin {
135135
implementation("org.openjfx:javafx-media:17:mac-aarch64")
136136
implementation("org.openjfx:javafx-web:17:mac-aarch64")
137137
implementation("org.openjfx:javafx-swing:17:mac-aarch64")
138-
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-javafx:1.10.2")
139138
}
140139
}
141140
// Testing

composeApp/src/desktopMain/kotlin/org/ooni/probe/ui/shared/OoniWebView.desktop.kt

Lines changed: 74 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import androidx.compose.runtime.getValue
66
import androidx.compose.runtime.rememberUpdatedState
77
import androidx.compose.ui.Modifier
88
import androidx.compose.ui.awt.SwingPanel
9-
import javafx.embed.swing.JFXPanel
109
import javafx.application.Platform
10+
import javafx.concurrent.Worker
11+
import javafx.embed.swing.JFXPanel
1112
import javafx.scene.Scene
1213
import javafx.scene.layout.StackPane
1314
import javafx.scene.web.WebView
15+
import java.net.URL
1416

1517
@Composable
1618
actual fun OoniWebView(
@@ -21,31 +23,93 @@ actual fun OoniWebView(
2123
val onCreated = {}
2224
val onDispose = {}
2325
val currentOnDispose by rememberUpdatedState(onDispose)
24-
25-
DisposableEffect(Unit) {
26-
onDispose {
27-
currentOnDispose()
28-
}
29-
}
26+
val event = controller.rememberNextEvent()
3027

3128
SwingPanel(
3229
factory = {
3330
JFXPanel().apply {
3431
Platform.runLater {
3532
val webView = WebView().apply {
3633
isVisible = true
37-
// engine.addLoadListener(state, navigator)
3834
engine.isJavaScriptEnabled = true
35+
36+
// Set up load listeners
37+
engine.loadWorker.stateProperty().addListener { _, _, newValue ->
38+
when (newValue) {
39+
Worker.State.SCHEDULED -> {
40+
controller.state = OoniWebViewController.State.Loading(0f)
41+
}
42+
Worker.State.RUNNING -> {
43+
val progress = engine.loadWorker.progress
44+
controller.state = OoniWebViewController.State.Loading(progress.toFloat())
45+
}
46+
Worker.State.SUCCEEDED -> {
47+
controller.state = OoniWebViewController.State.Successful
48+
controller.canGoBack = engine.history.currentIndex > 0
49+
}
50+
Worker.State.FAILED -> {
51+
controller.state = OoniWebViewController.State.Failure
52+
controller.canGoBack = engine.history.currentIndex > 0
53+
}
54+
else -> {}
55+
}
56+
}
57+
58+
// Domain restriction
59+
engine.locationProperty().addListener { _, _, newLocation ->
60+
try {
61+
val host = URL(newLocation).host
62+
val allowed = allowedDomains.any { domain ->
63+
host.matches(Regex("^(.*\\.)?$domain$"))
64+
}
65+
66+
if (!allowed) {
67+
engine.load("about:blank")
68+
}
69+
} catch (e: Exception) {
70+
// Invalid URL, ignore
71+
}
72+
controller.canGoBack = engine.history.currentIndex > 0
73+
}
3974
}
75+
4076
val root = StackPane()
4177
root.children.add(webView)
4278
this.scene = Scene(root)
43-
// state.webView = DesktopWebView(webView)
4479
onCreated()
45-
webView.engine.load("https://ooni.org")
4680
}
4781
}
4882
},
4983
modifier = modifier,
84+
update = { jfxPanel ->
85+
Platform.runLater {
86+
val scene = jfxPanel.scene
87+
val root = scene?.root as? StackPane
88+
val webView = root?.children?.get(0) as? WebView
89+
webView?.let {
90+
when (event) {
91+
is OoniWebViewController.Event.Load -> {
92+
webView.engine.load(event.url)
93+
}
94+
OoniWebViewController.Event.Reload -> {
95+
webView.engine.reload()
96+
}
97+
OoniWebViewController.Event.Back -> {
98+
if (webView.engine.history.currentIndex > 0) {
99+
webView.engine.history.go(-1)
100+
}
101+
}
102+
null -> Unit
103+
}
104+
}
105+
}
106+
event?.let(controller::onEventHandled)
107+
},
50108
)
109+
110+
DisposableEffect(Unit) {
111+
onDispose {
112+
currentOnDispose()
113+
}
114+
}
51115
}

0 commit comments

Comments
 (0)