core/modules/big_pipe/big_pipe.libraries.yml | 3 +++ core/modules/big_pipe/css/big_pipe.css | 4 +++ core/modules/big_pipe/src/Render/BigPipe.php | 11 +++----- .../src/Render/Placeholder/BigPipeStrategy.php | 31 +++++++++++++++++++++- core/modules/comment/src/CommentLazyBuilders.php | 31 ++++++++++++++++++++++ .../form/form--comment--preview.html.twig | 3 +++ 6 files changed, 75 insertions(+), 8 deletions(-) diff --git a/core/modules/big_pipe/big_pipe.libraries.yml b/core/modules/big_pipe/big_pipe.libraries.yml index 6da49b7..9a49d6a 100644 --- a/core/modules/big_pipe/big_pipe.libraries.yml +++ b/core/modules/big_pipe/big_pipe.libraries.yml @@ -1,5 +1,8 @@ big_pipe: version: VERSION + css: + theme: + css/big_pipe.css: {} js: js/big_pipe.js: {} drupalSettings: diff --git a/core/modules/big_pipe/css/big_pipe.css b/core/modules/big_pipe/css/big_pipe.css new file mode 100644 index 0000000..49b1259 --- /dev/null +++ b/core/modules/big_pipe/css/big_pipe.css @@ -0,0 +1,4 @@ +div[data-big-pipe-placeholder-id] { + -webkit-filter: opacity(0.2) blur(1px); + filter: opacity(0.2) blur(1px); +} diff --git a/core/modules/big_pipe/src/Render/BigPipe.php b/core/modules/big_pipe/src/Render/BigPipe.php index a965068..ef0cb99 100644 --- a/core/modules/big_pipe/src/Render/BigPipe.php +++ b/core/modules/big_pipe/src/Render/BigPipe.php @@ -539,14 +539,11 @@ protected function renderPlaceholder($placeholder, array $placeholder_render_arr * only keep the first occurrence. */ protected function getPlaceholderOrder($html, $placeholders) { - $fragments = explode('
', $fragment, 2); - $placeholder_id = $t[0]; - $placeholder_ids[] = $placeholder_id; + $dom = Html::load($html); + $xpath = new \DOMXPath($dom); + foreach ($xpath->query('//div[@data-big-pipe-placeholder-id]') as $node) { + $placeholder_ids[] = Html::escape($node->getAttribute('data-big-pipe-placeholder-id')); } $placeholder_ids = array_unique($placeholder_ids); diff --git a/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php b/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php index 91ad604..62313ed 100644 --- a/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php +++ b/core/modules/big_pipe/src/Render/Placeholder/BigPipeStrategy.php @@ -4,6 +4,7 @@ use Drupal\Component\Utility\Html; use Drupal\Component\Utility\UrlHelper; +use Drupal\Core\Render\Markup; use Drupal\Core\Render\Placeholder\PlaceholderStrategyInterface; use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Session\SessionConfigurationInterface; @@ -182,8 +183,36 @@ protected function doProcessPlaceholders(array $placeholders) { protected static function createBigPipeJsPlaceholder($original_placeholder, array $placeholder_render_array) { $big_pipe_placeholder_id = static::generateBigPipePlaceholderId($original_placeholder, $placeholder_render_array); + $interface_preview = []; + + if (isset($placeholder_render_array['#lazy_builder'])) { + $callable = $placeholder_render_array['#lazy_builder'][0]; + if (is_string($callable)) { + if (strpos($callable, ':') !== FALSE && strpos($callable, '::') === FALSE) { + try { + $callable = \Drupal::service('controller_resolver')->getControllerFromDefinition($callable . 'Preview'); + } + catch (\InvalidArgumentException $e) {} + } + else { + $callable .= 'Preview'; + } + } + else if (is_array($callable)) { + $callable[1] .= 'Preview'; + } + if (is_callable($callable)) { + $interface_preview = $callable(); + assert('is_array($interface_preview)', "Interface preview for $original_placeholder must be a render array."); + } + } + + $interface_preview = []; + return [ - '#markup' => '', + '#prefix' => '