Skip to content

Commit d60d3cb

Browse files
authored
Fix crash when loading an EPUB reflowable resource (#26)
The view was not necessarily valid in the callback of webView.evaluateJavascript(), which is required to call viewLifecycleOwner.
1 parent 43f9422 commit d60d3cb

File tree

1 file changed

+19
-20
lines changed

1 file changed

+19
-20
lines changed

readium/navigator/src/main/java/org/readium/r2/navigator/pager/R2EpubPageFragment.kt

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,7 @@ class R2EpubPageFragment : Fragment() {
135135
// To make sure the page is properly laid out before jumping to the target locator,
136136
// we execute a dummy JavaScript and wait for the callback result.
137137
webView.evaluateJavascript("true") {
138-
viewLifecycleOwner.lifecycleScope.launchWhenCreated {
139-
onLoadPage()
140-
}
138+
onLoadPage()
141139
}
142140
}
143141

@@ -274,29 +272,30 @@ class R2EpubPageFragment : Fragment() {
274272
return tag == currentFragment.tag
275273
}
276274

277-
private suspend fun onLoadPage() {
275+
private fun onLoadPage() {
278276
if (!isLoading) return
279277
isLoading = false
280278

281-
val webView = requireNotNull(webView)
282-
webView.visibility = View.VISIBLE
279+
if (view == null) return
283280

284-
if (isCurrentResource) {
285-
val epubNavigator = requireNotNull(webView.navigator as? EpubNavigatorFragment)
286-
val locator = epubNavigator.pendingLocator
287-
epubNavigator.pendingLocator = null
288-
if (locator != null) {
289-
loadLocator(locator)
290-
}
281+
viewLifecycleOwner.lifecycleScope.launchWhenCreated {
282+
val webView = requireNotNull(webView)
283+
webView.visibility = View.VISIBLE
284+
285+
if (isCurrentResource) {
286+
val epubNavigator = requireNotNull(webView.navigator as? EpubNavigatorFragment)
287+
val locator = epubNavigator.pendingLocator
288+
epubNavigator.pendingLocator = null
289+
if (locator != null) {
290+
loadLocator(webView, epubNavigator.readingProgression, locator)
291+
}
291292

292-
webView.listener.onPageLoaded()
293+
webView.listener.onPageLoaded()
294+
}
293295
}
294296
}
295297

296-
private suspend fun loadLocator(locator: Locator) {
297-
val webView = requireNotNull(webView)
298-
val epubNavigator = requireNotNull(webView.navigator as? EpubNavigatorFragment)
299-
298+
private suspend fun loadLocator(webView: R2WebView, readingProgression: ReadingProgression, locator: Locator) {
300299
val text = locator.text
301300
if (text.highlight != null) {
302301
if (webView.scrollToText(text)) {
@@ -314,7 +313,7 @@ class R2EpubPageFragment : Fragment() {
314313
// We need to reverse the progression with RTL because the Web View
315314
// always scrolls from left to right, no matter the reading direction.
316315
progression =
317-
if (webView.scrollMode || epubNavigator.readingProgression == ReadingProgression.LTR) progression
316+
if (webView.scrollMode || readingProgression == ReadingProgression.LTR) progression
318317
else 1 - progression
319318

320319
if (webView.scrollMode) {
@@ -324,7 +323,7 @@ class R2EpubPageFragment : Fragment() {
324323
// Figure out the target web view "page" from the requested
325324
// progression.
326325
var item = (progression * webView.numPages).roundToInt()
327-
if (epubNavigator.readingProgression == ReadingProgression.RTL && item > 0) {
326+
if (readingProgression == ReadingProgression.RTL && item > 0) {
328327
item -= 1
329328
}
330329
webView.setCurrentItem(item, false)

0 commit comments

Comments
 (0)