.../Drupal/Core/Cache/CacheableJsonResponse.php | 26 ++++++++ .../system/src/Tests/Common/RenderWebTest.php | 11 ++++ .../modules/common_test/common_test.services.yml | 6 ++ .../src/Render/MainContent/JsonRenderer.php | 69 ++++++++++++++++++++++ 4 files changed, 112 insertions(+) diff --git a/core/lib/Drupal/Core/Cache/CacheableJsonResponse.php b/core/lib/Drupal/Core/Cache/CacheableJsonResponse.php new file mode 100644 index 0000000..bc7d2a3 --- /dev/null +++ b/core/lib/Drupal/Core/Cache/CacheableJsonResponse.php @@ -0,0 +1,26 @@ +drupalGet(''); + $this->assertCacheContext('url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT); + $this->drupalGet('', ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'json']]); + $this->assertCacheContext('url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT); + } + + /** * Tests rendering form elements without passing through * \Drupal::formBuilder()->doBuildForm(). */ diff --git a/core/modules/system/tests/modules/common_test/common_test.services.yml b/core/modules/system/tests/modules/common_test/common_test.services.yml new file mode 100644 index 0000000..563632f --- /dev/null +++ b/core/modules/system/tests/modules/common_test/common_test.services.yml @@ -0,0 +1,6 @@ +services: + main_content_renderer.json: + class: Drupal\common_test\Render\MainContent\JsonRenderer + arguments: ['@title_resolver', '@renderer'] + tags: + - { name: render.main_content_renderer, format: json } diff --git a/core/modules/system/tests/modules/common_test/src/Render/MainContent/JsonRenderer.php b/core/modules/system/tests/modules/common_test/src/Render/MainContent/JsonRenderer.php new file mode 100644 index 0000000..7ebbfd1 --- /dev/null +++ b/core/modules/system/tests/modules/common_test/src/Render/MainContent/JsonRenderer.php @@ -0,0 +1,69 @@ +titleResolver = $title_resolver; + $this->renderer = $renderer; + } + + /** + * {@inheritdoc} + */ + public function renderResponse(array $main_content, Request $request, RouteMatchInterface $route_match) { + $json = []; + + $json['content'] = (string) $this->renderer->renderRoot($main_content); + if (!empty($main_content['#title'])) { + $json['title'] = (string) $main_content['#title']; + } + else { + $json['title'] = (string) $this->titleResolver->getTitle($request, $route_match->getRouteObject()); + } + + $response = new CacheableJsonResponse($json, 200); + $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($main_content)); + return $response; + } + +}