diff --git a/base b/base index c657f0df4..86d8495a3 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit c657f0df43fb0e448da743027310280c4261cf1f +Subproject commit 86d8495a39a697da9d014521108e28805b5f84fb diff --git a/frontend/apps/reader/modules/readerrolling.lua b/frontend/apps/reader/modules/readerrolling.lua index 2b3af5fb2..6dabf2cc6 100644 --- a/frontend/apps/reader/modules/readerrolling.lua +++ b/frontend/apps/reader/modules/readerrolling.lua @@ -108,6 +108,28 @@ function ReaderRolling:init() end function ReaderRolling:onReadSettings(config) + -- 20180503: some fix in crengine has changed the way the DOM is built + -- for HTML documents and may make XPATHs obtained from previous version + -- invalid. + -- We may request the previous (buggy) behaviour though, which we do + -- if we use a DocSetting previously made that may contain bookmarks + -- and highlights with old XPATHs. + -- (EPUB will use the same correct DOM code no matter what DOM version + -- we request here.) + if not config:readSetting("cre_dom_version") then + -- Not previously set, guess which DOM version to use + if config:readSetting("last_xpointer") then + -- We have a last_xpointer: this book was previously opened + -- with possibly a very old version: request the oldest + config:saveSetting("cre_dom_version", self.ui.document:getOldestDomVersion()) + else + -- No previous xpointer: book never opened (or sidecar file + -- purged): we can use the latest DOM version + config:saveSetting("cre_dom_version", self.ui.document:getLatestDomVersion()) + end + end + self.ui.document:requestDomVersion(config:readSetting("cre_dom_version")) + local last_xp = config:readSetting("last_xpointer") local last_per = config:readSetting("last_percent") if last_xp then diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index efe9fd180..b3fb3255a 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -20,6 +20,7 @@ local CreDocument = Document:new{ _document = false, _loaded = false, + _cre_dom_version = nil, line_space_percent = 100, default_font = G_reader_settings:readSetting("cre_font") or "Noto Serif", @@ -120,6 +121,9 @@ function CreDocument:init() error(self._document) -- will contain error message end + -- get DOM engine latest version + self._cre_dom_version = self._document:getIntProperty("crengine.dom.version") + -- adjust font sizes according to screen dpi self._document:adjustFontSizes(Screen:getDPI()) @@ -137,6 +141,18 @@ function CreDocument:init() self.info.configurable = true end +function CreDocument:getLatestDomVersion() + return self._cre_dom_version +end + +function CreDocument:getOldestDomVersion() + return 20171225 -- arbitrary day in the past +end + +function CreDocument:requestDomVersion(version) + self._document:setIntProperty("crengine.dom.version", version) +end + function CreDocument:loadDocument(full_document) if not self._loaded then local only_metadata = full_document == false diff --git a/spec/unit/readerlink_spec.lua b/spec/unit/readerlink_spec.lua index 75767f410..d12eaf1f0 100644 --- a/spec/unit/readerlink_spec.lua +++ b/spec/unit/readerlink_spec.lua @@ -16,9 +16,9 @@ describe("ReaderLink module", function() local readerui = ReaderUI:new{ document = DocumentRegistry:openDocument(sample_epub), } - readerui.rolling:onGotoPage(4) - readerui.link:onTap(nil, {pos = {x = 336, y = 668}}) - assert.is.same(36, readerui.rolling.current_page) + readerui.rolling:onGotoPage(6) + readerui.link:onTap(nil, {pos = {x = 336, y = 166}}) + assert.is.same(40, readerui.rolling.current_page) end) it("should jump to links in pdf page mode", function() @@ -53,11 +53,11 @@ describe("ReaderLink module", function() local readerui = ReaderUI:new{ document = DocumentRegistry:openDocument(sample_epub), } - readerui.rolling:onGotoPage(4) - readerui.link:onTap(nil, {pos = {x = 336, y = 668}}) - assert.is.same(36, readerui.rolling.current_page) + readerui.rolling:onGotoPage(6) + readerui.link:onTap(nil, {pos = {x = 336, y = 166}}) + assert.is.same(40, readerui.rolling.current_page) readerui.link:onGoBackLink() - assert.is.same(4, readerui.rolling.current_page) + assert.is.same(6, readerui.rolling.current_page) end) it("should be able to go back after link jump in pdf page mode", function()