From 07dd86be3be23d8be03bbed55ec0a049ab4b919a Mon Sep 17 00:00:00 2001 From: threethan Date: Sat, 13 Dec 2025 05:48:10 -0500 Subject: [PATCH 1/3] (Desktop) Set UA via request handler instead of context: Fixes CookieManager --- .../webview/web/CefRequestExt.kt | 41 +++++++++++------ .../webview/web/WebView.desktop.kt | 44 ++++++++++--------- 2 files changed, 51 insertions(+), 34 deletions(-) diff --git a/webview/src/desktopMain/kotlin/com/multiplatform/webview/web/CefRequestExt.kt b/webview/src/desktopMain/kotlin/com/multiplatform/webview/web/CefRequestExt.kt index dbdf0ce6..d3b62175 100644 --- a/webview/src/desktopMain/kotlin/com/multiplatform/webview/web/CefRequestExt.kt +++ b/webview/src/desktopMain/kotlin/com/multiplatform/webview/web/CefRequestExt.kt @@ -4,23 +4,36 @@ import com.multiplatform.webview.setting.WebSettings import dev.datlag.kcef.KCEFResourceRequestHandler import org.cef.browser.CefBrowser import org.cef.browser.CefFrame -import org.cef.browser.CefRequestContext +import org.cef.handler.CefRequestHandler +import org.cef.handler.CefRequestHandlerAdapter +import org.cef.handler.CefResourceRequestHandler +import org.cef.misc.BoolRef import org.cef.network.CefRequest -internal fun createModifiedRequestContext(settings: WebSettings): CefRequestContext { - return CefRequestContext.createContext { browser, frame, request, isNavigation, isDownload, requestInitiator, disableDefaultHandling -> - object : KCEFResourceRequestHandler( - getGlobalDefaultHandler(browser, frame, request, isNavigation, isDownload, requestInitiator, disableDefaultHandling), - ) { - override fun onBeforeResourceLoad( - browser: CefBrowser?, - frame: CefFrame?, - request: CefRequest?, - ): Boolean { - if (request != null) { - settings.customUserAgentString?.let(request::setUserAgentString) +internal fun createModifiedRequestHandler(settings: WebSettings): CefRequestHandler { + return object : CefRequestHandlerAdapter() { + override fun getResourceRequestHandler( + browser: CefBrowser?, + frame: CefFrame?, + request: CefRequest?, + isNavigation: Boolean, + isDownload: Boolean, + requestInitiator: String?, + disableDefaultHandling: BoolRef?, + ): CefResourceRequestHandler { + return object : KCEFResourceRequestHandler( + getGlobalDefaultHandler(browser, frame, request, isNavigation, isDownload, requestInitiator, disableDefaultHandling), + ) { + override fun onBeforeResourceLoad( + browser: CefBrowser?, + frame: CefFrame?, + request: CefRequest?, + ): Boolean { + if (request != null) { + settings.customUserAgentString?.let(request::setUserAgentString) + } + return super.onBeforeResourceLoad(browser, frame, request) } - return super.onBeforeResourceLoad(browser, frame, request) } } } diff --git a/webview/src/desktopMain/kotlin/com/multiplatform/webview/web/WebView.desktop.kt b/webview/src/desktopMain/kotlin/com/multiplatform/webview/web/WebView.desktop.kt index 05d8b0a2..d7b41896 100644 --- a/webview/src/desktopMain/kotlin/com/multiplatform/webview/web/WebView.desktop.kt +++ b/webview/src/desktopMain/kotlin/com/multiplatform/webview/web/WebView.desktop.kt @@ -9,7 +9,6 @@ import dev.datlag.kcef.KCEF import dev.datlag.kcef.KCEFBrowser import dev.datlag.kcef.KCEFClient import org.cef.browser.CefRendering -import org.cef.browser.CefRequestContext import java.util.concurrent.TimeUnit /** @@ -53,7 +52,6 @@ actual class WebViewFactoryParam( CefRendering.DEFAULT } inline val transparent: Boolean get() = webSettings.desktopWebSettings.transparent - val requestContext: CefRequestContext get() = createModifiedRequestContext(webSettings) } actual class PlatformWebViewParams @@ -62,12 +60,14 @@ actual class PlatformWebViewParams actual fun defaultWebViewFactory(param: WebViewFactoryParam): NativeWebView = when (val content = param.state.content) { is WebContent.Url -> - param.client.createBrowser( - content.url, - param.rendering, - param.transparent, - param.requestContext, - ) + param.client + .also { + it.addRequestHandler(createModifiedRequestHandler(param.webSettings)) + }.createBrowser( + content.url, + param.rendering, + param.transparent, + ) is WebContent.Data -> param.client.createBrowser( KCEFBrowser.BLANK_URI, @@ -75,20 +75,24 @@ actual fun defaultWebViewFactory(param: WebViewFactoryParam): NativeWebView = param.transparent, ) is WebContent.File -> { - param.client.createBrowser( - KCEFBrowser.BLANK_URI, - param.rendering, - param.transparent, - param.requestContext, - ) + param.client + .also { + it.addRequestHandler(createModifiedRequestHandler(param.webSettings)) + }.createBrowser( + KCEFBrowser.BLANK_URI, + param.rendering, + param.transparent, + ) } else -> - param.client.createBrowser( - KCEFBrowser.BLANK_URI, - param.rendering, - param.transparent, - param.requestContext, - ) + param.client + .also { + it.addRequestHandler(createModifiedRequestHandler(param.webSettings)) + }.createBrowser( + KCEFBrowser.BLANK_URI, + param.rendering, + param.transparent, + ) } /** From 794eafdb0f699514e1fc59fa282a2d7f66ce5f7e Mon Sep 17 00:00:00 2001 From: Ethan Medeiros Date: Tue, 16 Dec 2025 00:12:25 -0500 Subject: [PATCH 2/3] Add GitHub Actions workflow for publishing releases --- .github/workflows/publish.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..ff7e3299 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,26 @@ +name: Publish +on: + release: + types: [released, prereleased] +jobs: + publish: + name: Release build and publish + runs-on: macOS-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + - name: Make Gradle wrapper executable + run: chmod +x gradlew + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: 21 + - name: Publish to MavenCentral + run: ./gradlew publishToMavenCentral --no-configuration-cache + env: + ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_CENTRAL_USERNAME }} + ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_CENTRAL_PASSWORD }} + ORG_GRADLE_PROJECT_signingInMemoryKeyId: ${{ secrets.SIGNING_KEY_ID }} + ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.SIGNING_PASSWORD }} + ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_KEY_CONTENTS }} From a713d210d521fbe0aeb82afb7c994aed62dcec25 Mon Sep 17 00:00:00 2001 From: threethan Date: Tue, 16 Dec 2025 00:19:35 -0500 Subject: [PATCH 3/3] Update owner --- gradle.properties | 10 +++++----- settings.gradle.kts | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0a1211bf..6c099b95 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,16 +13,16 @@ android.compileSdk=36 android.targetSdk=36 android.minSdk=21 #Versions -GROUP=io.github.kevinnzou +GROUP=io.github.threethan POM_ARTIFACT_ID=compose-webview-multiplatform VERSION_NAME=2.0.4 POM_NAME=Compose WebView Multiplatform POM_INCEPTION_YEAR=2023 POM_DESCRIPTION=WebView for JetBrains Compose Multiplatform -POM_URL=https://github.com/KevinnZou/compose-webview-multiplatform -POM_SCM_URL=https://github.com/KevinnZou/compose-webview-multiplatform -POM_SCM_CONNECTION=scm:git:git://github.com/KevinnZou/compose-webview-multiplatform.git -POM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/KevinnZou/compose-webview-multiplatform.git +POM_URL=https://github.com/threethan/compose-webview-multiplatform +POM_SCM_URL=https://github.com/threethan/compose-webview-multiplatform +POM_SCM_CONNECTION=scm:git:git://github.com/threethan/compose-webview-multiplatform.git +POM_SCM_DEV_CONNECTION=scm:git:ssh://git@github.com/threethan/compose-webview-multiplatform.git POM_LICENCE_NAME=The Apache Software License, Version 2.0 POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt POM_LICENCE_DIST=repo diff --git a/settings.gradle.kts b/settings.gradle.kts index e8f68a34..f45f942b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,6 +7,9 @@ pluginManagement { mavenCentral() } } +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} dependencyResolutionManagement { repositories {