Unload section when destroying the renderer

This commit is contained in:
John Factotum
2023-06-01 01:44:00 +08:00
parent 14067fe683
commit 2e5dda77e0
2 changed files with 17 additions and 5 deletions
+8 -1
View File
@@ -151,6 +151,7 @@ const makeMarginals = (length, part) => Array.from({ length }, () => {
}) })
class View { class View {
#observer = new ResizeObserver(() => this.expand())
#element = document.createElement('div') #element = document.createElement('div')
#iframe = document.createElement('iframe') #iframe = document.createElement('iframe')
#contentRange = document.createRange() #contentRange = document.createRange()
@@ -212,7 +213,7 @@ class View {
const layout = beforeRender?.({ vertical, rtl, background }) const layout = beforeRender?.({ vertical, rtl, background })
this.#iframe.style.display = 'block' this.#iframe.style.display = 'block'
this.render(layout) this.render(layout)
new ResizeObserver(() => this.expand()).observe(doc.body) this.#observer.observe(doc.body)
// the resize observer above doesn't work in Firefox // the resize observer above doesn't work in Firefox
// (see https://bugzilla.mozilla.org/show_bug.cgi?id=1832939) // (see https://bugzilla.mozilla.org/show_bug.cgi?id=1832939)
@@ -352,6 +353,9 @@ class View {
get overlayer() { get overlayer() {
return this.#overlayer return this.#overlayer
} }
destroy() {
if (this.document) this.#observer.unobserve(this.document.body)
}
} }
// NOTE: everything here assumes the so-called "negative scroll type" for RTL // NOTE: everything here assumes the so-called "negative scroll type" for RTL
@@ -941,6 +945,9 @@ export class Paginator extends HTMLElement {
} }
destroy() { destroy() {
this.#observer.unobserve(this) this.#observer.unobserve(this)
this.#view.destroy()
this.#view = null
this.sections[this.#index]?.unload?.()
} }
} }
+9 -4
View File
@@ -129,6 +129,15 @@ export class View extends HTMLElement {
this.renderer.open(book) this.renderer.open(book)
this.#root.append(this.renderer) this.#root.append(this.renderer)
} }
close() {
this.renderer?.destroy?.()
this.#sectionProgress = null
this.#tocProgress = null
this.#pageProgress = null
this.#searchResults = new Map()
this.lastLocation = null
this.history = new History()
}
goToTextStart() { goToTextStart() {
return this.goTo(this.book.landmarks return this.goTo(this.book.landmarks
?.find(m => m.type.includes('bodymatter') || m.type.includes('text')) ?.find(m => m.type.includes('bodymatter') || m.type.includes('text'))
@@ -392,10 +401,6 @@ export class View extends HTMLElement {
for (const item of list) this.deleteAnnotation(item) for (const item of list) this.deleteAnnotation(item)
this.#searchResults.clear() this.#searchResults.clear()
} }
destroy() {
this.book.destroy?.()
this.renderer?.destroy?.()
}
} }
customElements.define('foliate-view', View) customElements.define('foliate-view', View)