From 8e6de8f9e34f3be82cd68044854ff205a0a76d98 Mon Sep 17 00:00:00 2001 From: Sean Doyle Date: Sun, 8 Oct 2023 18:49:42 -0400 Subject: [PATCH] Remove `renderElement` from `Renderer` constructor Remove the argument from all `Renderer` subclass constructor call sites. In its place, define the default value for the `Renderer.renderElement` property based on the `static renderElement(currentElement, newElement)` defined by the inheriting class. --- src/core/drive/morph_renderer.js | 21 +++++++++++++++++---- src/core/drive/page_view.js | 4 ++-- src/core/frames/frame_controller.js | 2 +- src/core/renderer.js | 8 ++++++-- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/core/drive/morph_renderer.js b/src/core/drive/morph_renderer.js index 2c5d14874..d70d6e873 100644 --- a/src/core/drive/morph_renderer.js +++ b/src/core/drive/morph_renderer.js @@ -3,17 +3,28 @@ import { dispatch } from "../../util" import { PageRenderer } from "./page_renderer" export class MorphRenderer extends PageRenderer { - async render() { - if (this.willRender) await this.#morphBody() + static renderElement(currentElement, newElement) { + const morph = new Morph(currentElement, newElement) + + morph.morphBody() + } + + async preservingPermanentElements(callback) { + return await callback() } get renderMethod() { return "morph" } +} - // Private +class Morph { + constructor(currentElement, newElement) { + this.currentElement = currentElement + this.newElement = newElement + } - async #morphBody() { + async morphBody() { this.#morphElements(this.currentElement, this.newElement) this.#reloadRemoteFrames() @@ -25,6 +36,8 @@ export class MorphRenderer extends PageRenderer { }) } + // Private + #morphElements(currentElement, newElement, morphStyle = "outerHTML") { this.isMorphingTurboFrame = this.#isFrameReloadedWithMorph(currentElement) diff --git a/src/core/drive/page_view.js b/src/core/drive/page_view.js index 1583f25a0..7a5897405 100644 --- a/src/core/drive/page_view.js +++ b/src/core/drive/page_view.js @@ -19,7 +19,7 @@ export class PageView extends View { const shouldMorphPage = this.isPageRefresh(visit) && this.snapshot.shouldMorphPage const rendererClass = shouldMorphPage ? MorphRenderer : PageRenderer - const renderer = new rendererClass(this.snapshot, snapshot, PageRenderer.renderElement, isPreview, willRender) + const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender) if (!renderer.shouldRender) { this.forceReloaded = true @@ -32,7 +32,7 @@ export class PageView extends View { renderError(snapshot, visit) { visit?.changeHistory() - const renderer = new ErrorRenderer(this.snapshot, snapshot, ErrorRenderer.renderElement, false) + const renderer = new ErrorRenderer(this.snapshot, snapshot, false) return this.render(renderer) } diff --git a/src/core/frames/frame_controller.js b/src/core/frames/frame_controller.js index 07764fc86..6e4182023 100644 --- a/src/core/frames/frame_controller.js +++ b/src/core/frames/frame_controller.js @@ -299,7 +299,7 @@ export class FrameController { if (newFrameElement) { const snapshot = new Snapshot(newFrameElement) - const renderer = new FrameRenderer(this, this.view.snapshot, snapshot, FrameRenderer.renderElement, false, false) + const renderer = new FrameRenderer(this, this.view.snapshot, snapshot, false, false) if (this.view.renderPromise) await this.view.renderPromise this.changeHistory() diff --git a/src/core/renderer.js b/src/core/renderer.js index 56e73983e..414335b88 100644 --- a/src/core/renderer.js +++ b/src/core/renderer.js @@ -3,12 +3,16 @@ import { Bardo } from "./bardo" export class Renderer { #activeElement = null - constructor(currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) { + static renderElement(currentElement, newElement) { + // Abstract method + } + + constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) { this.currentSnapshot = currentSnapshot this.newSnapshot = newSnapshot this.isPreview = isPreview this.willRender = willRender - this.renderElement = renderElement + this.renderElement = this.constructor.renderElement this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject })) }