From 6d06b580389c6e84bbd0fdb36d36923fa9479bfc Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 29 May 2025 16:17:55 -0600 Subject: [PATCH 1/2] Add iOS cookie support --- ios/Demo-iOS/Sources/EditorView.swift | 12 ++++++++++-- .../GutenbergKit/Sources/EditorConfiguration.swift | 1 + .../GutenbergKit/Sources/EditorViewController.swift | 6 ++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ios/Demo-iOS/Sources/EditorView.swift b/ios/Demo-iOS/Sources/EditorView.swift index 6074cf0d..c8afea9e 100644 --- a/ios/Demo-iOS/Sources/EditorView.swift +++ b/ios/Demo-iOS/Sources/EditorView.swift @@ -2,7 +2,11 @@ import SwiftUI import GutenbergKit struct EditorView: View { - var configuration: EditorConfiguration + private let configuration: EditorConfiguration + + init(configuration: EditorConfiguration) { + self.configuration = configuration + } var body: some View { _EditorView(configuration: configuration) @@ -69,7 +73,11 @@ struct EditorView: View { } private struct _EditorView: UIViewControllerRepresentable { - let configuration: EditorConfiguration + private let configuration: EditorConfiguration + + init(editorURL: URL? = nil, configuration: EditorConfiguration) { + self.configuration = configuration + } func makeUIViewController(context: Context) -> EditorViewController { let viewController = EditorViewController(configuration: configuration) diff --git a/ios/Sources/GutenbergKit/Sources/EditorConfiguration.swift b/ios/Sources/GutenbergKit/Sources/EditorConfiguration.swift index 87c3446e..881b5f6c 100644 --- a/ios/Sources/GutenbergKit/Sources/EditorConfiguration.swift +++ b/ios/Sources/GutenbergKit/Sources/EditorConfiguration.swift @@ -22,6 +22,7 @@ public struct EditorConfiguration { /// The locale to use for translations public var locale = "en" public var editorAssetsEndpoint: URL? + public var cookies: [HTTPCookie] = [] public init(title: String = "", content: String = "") { self.title = title diff --git a/ios/Sources/GutenbergKit/Sources/EditorViewController.swift b/ios/Sources/GutenbergKit/Sources/EditorViewController.swift index 9d130aee..912833bc 100644 --- a/ios/Sources/GutenbergKit/Sources/EditorViewController.swift +++ b/ios/Sources/GutenbergKit/Sources/EditorViewController.swift @@ -37,6 +37,12 @@ public final class EditorViewController: UIViewController, GutenbergEditorContro config.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") config.setValue(true, forKey: "allowUniversalAccessFromFileURLs") + // The editor shouldn't try to persist cookies – we want complete control over how they're handled + config.websiteDataStore = WKWebsiteDataStore.nonPersistent() + for cookie in configuration.cookies { + config.websiteDataStore.httpCookieStore.setCookie(cookie) + } + // Set-up communications with the editor. config.userContentController.add(controller, name: "editorDelegate") From c9336a3008ab69d5e480cff51a413a0f67e64956 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Thu, 29 May 2025 16:21:16 -0600 Subject: [PATCH 2/2] Add Android cookie support --- .../gutenberg/EditorConfiguration.kt | 12 ++++++++--- .../org/wordpress/gutenberg/GutenbergView.kt | 21 +++++++++++++++++-- .../com/example/gutenbergkit/MainActivity.kt | 2 +- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/android/Gutenberg/src/main/java/org/wordpress/gutenberg/EditorConfiguration.kt b/android/Gutenberg/src/main/java/org/wordpress/gutenberg/EditorConfiguration.kt index 307d99e7..21ceaa8d 100644 --- a/android/Gutenberg/src/main/java/org/wordpress/gutenberg/EditorConfiguration.kt +++ b/android/Gutenberg/src/main/java/org/wordpress/gutenberg/EditorConfiguration.kt @@ -61,8 +61,9 @@ open class EditorConfiguration constructor( val authHeader: String, val webViewGlobals: List, val editorSettings: String?, - val locale: String? -) : Parcelable { + val locale: String?, + val cookies: Map +): Parcelable { companion object { @JvmStatic fun builder(): Builder = Builder() @@ -84,6 +85,7 @@ open class EditorConfiguration constructor( private var webViewGlobals: List = emptyList() private var editorSettings: String? = null private var locale: String? = "en" + private var cookies: Map = mapOf() fun setTitle(title: String) = apply { this.title = title } fun setContent(content: String) = apply { this.content = content } @@ -100,6 +102,7 @@ open class EditorConfiguration constructor( fun setWebViewGlobals(webViewGlobals: List) = apply { this.webViewGlobals = webViewGlobals } fun setEditorSettings(editorSettings: String?) = apply { this.editorSettings = editorSettings } fun setLocale(locale: String?) = apply { this.locale = locale } + fun setCookies(cookies: Map) = apply { this.cookies = cookies } fun build(): EditorConfiguration = EditorConfiguration( title = title, @@ -116,7 +119,8 @@ open class EditorConfiguration constructor( authHeader = authHeader, webViewGlobals = webViewGlobals, editorSettings = editorSettings, - locale = locale + locale = locale, + cookies = cookies ) } @@ -141,6 +145,7 @@ open class EditorConfiguration constructor( if (webViewGlobals != other.webViewGlobals) return false if (editorSettings != other.editorSettings) return false if (locale != other.locale) return false + if (cookies != other.cookies) return false return true } @@ -161,6 +166,7 @@ open class EditorConfiguration constructor( result = 31 * result + webViewGlobals.hashCode() result = 31 * result + (editorSettings?.hashCode() ?: 0) result = 31 * result + (locale?.hashCode() ?: 0) + result = 31 * result + cookies.hashCode() return result } } diff --git a/android/Gutenberg/src/main/java/org/wordpress/gutenberg/GutenbergView.kt b/android/Gutenberg/src/main/java/org/wordpress/gutenberg/GutenbergView.kt index 3fcfe964..c9e1ee2a 100644 --- a/android/Gutenberg/src/main/java/org/wordpress/gutenberg/GutenbergView.kt +++ b/android/Gutenberg/src/main/java/org/wordpress/gutenberg/GutenbergView.kt @@ -11,12 +11,14 @@ import android.util.AttributeSet import android.util.Log import android.view.View import android.webkit.ConsoleMessage +import android.webkit.CookieManager import android.webkit.JavascriptInterface import android.webkit.ValueCallback import android.webkit.WebChromeClient import android.webkit.WebResourceError import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse +import android.webkit.WebStorage import android.webkit.WebView import android.webkit.WebViewClient import androidx.webkit.WebViewAssetLoader @@ -250,9 +252,24 @@ class GutenbergView : WebView { } else { ASSET_URL } - this.loadUrl(editorUrl) - Log.i("GutenbergView", "Startup Complete") + WebStorage.getInstance().deleteAllData() + this.clearCache(true) + // All cookies are third-party cookies because the root of this document + // lives under `https://appassets.androidplatform.net` + CookieManager.getInstance().setAcceptThirdPartyCookies(this, true); + + // Erase all local cookies before loading the URL – we don't want to persist + // anything between uses – otherwise we might send the wrong cookies + CookieManager.getInstance().removeAllCookies { + CookieManager.getInstance().flush() + for(cookie in configuration.cookies) { + CookieManager.getInstance().setCookie(cookie.key, cookie.value) + } + this.loadUrl(editorUrl) + + Log.i("GutenbergView", "Startup Complete") + } } private fun setGlobalJavaScriptVariables() { diff --git a/android/app/src/main/java/com/example/gutenbergkit/MainActivity.kt b/android/app/src/main/java/com/example/gutenbergkit/MainActivity.kt index 8061fdc0..421f5807 100644 --- a/android/app/src/main/java/com/example/gutenbergkit/MainActivity.kt +++ b/android/app/src/main/java/com/example/gutenbergkit/MainActivity.kt @@ -1,7 +1,6 @@ package com.example.gutenbergkit import android.os.Bundle -import android.util.Log import android.webkit.WebView import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity @@ -39,6 +38,7 @@ class MainActivity : AppCompatActivity() { .setNamespaceExcludedPaths(arrayOf()) .setAuthHeader("") .setWebViewGlobals(emptyList()) + .setCookies(emptyMap()) .build() gbView.start(config)