From 93c908286d82e79bef12be131ca3610b09d81461 Mon Sep 17 00:00:00 2001 From: Henry Heino <46334387+personalizedrefrigerator@users.noreply.github.com> Date: Mon, 8 Sep 2025 02:55:42 -0700 Subject: [PATCH] Mobile: Plugins: Fix renderer plugins that use the `settingValue` API (#13131) --- .../rendererBundle/useWebViewSetup.ts | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/app-mobile/contentScripts/rendererBundle/useWebViewSetup.ts b/packages/app-mobile/contentScripts/rendererBundle/useWebViewSetup.ts index 7d63559d5f..4bd4f7a86c 100644 --- a/packages/app-mobile/contentScripts/rendererBundle/useWebViewSetup.ts +++ b/packages/app-mobile/contentScripts/rendererBundle/useWebViewSetup.ts @@ -17,6 +17,7 @@ import Resource from '@joplin/lib/models/Resource'; import { ResourceInfos } from '@joplin/renderer/types'; import useContentScripts from './utils/useContentScripts'; import uuid from '@joplin/lib/uuid'; +import AsyncActionQueue from '@joplin/lib/AsyncActionQueue'; const logger = Logger.create('renderer/useWebViewSetup'); @@ -149,6 +150,8 @@ const useWebViewSetup = (props: Props): SetUpResult => { void messenger.remoteApi.renderer.setExtraContentScriptsAndRerender(contentScripts); }, [messenger, contentScripts]); + const onRerenderRequestRef = useRef(()=>{}); + const rendererControl = useMemo((): RendererControl => { const renderer = messenger.remoteApi.renderer; @@ -201,6 +204,7 @@ const useWebViewSetup = (props: Props): SetUpResult => { const key = `${pluginId}.${settingKey}`; if (!pluginSettingKeysRef.current.has(key)) { pluginSettingKeysRef.current.add(key); + onRerenderRequestRef.current(); settingsChanged = true; } }, @@ -234,16 +238,21 @@ const useWebViewSetup = (props: Props): SetUpResult => { return { rerenderToBody: async (markup, options, cancelEvent) => { - const { getSettings, getSettingsChanged } = await prepareRenderer(options); + const { getSettings } = await prepareRenderer(options); if (cancelEvent?.cancelled) return null; - const output = await renderer.rerenderToBody(markup, getSettings()); - if (cancelEvent?.cancelled) return null; + const render = async () => { + if (cancelEvent?.cancelled) return; - if (getSettingsChanged()) { - return await renderer.rerenderToBody(markup, getSettings()); - } - return output; + await renderer.rerenderToBody(markup, getSettings()); + }; + + const queue = new AsyncActionQueue(); + onRerenderRequestRef.current = async () => { + queue.push(render); + }; + + return await render(); }, render: async (markup, options) => { const { getSettings, getSettingsChanged } = await prepareRenderer(options);