From 0a1e9aa03719704aaff01ea79ef0baf6e02fa0b7 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Mon, 10 Feb 2014 09:39:44 +0000
Subject: [PATCH] Issue #2084907 by clemens.tolboom, chris_hall_hu_cheng, Noe_,
 discipolo, Xano, patrickd, damiankloip, alexpott | Jeff Burnz:
 Hook_views_pre_render() is broken if your theme implements a base theme.

---
 .../test_basetheme/test_basetheme.theme       | 23 +++++
 .../themes/test_subtheme/test_subtheme.theme  | 24 +++++
 .../views/Tests/ViewsThemeIntegrationTest.php | 93 +++++++++++++++++++
 .../views/lib/Drupal/views/ViewExecutable.php |  4 +-
 4 files changed, 142 insertions(+), 2 deletions(-)
 create mode 100644 core/modules/system/tests/themes/test_basetheme/test_basetheme.theme
 create mode 100644 core/modules/system/tests/themes/test_subtheme/test_subtheme.theme
 create mode 100644 core/modules/views/lib/Drupal/views/Tests/ViewsThemeIntegrationTest.php

diff --git a/core/modules/system/tests/themes/test_basetheme/test_basetheme.theme b/core/modules/system/tests/themes/test_basetheme/test_basetheme.theme
new file mode 100644
index 000000000000..ef6e071d553d
--- /dev/null
+++ b/core/modules/system/tests/themes/test_basetheme/test_basetheme.theme
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * Add hooks for tests to use.
+ */
+use Drupal\views\ViewExecutable;
+
+/**
+ * Implements hook_views_pre_render().
+ */
+function test_basetheme_views_pre_render(ViewExecutable $view) {
+  // We append the function name to the title for test to check for.
+  $view->setTitle($view->getTitle() . ":" . __FUNCTION__);
+}
+
+/**
+ * Implements hook_views_post_render().
+ */
+function test_basetheme_views_post_render(ViewExecutable $view) {
+  // We append the function name to the title for test to check for.
+  $view->setTitle($view->getTitle() . ":" . __FUNCTION__);
+}
diff --git a/core/modules/system/tests/themes/test_subtheme/test_subtheme.theme b/core/modules/system/tests/themes/test_subtheme/test_subtheme.theme
new file mode 100644
index 000000000000..e651807ae9f4
--- /dev/null
+++ b/core/modules/system/tests/themes/test_subtheme/test_subtheme.theme
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Add hooks for tests to use.
+ */
+
+use Drupal\views\ViewExecutable;
+
+/**
+ * Implements hook_views_pre_render().
+ */
+function test_subtheme_views_pre_render(ViewExecutable $view) {
+  // We append the function name to the title for test to check for.
+  $view->setTitle($view->getTitle() . ":" . __FUNCTION__);
+}
+
+/**
+ * Implements hook_views_post_render().
+ */
+function test_subtheme_views_post_render(ViewExecutable $view) {
+  // We append the function name to the title for test to check for.
+  $view->setTitle($view->getTitle() . ":" . __FUNCTION__);
+}
diff --git a/core/modules/views/lib/Drupal/views/Tests/ViewsThemeIntegrationTest.php b/core/modules/views/lib/Drupal/views/Tests/ViewsThemeIntegrationTest.php
new file mode 100644
index 000000000000..9f2ed2e8f540
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/ViewsThemeIntegrationTest.php
@@ -0,0 +1,93 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\ViewsThemeIntegrationTest.
+ */
+
+namespace Drupal\views\Tests;
+
+/**
+ * As views uses a lot of theme related functionality we need to test these too.
+ *
+ * We test against test_basetheme and test_subtheme provided by theme_test
+ */
+class ViewsThemeIntegrationTest extends ViewTestBase {
+
+ /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_page_display');
+
+
+  /**
+   * Used by WebTestBase::setup()
+   *
+   * We need theme_test for testing against test_basetheme and test_subtheme.
+   *
+   * @var array
+   *
+   * @see \Drupal\simpletest\WebTestBase::setup()
+   */
+  public static $modules = array('views', 'theme_test');
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Views theme integration test',
+      'description' => 'Tests the Views theme integration.',
+      'group' => 'Views',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->enableViewsTestModule();
+  }
+
+  /**
+   * Tests for exceptions and successful execution of hook_views_pre_render()
+   * and hook_views_post_render() in theme and subtheme.
+   */
+  public function testThemedViewPage() {
+
+    \Drupal::service('theme_handler')->enable(array('test_basetheme', 'test_subtheme'));
+
+    // Make base theme default then test for hook invocations.
+    \Drupal::config('system.theme')
+        ->set('default', 'test_basetheme')
+        ->save();
+    $this->assertEqual(\Drupal::config('system.theme')->get('default'), 'test_basetheme');
+
+    // Make sure a views rendered page is touched.
+    $this->drupalGet('test_page_display_200');
+
+    $this->assertRaw("test_basetheme_views_pre_render", "Views title changed by test_basetheme.test_basetheme_views_pre_render");
+    $this->assertRaw("test_basetheme_views_post_render", "Views title changed by test_basetheme.test_basetheme_views_post_render");
+
+    // Make sub theme default to test for hook invocation
+    // from both sub and base theme.
+    \Drupal::config('system.theme')
+        ->set('default', 'test_subtheme')
+        ->save();
+    $this->assertEqual(\Drupal::config('system.theme')->get('default'), 'test_subtheme');
+
+    // Make sure a views rendered page is touched.
+    $this->drupalGet('test_page_display_200');
+
+    $this->assertRaw("test_subtheme_views_pre_render", "Views title changed by test_usetheme.test_subtheme_views_pre_render");
+    $this->assertRaw("test_subtheme_views_post_render", "Views title changed by test_usetheme.test_subtheme_views_post_render");
+
+    $this->assertRaw("test_basetheme_views_pre_render", "Views title changed by test_basetheme.test_basetheme_views_pre_render");
+    $this->assertRaw("test_basetheme_views_post_render", "Views title changed by test_basetheme.test_basetheme_views_post_render");
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/ViewExecutable.php b/core/modules/views/lib/Drupal/views/ViewExecutable.php
index 88ebefc54932..9d9c857ed325 100644
--- a/core/modules/views/lib/Drupal/views/ViewExecutable.php
+++ b/core/modules/views/lib/Drupal/views/ViewExecutable.php
@@ -1360,7 +1360,7 @@ public function render($display_id = NULL) {
       // Let the themes play too, because pre render is a very themey thing.
       if (isset($GLOBALS['base_theme_info']) && isset($GLOBALS['theme'])) {
         foreach ($GLOBALS['base_theme_info'] as $base) {
-          $module_handler->invoke($base, 'views_pre_render', array($this));
+          $module_handler->invoke($base->name, 'views_pre_render', array($this));
         }
 
         $module_handler->invoke($GLOBALS['theme'], 'views_pre_render', array($this));
@@ -1384,7 +1384,7 @@ public function render($display_id = NULL) {
     // Let the themes play too, because post render is a very themey thing.
     if (isset($GLOBALS['base_theme_info']) && isset($GLOBALS['theme'])) {
       foreach ($GLOBALS['base_theme_info'] as $base) {
-        $module_handler->invoke($base, 'views_post_render', array($this));
+        $module_handler->invoke($base->name, 'views_post_render', array($this));
       }
 
       $module_handler->invoke($GLOBALS['theme'], 'views_post_render', array($this));
-- 
GitLab