diff core/lib/Drupal/Core/Render/RenderContext.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Core/Render/RenderContext.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,56 @@
+<?php
+
+namespace Drupal\Core\Render;
+
+/**
+ * The render context: a stack containing bubbleable rendering metadata.
+ *
+ * A stack of \Drupal\Core\Render\BubbleableMetadata objects.
+ *
+ * @see \Drupal\Core\Render\RendererInterface
+ * @see \Drupal\Core\Render\Renderer
+ * @see \Drupal\Core\Render\BubbleableMetadata
+ */
+class RenderContext extends \SplStack {
+
+  /**
+   * Updates the current frame of the stack.
+   *
+   * @param array &$element
+   *   The element of the render array that has just been rendered. The stack
+   *   frame for this element will be updated with the bubbleable rendering
+   *   metadata of this element.
+   */
+  public function update(&$element) {
+    // The latest frame represents the bubbleable metadata for the subtree.
+    $frame = $this->pop();
+    // Update the frame, but also update the current element, to ensure it
+    // contains up-to-date information in case it gets render cached.
+    $updated_frame = BubbleableMetadata::createFromRenderArray($element)->merge($frame);
+    $updated_frame->applyTo($element);
+    $this->push($updated_frame);
+  }
+
+  /**
+   * Bubbles the stack.
+   *
+   * Whenever another level in the render array has been rendered, the stack
+   * must be bubbled, to merge its rendering metadata with that of the parent
+   * element.
+   */
+  public function bubble() {
+    // If there's only one frame on the stack, then this is the root call, and
+    // we can't bubble up further. ::renderRoot() will reset the stack, but we
+    // must not reset it here to allow users of ::executeInRenderContext() to
+    // access the stack directly.
+    if ($this->count() === 1) {
+      return;
+    }
+
+    // Merge the current and the parent stack frame.
+    $current = $this->pop();
+    $parent = $this->pop();
+    $this->push($current->merge($parent));
+  }
+
+}