From 8827d0a2210780e80923e93ea81955bc42f8acbf Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Mon, 1 Jun 2026 17:31:32 +0200 Subject: [PATCH 1/2] Allow assets to be consumed in publication resources --- .../org/readium/r2/navigator/epub/WebViewServer.kt | 10 ++++++++++ .../navigator/web/internals/server/WebViewServer.kt | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/WebViewServer.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/WebViewServer.kt index 5910498a77..0d1bbb910b 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/WebViewServer.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/WebViewServer.kt @@ -113,6 +113,7 @@ internal class WebViewServer( if (isServedAsset(path.removePrefix("/"))) { // Request is for a known asset. assetsLoader.shouldInterceptRequest(request.url) + ?.apply { allowCors() } } else { val error = ReadError.Decoding( "Attempted to load an unknown asset from $requestUrl" @@ -253,6 +254,15 @@ internal class WebViewServer( } } + /** + * Allow the response to be consumed by publication documents served + * from any origin, including the package domain. + */ + private fun WebResourceResponse.allowCors() { + responseHeaders = responseHeaders ?: mutableMapOf() + responseHeaders["Access-Control-Allow-Origin"] = "*" + } + private fun serveErrorResponse(): WebResourceResponse { return serveResource(errorResource(), null, MediaType.XHTML) } diff --git a/readium/navigators/web/internals/src/main/kotlin/org/readium/navigator/web/internals/server/WebViewServer.kt b/readium/navigators/web/internals/src/main/kotlin/org/readium/navigator/web/internals/server/WebViewServer.kt index 5dcaa48149..ed8b637f05 100644 --- a/readium/navigators/web/internals/src/main/kotlin/org/readium/navigator/web/internals/server/WebViewServer.kt +++ b/readium/navigators/web/internals/src/main/kotlin/org/readium/navigator/web/internals/server/WebViewServer.kt @@ -107,6 +107,7 @@ public class WebViewServer( if (isServedAsset(path.removePrefix("/"))) { // Request is for a known asset. assetsLoader.shouldInterceptRequest(request.url) + ?.apply { allowCors() } } else { val error = ReadError.Decoding( "Attempted to load an unknown asset from $requestUrl" @@ -219,6 +220,15 @@ public class WebViewServer( } } + /** + * Allow the response to be consumed by publication documents served + * from any origin, including the package domain. + */ + private fun WebResourceResponse.allowCors() { + responseHeaders = responseHeaders ?: mutableMapOf() + responseHeaders["Access-Control-Allow-Origin"] = "*" + } + private fun errorResource(): Resource = StringResource { withContext(Dispatchers.IO) { From 86d774b0bee3dd4206cc662df114e3fdd70d317a Mon Sep 17 00:00:00 2001 From: Quentin Gliosca Date: Tue, 2 Jun 2026 08:06:57 +0200 Subject: [PATCH 2/2] Update CHANGELOG --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35990f20b5..4ade7515ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,13 @@ All notable changes to this project will be documented in this file. Take a look **Warning:** Features marked as *experimental* may change or be removed in a future release without notice. Use with caution. - +## [Unreleased] + +### Fixed + +#### Navigator + +* Fixed usage of assets, including fonts in publication resources. ## [3.2.0] - 2026-05-13