Loading core/lib/Drupal/Core/Render/BubbleableMetadata.php +15 −1 Changes for core/lib/Drupal/Core/Render/BubbleableMetadata.php: 15 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -161,6 +161,19 @@ public static function mergeAttachments(array $a, array $b) { unset($a['placeholders']); unset($b['placeholders']); } // page_top and page_bottom may contain complete render arrays. Merge only // their top-level elements to avoid recursively traversing cyclic // references within those render arrays. $page_regions = []; foreach (['page_top', 'page_bottom'] as $page_region) { if (isset($a[$page_region]) || isset($b[$page_region])) { $page_regions[$page_region] = array_merge( $a[$page_region] ?? [], $b[$page_region] ?? [], ); unset($a[$page_region], $b[$page_region]); } } // Apply the normal merge. $a = array_merge_recursive($a, $b); if (isset($drupalSettings)) { Loading @@ -171,7 +184,8 @@ public static function mergeAttachments(array $a, array $b) { // Save the custom merge for the placeholders. $a['placeholders'] = $placeholders; } return $a; // Save the custom merges for the page regions. return $a + $page_regions; } } core/tests/Drupal/Tests/Core/Render/BubbleableMetadataTest.php +34 −0 Changes for core/tests/Drupal/Tests/Core/Render/BubbleableMetadataTest.php: 34 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -498,6 +498,40 @@ public function testMergeAttachmentsLibraryMerging(): void { $this->assertSame($expected_settings_two, $merged['drupalSettings']['commonTestRealWorldAlmostIdentical']); } /** * Tests page region attachment merging with recursive render arrays. */ public function testMergeAttachmentsPageRegionMergingWithRecursiveRenderArrays(): void { $a = [ 'library' => [ 'core/drupal', ], ]; $b = [ 'library' => [ 'core/jquery', ], ]; foreach (['page_top', 'page_bottom'] as $page_region) { $a[$page_region]['node_preview'] = [ '#markup' => 'Preview from a', ]; $a[$page_region]['node_preview']['#attached'][$page_region]['node_preview'] = &$a[$page_region]['node_preview']; $b[$page_region]['node_preview'] = [ '#markup' => 'Preview from b', ]; $b[$page_region]['node_preview']['#attached'][$page_region]['node_preview'] = &$b[$page_region]['node_preview']; } $merged = BubbleableMetadata::mergeAttachments($a, $b); $this->assertSame(['core/drupal', 'core/jquery'], $merged['library']); $this->assertSame('Preview from b', $merged['page_top']['node_preview']['#markup']); $this->assertSame('Preview from b', $merged['page_bottom']['node_preview']['#markup']); } /** * Tests html_head asset merging. */ Loading Loading
core/lib/Drupal/Core/Render/BubbleableMetadata.php +15 −1 Changes for core/lib/Drupal/Core/Render/BubbleableMetadata.php: 15 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -161,6 +161,19 @@ public static function mergeAttachments(array $a, array $b) { unset($a['placeholders']); unset($b['placeholders']); } // page_top and page_bottom may contain complete render arrays. Merge only // their top-level elements to avoid recursively traversing cyclic // references within those render arrays. $page_regions = []; foreach (['page_top', 'page_bottom'] as $page_region) { if (isset($a[$page_region]) || isset($b[$page_region])) { $page_regions[$page_region] = array_merge( $a[$page_region] ?? [], $b[$page_region] ?? [], ); unset($a[$page_region], $b[$page_region]); } } // Apply the normal merge. $a = array_merge_recursive($a, $b); if (isset($drupalSettings)) { Loading @@ -171,7 +184,8 @@ public static function mergeAttachments(array $a, array $b) { // Save the custom merge for the placeholders. $a['placeholders'] = $placeholders; } return $a; // Save the custom merges for the page regions. return $a + $page_regions; } }
core/tests/Drupal/Tests/Core/Render/BubbleableMetadataTest.php +34 −0 Changes for core/tests/Drupal/Tests/Core/Render/BubbleableMetadataTest.php: 34 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -498,6 +498,40 @@ public function testMergeAttachmentsLibraryMerging(): void { $this->assertSame($expected_settings_two, $merged['drupalSettings']['commonTestRealWorldAlmostIdentical']); } /** * Tests page region attachment merging with recursive render arrays. */ public function testMergeAttachmentsPageRegionMergingWithRecursiveRenderArrays(): void { $a = [ 'library' => [ 'core/drupal', ], ]; $b = [ 'library' => [ 'core/jquery', ], ]; foreach (['page_top', 'page_bottom'] as $page_region) { $a[$page_region]['node_preview'] = [ '#markup' => 'Preview from a', ]; $a[$page_region]['node_preview']['#attached'][$page_region]['node_preview'] = &$a[$page_region]['node_preview']; $b[$page_region]['node_preview'] = [ '#markup' => 'Preview from b', ]; $b[$page_region]['node_preview']['#attached'][$page_region]['node_preview'] = &$b[$page_region]['node_preview']; } $merged = BubbleableMetadata::mergeAttachments($a, $b); $this->assertSame(['core/drupal', 'core/jquery'], $merged['library']); $this->assertSame('Preview from b', $merged['page_top']['node_preview']['#markup']); $this->assertSame('Preview from b', $merged['page_bottom']['node_preview']['#markup']); } /** * Tests html_head asset merging. */ Loading