mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
ReaderRolling: Guard against races between scheduled tasks and CloseDocument (#10934)
Fix #10932 --------- Co-authored-by: Frans de Jonge <fransdejonge@gmail.com>
This commit is contained in:
@@ -78,6 +78,10 @@ local ReaderRolling = InputContainer:extend{
|
||||
RELOADING_DOCUMENT = 4,
|
||||
DO_RELOAD_DOCUMENT = 5,
|
||||
},
|
||||
|
||||
mark_func = nil,
|
||||
unmark_func = nil,
|
||||
_stepRerenderingAutomation = nil,
|
||||
}
|
||||
|
||||
function ReaderRolling:init()
|
||||
@@ -313,6 +317,16 @@ end
|
||||
-- we cannot do it in onSaveSettings() because getLastPercent() uses self.ui.document
|
||||
function ReaderRolling:onCloseDocument()
|
||||
self:tearDownRerenderingAutomation()
|
||||
-- Unschedule anything that might still somehow be...
|
||||
if self.mark_func then
|
||||
UIManager:unschedule(self.mark_func)
|
||||
end
|
||||
if self.unmark_func then
|
||||
UIManager:unschedule(self.unmark_func)
|
||||
end
|
||||
UIManager:unschedule(self.onCheckDomStyleCoherence)
|
||||
UIManager:unschedule(self.onUpdatePos)
|
||||
|
||||
self.current_header_height = nil -- show unload progress bar at top
|
||||
self.ui.doc_settings:saveSetting("percent_finished", self:getLastPercent())
|
||||
|
||||
@@ -349,7 +363,7 @@ function ReaderRolling:onCheckDomStyleCoherence()
|
||||
ok_callback = function()
|
||||
-- Allow for ConfirmBox to be closed before showing
|
||||
-- "Opening file" InfoMessage
|
||||
UIManager:scheduleIn(0.5, function ()
|
||||
UIManager:scheduleIn(0.5, function()
|
||||
-- And check we haven't quit reader in these 0.5s
|
||||
if self.ui.document then
|
||||
self.ui:reloadDocument()
|
||||
@@ -801,7 +815,7 @@ end
|
||||
|
||||
function ReaderRolling:onGotoXPointer(xp, marker_xp)
|
||||
if self.mark_func then
|
||||
-- unschedule previous marker as it's no more accurate
|
||||
-- Unschedule previous marker as it's no longer accurate.
|
||||
UIManager:unschedule(self.mark_func)
|
||||
self.mark_func = nil
|
||||
end
|
||||
@@ -1005,9 +1019,7 @@ function ReaderRolling:onBatchedUpdateDone()
|
||||
self.batched_update_count = 0
|
||||
-- Be sure any Notification gets a chance to be painted before
|
||||
-- a blocking rerendering
|
||||
UIManager:nextTick(function()
|
||||
self:onUpdatePos()
|
||||
end)
|
||||
UIManager:nextTick(self.onUpdatePos, self)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1036,7 +1048,10 @@ function ReaderRolling:onUpdatePos(force)
|
||||
-- Calling this now ensures the re-rendering is done by crengine
|
||||
-- so updatePos() has good info and can reposition
|
||||
-- the previous xpointer accurately:
|
||||
self.ui.document:getCurrentPos()
|
||||
if self.ui.document then
|
||||
-- This can be racy with CloseDocument, as it's scheduled by onBatchedUpdateDone, guard it
|
||||
self.ui.document:getCurrentPos()
|
||||
end
|
||||
|
||||
-- Otherwise, _readMetadata() would do that, but the positioning
|
||||
-- would not work as expected, for some reason (it worked
|
||||
@@ -1087,9 +1102,7 @@ function ReaderRolling:updatePos(force)
|
||||
-- Allow for the new rendering to be shown before possibly showing
|
||||
-- the "Styles have changed..." ConfirmBox so the user can decide
|
||||
-- if it is really needed
|
||||
UIManager:scheduleIn(0.1, function ()
|
||||
self:onCheckDomStyleCoherence()
|
||||
end)
|
||||
UIManager:scheduleIn(0.1, self.onCheckDomStyleCoherence, self)
|
||||
end
|
||||
|
||||
function ReaderRolling:onChangeViewMode()
|
||||
@@ -1619,7 +1632,7 @@ Note that %1 (out of %2) xpaths from your bookmarks and highlights have been nor
|
||||
ok_text = _("Upgrade now"),
|
||||
ok_callback = function()
|
||||
-- Allow for ConfirmBox to be closed before migrating
|
||||
UIManager:scheduleIn(0.5, function ()
|
||||
UIManager:scheduleIn(0.5, function()
|
||||
-- And check we haven't quit reader in these 0.5s
|
||||
if self.ui.document then
|
||||
-- We'd rather not have any painting between the upgrade
|
||||
|
||||
Reference in New Issue
Block a user