Verified Commit 5e984898 authored by godotislate's avatar godotislate
Browse files

fix: #3611594 [regression] Recursion detected when merging duplicate #attached...

fix: #3611594 [regression] Recursion detected when merging duplicate #attached page_top/page_bottom attachments on node preview

By: brandonlira
By: smustgrave
By: godotislate
(cherry picked from commit 902684eb)
parent 6b25d231
Loading
Loading
Loading
Loading
Loading
+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
@@ -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)) {
@@ -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;
  }

}
+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
@@ -489,6 +489,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.
   */