package org.jetbrains.compose.desktop.browser import androidx.compose.desktop.AppManager import androidx.compose.desktop.AppFrame import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.MutableState import org.jetbrains.skija.Bitmap import org.jetbrains.skiko.HardwareLayer import javax.swing.JFrame import org.cef.CefApp class BrowserState { private val url = mutableStateOf("") private val isReady = mutableStateOf(false) private lateinit var browser: CefBrowserWrapper fun isReady(): Boolean { return isReady.value } fun loadURL(url: String) { if (!this::browser.isInitialized) { val frame = AppManager.focusedWindow if (frame != null) { onActive(frame, url) } return } isReady.value = false browser.loadURL(url) isReady.value = true } fun getBitmap(): Bitmap { return browser.getBitmap() } fun onLayout(x: Int, y: Int, width: Int, height: Int) { browser.onLayout(x, y, width, height) } fun onActive(frame: AppFrame, url: String) { val window = frame.window if (!window.isVisible()) { return } var layer = getHardwareLayer(window) if (layer == null) { throw Error("Browser initialization failed!") } browser = CefBrowserWrapper( startURL = url, layer = layer ) browser.onActive() isReady.value = true } fun onDismiss() { browser.onDismiss() } fun setFocused(value: Boolean) { browser.setFocused(value) } fun onInvalidate(onInvalidate: (() -> Unit)?) { browser.onInvalidate = onInvalidate } private fun getHardwareLayer(window: JFrame): HardwareLayer? { val components = window.getContentPane().getComponents() for (component in components) { if (component is HardwareLayer) { return component } } return null } }