Skip to content

Commit 22e7313

Browse files
authored
Allow to bypass the selection protection with LCP (#303)
1 parent 3768bb5 commit 22e7313

File tree

4 files changed

+42
-6
lines changed

4 files changed

+42
-6
lines changed

readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,17 @@ import kotlinx.coroutines.flow.onEach
4141
import kotlinx.coroutines.launch
4242
import kotlinx.coroutines.runBlocking
4343
import org.json.JSONObject
44-
import org.readium.r2.navigator.*
44+
import org.readium.r2.navigator.DecorableNavigator
45+
import org.readium.r2.navigator.Decoration
46+
import org.readium.r2.navigator.DecorationId
47+
import org.readium.r2.navigator.ExperimentalDecorator
48+
import org.readium.r2.navigator.ExperimentalDragGesture
49+
import org.readium.r2.navigator.NavigatorDelegate
50+
import org.readium.r2.navigator.R
51+
import org.readium.r2.navigator.R2BasicWebView
52+
import org.readium.r2.navigator.SelectableNavigator
53+
import org.readium.r2.navigator.Selection
54+
import org.readium.r2.navigator.VisualNavigator
4555
import org.readium.r2.navigator.databinding.ActivityR2ViewpagerBinding
4656
import org.readium.r2.navigator.epub.EpubNavigatorViewModel.RunScriptCommand
4757
import org.readium.r2.navigator.epub.css.FontFamilyDeclaration
@@ -59,6 +69,7 @@ import org.readium.r2.navigator.preferences.Configurable
5969
import org.readium.r2.navigator.preferences.FontFamily
6070
import org.readium.r2.navigator.preferences.ReadingProgression
6171
import org.readium.r2.navigator.util.createFragmentFactory
72+
import org.readium.r2.shared.DelicateReadiumApi
6273
import org.readium.r2.shared.ExperimentalReadiumApi
6374
import org.readium.r2.shared.extensions.tryOrLog
6475
import org.readium.r2.shared.fetcher.Resource
@@ -154,7 +165,18 @@ class EpubNavigatorFragment internal constructor(
154165
*/
155166
val shouldApplyInsetsPadding: Boolean? = true,
156167

157-
internal val javascriptInterfaces: MutableMap<String, JavascriptInterfaceFactory> = mutableMapOf()
168+
internal val javascriptInterfaces: MutableMap<String, JavascriptInterfaceFactory> = mutableMapOf(),
169+
170+
/**
171+
* Disable user selection if the publication is protected by a DRM (e.g. with LCP).
172+
*
173+
* WARNING: If you choose to disable this, you MUST remove the Copy and Share selection
174+
* menu items in your app. Otherwise, you will void the EDRLab certification for your
175+
* application. If you need help, follow up on:
176+
* https://github.com/readium/kotlin-toolkit/issues/299#issuecomment-1315643577
177+
*/
178+
@DelicateReadiumApi
179+
val disableSelectionWhenProtected: Boolean = true
158180
) {
159181
/**
160182
* Registers a new factory for the [JavascriptInterface] named [name].

readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,11 @@ internal class EpubNavigatorViewModel(
390390
defaults = defaults,
391391
baseUrl = baseUrl,
392392
server = if (baseUrl != null) null
393-
else WebViewServer(application, publication, servedAssets = config.servedAssets)
393+
else WebViewServer(
394+
application, publication,
395+
servedAssets = config.servedAssets,
396+
disableSelectionWhenProtected = config.disableSelectionWhenProtected
397+
)
394398
)
395399
}
396400
}

readium/navigator/src/main/java/org/readium/r2/navigator/epub/HtmlInjector.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ import timber.log.Timber
2222
* @param baseHref Base URL where the Readium CSS and scripts are served.
2323
*/
2424
@OptIn(ExperimentalReadiumApi::class)
25-
internal fun Resource.injectHtml(publication: Publication, css: ReadiumCss, baseHref: String): Resource =
25+
internal fun Resource.injectHtml(
26+
publication: Publication,
27+
css: ReadiumCss,
28+
baseHref: String,
29+
disableSelectionWhenProtected: Boolean
30+
): Resource =
2631
TransformingResource(this) { bytes ->
2732
val link = link()
2833
check(link.mediaType.isHtml)
@@ -40,7 +45,7 @@ internal fun Resource.injectHtml(publication: Publication, css: ReadiumCss, base
4045

4146
// Disable the text selection if the publication is protected.
4247
// FIXME: This is a hack until proper LCP copy is implemented, see https://github.com/readium/kotlin-toolkit/issues/221
43-
if (publication.isProtected) {
48+
if (disableSelectionWhenProtected && publication.isProtected) {
4449
injectables.add(
4550
"""
4651
<style>

readium/navigator/src/main/java/org/readium/r2/navigator/epub/WebViewServer.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ internal class WebViewServer(
3535
private val application: Application,
3636
private val publication: Publication,
3737
servedAssets: List<String>,
38+
private val disableSelectionWhenProtected: Boolean
3839
) {
3940
companion object {
4041
val publicationBaseHref = "https://readium/publication/"
@@ -85,7 +86,11 @@ internal class WebViewServer(
8586
var resource = publication.get(link)
8687
.fallback { errorResource(link, error = it) }
8788
if (link.mediaType.isHtml) {
88-
resource = resource.injectHtml(publication, css, baseHref = assetsBaseHref)
89+
resource = resource.injectHtml(
90+
publication, css,
91+
baseHref = assetsBaseHref,
92+
disableSelectionWhenProtected = disableSelectionWhenProtected
93+
)
8994
}
9095

9196
val headers = mutableMapOf(

0 commit comments

Comments
 (0)