diff --git a/web/core/src/jsTest/kotlin/elements/AttributesTests.kt b/web/core/src/jsTest/kotlin/elements/AttributesTests.kt
index 9815743a3d..1a7bab93e4 100644
--- a/web/core/src/jsTest/kotlin/elements/AttributesTests.kt
+++ b/web/core/src/jsTest/kotlin/elements/AttributesTests.kt
@@ -241,4 +241,94 @@ class AttributesTests {
waitChanges()
assertEquals("
", root.innerHTML)
}
+
+ @Test
+ fun canAccessRef() = runTest {
+ var flag by mutableStateOf(true)
+
+ composition {
+ if (flag) {
+ Div(attrs = {
+ ref { div ->
+ (div as HTMLDivElement).innerText = "Text set using ref {}"
+ onDispose {
+ div.innerText = ""
+ }
+ }
+ })
+ }
+ }
+
+ assertEquals("Text set using ref {}
", root.innerHTML)
+
+ flag = false
+ waitChanges()
+
+ assertEquals("", root.innerHTML)
+ }
+
+ @Test
+ fun refDisposed() = runTest {
+ var flag by mutableStateOf(true)
+
+ var disposed = false
+
+ composition {
+ if (flag) {
+ Div(attrs = {
+ ref {
+ onDispose {
+ disposed = true
+ }
+ }
+ })
+ }
+ }
+
+ assertEquals("", root.innerHTML)
+ assertEquals(false, disposed)
+
+ flag = false
+ waitChanges()
+
+ assertEquals("", root.innerHTML)
+ assertEquals(true, disposed)
+ }
+
+ @Test
+ fun refInitializedOnlyOnce() = runTest {
+ var counter by mutableStateOf(1)
+
+ var refInitCounter = 0
+ var refDisposeCounter = 0
+ var attrsCallCounter = 0
+
+ composition {
+ val useCounterWithinRootRecomposeScope = counter
+ Text("$useCounterWithinRootRecomposeScope")
+
+ Div(attrs = {
+ attrsCallCounter += 1
+ ref { div ->
+ refInitCounter += 1
+ onDispose {
+ refDisposeCounter += 1
+ }
+ }
+ })
+ }
+
+ assertEquals("1", root.innerHTML)
+ assertEquals(1, refInitCounter)
+ assertEquals(1, attrsCallCounter)
+ assertEquals(0, refDisposeCounter)
+
+ counter++
+ waitChanges()
+
+ assertEquals("2", root.innerHTML)
+ assertEquals(1, refInitCounter)
+ assertEquals(2, attrsCallCounter)
+ assertEquals(0, refDisposeCounter)
+ }
}