From 16907319fe36ad91456fccd9cef31975ab3b5016 Mon Sep 17 00:00:00 2001 From: "Javi H. Gil" Date: Mon, 13 Jul 2026 13:01:26 +0200 Subject: [PATCH] Fix encore reset on isolated runner --- .../scripts/admin/content-edit/wysiwyg.js | 1 + assets/scripts/admin/content-edit/wysiwyg.js | 1 + src/Render/ContentVersionRenderer.php | 2 +- src/Render/Isolated/IsolatedRunner.php | 11 +-- tests/Unit/Render/IsolatedRunnerTest.php | 73 +++++++++++++++++++ 5 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 tests/Unit/Render/IsolatedRunnerTest.php diff --git a/assets/dist/scripts/admin/content-edit/wysiwyg.js b/assets/dist/scripts/admin/content-edit/wysiwyg.js index 33ad2df4..376061f4 100644 --- a/assets/dist/scripts/admin/content-edit/wysiwyg.js +++ b/assets/dist/scripts/admin/content-edit/wysiwyg.js @@ -100,6 +100,7 @@ function _createWysiwygTinyMCE(element) { toolbar: toolbar, valid_elements: validElements, valid_styles: validStyles, + license_key: 'gpl', setup: (editor) => { editor.on('change', () => { contentEditableUpdateInputsFromElement(element); diff --git a/assets/scripts/admin/content-edit/wysiwyg.js b/assets/scripts/admin/content-edit/wysiwyg.js index ba17d6c7..44916412 100644 --- a/assets/scripts/admin/content-edit/wysiwyg.js +++ b/assets/scripts/admin/content-edit/wysiwyg.js @@ -100,6 +100,7 @@ function _createWysiwygTinyMCE(element) { toolbar: toolbar, valid_elements: validElements, valid_styles: validStyles, + license_key: 'gpl', setup: (editor) => { editor.on('change', () => { contentEditableUpdateInputsFromElement(element); diff --git a/src/Render/ContentVersionRenderer.php b/src/Render/ContentVersionRenderer.php index ac0e914e..7f6e2ed5 100644 --- a/src/Render/ContentVersionRenderer.php +++ b/src/Render/ContentVersionRenderer.php @@ -62,7 +62,7 @@ public function render(ContentVersionInterface $version, Request $request, ?Rend } catch (Exception $e) { throw new RenderException(sprintf('Error rendering content version v%s', $version->getVersionNumber()), 0, $e); } - }); + }, true); } /** diff --git a/src/Render/Isolated/IsolatedRunner.php b/src/Render/Isolated/IsolatedRunner.php index 4503d571..23f0c2ae 100644 --- a/src/Render/Isolated/IsolatedRunner.php +++ b/src/Render/Isolated/IsolatedRunner.php @@ -26,7 +26,7 @@ public function __construct( /** * @throws RenderException */ - public function isolateEsiCapableRequestRender(callable $renderFunction): mixed + public function isolateEsiCapableRequestRender(callable $renderFunction, bool $resetEntrypoints = false): mixed { $currentRequest = $this->requestStack->getCurrentRequest(); @@ -49,7 +49,7 @@ public function isolateEsiCapableRequestRender(callable $renderFunction): mixed } // do the render - $result = $this->isolateRequestRender($currentRequest, $renderFunction); + $result = $this->isolateRequestRender($currentRequest, $renderFunction, $resetEntrypoints); // Restore the original Surrogate-Capability header if it was set isset($originalSurrogateCapability) ? @@ -62,10 +62,11 @@ public function isolateEsiCapableRequestRender(callable $renderFunction): mixed /** * @throws RenderException */ - public function isolateRequestRender(IsolatedRequest|Request $request, callable $renderFunction): mixed + public function isolateRequestRender(IsolatedRequest|Request $request, callable $renderFunction, bool $resetEntrypoints = false): mixed { - // reset webpack encore entrypoint lookup to avoid cache issues - $this->entrypointLookup && $this->entrypointLookup->reset(); + if ($resetEntrypoints) { + $this->entrypointLookup && $this->entrypointLookup->reset(); + } // inject the current request into the request stack // this is necessary to ensure that the request is available diff --git a/tests/Unit/Render/IsolatedRunnerTest.php b/tests/Unit/Render/IsolatedRunnerTest.php new file mode 100644 index 00000000..29917add --- /dev/null +++ b/tests/Unit/Render/IsolatedRunnerTest.php @@ -0,0 +1,73 @@ +createMock(EntrypointLookupInterface::class); + $entrypointLookup->expects(self::never())->method('reset'); + + $runner = $this->createRunner($entrypointLookup); + + self::assertSame('rendered', $runner->isolateRequestRender(Request::create('/fragment'), fn (): string => 'rendered')); + } + + public function testCanResetEncoreEntrypointsForFullIsolatedRenders(): void + { + $entrypointLookup = $this->createMock(EntrypointLookupInterface::class); + $entrypointLookup->expects(self::once())->method('reset'); + + $runner = $this->createRunner($entrypointLookup); + + self::assertSame('rendered', $runner->isolateRequestRender(Request::create('/page'), fn (): string => 'rendered', true)); + } + + public function testEsiCapableRenderDoesNotResetEncoreEntrypointsByDefault(): void + { + $entrypointLookup = $this->createMock(EntrypointLookupInterface::class); + $entrypointLookup->expects(self::never())->method('reset'); + + $runner = $this->createRunner($entrypointLookup, Request::create('/current')); + + self::assertSame('rendered', $runner->isolateEsiCapableRequestRender(fn (): string => 'rendered')); + } + + private function createRunner(EntrypointLookupInterface $entrypointLookup, ?Request $currentRequest = null): IsolatedRunner + { + $requestStack = new RequestStack(); + $requestStack->push($currentRequest ?? Request::create('/current')); + + $app = new AppVariable(); + $app->setRequestStack($requestStack); + + $twig = $this->createMock(Environment::class); + $twig->method('getGlobals')->willReturn(['app' => $app]); + $twig->expects(self::atLeastOnce())->method('addGlobal'); + + $moduleRendererFactory = $this->createMock(ModuleRendererFactory::class); + $moduleRendererFactory->method('create')->willReturn($this->createMock(ModuleRenderer::class)); + + return new IsolatedRunner( + $requestStack, + $this->createMock(RouterInterface::class), + $twig, + $moduleRendererFactory, + $entrypointLookup, + ); + } +}