From a90dae47a0819f7b6339fd99c5410fad382002eb Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Thu, 7 Nov 2019 10:20:44 +0000
Subject: [PATCH] Issue #2917006 by tedbow, amateescu, Wim Leers, sam-elayyoub,
 Pascal-, jnimchuk, catch, alexpott, kruser, neclimdul, chris5156, Rick Hood:
 Views referencing missing roles fail
 views_post_update_revision_metadata_fields()

---
 .../user/src/Plugin/views/filter/Roles.php    |  8 ++++--
 .../Kernel/Views/HandlerFilterRolesTest.php   | 25 +++++++++++++++++++
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/core/modules/user/src/Plugin/views/filter/Roles.php b/core/modules/user/src/Plugin/views/filter/Roles.php
index 83dfbb33704c..68cbe3ebaf7c 100644
--- a/core/modules/user/src/Plugin/views/filter/Roles.php
+++ b/core/modules/user/src/Plugin/views/filter/Roles.php
@@ -88,8 +88,12 @@ public function calculateDependencies() {
     }
 
     foreach ((array) $this->value as $role_id) {
-      $role = $this->roleStorage->load($role_id);
-      $dependencies[$role->getConfigDependencyKey()][] = $role->getConfigDependencyName();
+      if ($role = $this->roleStorage->load($role_id)) {
+        $dependencies[$role->getConfigDependencyKey()][] = $role->getConfigDependencyName();
+      }
+      else {
+        trigger_error("The {$role_id} role does not exist. You should review and fix the configuration of the {$this->view->id()} view.", E_USER_WARNING);
+      }
     }
     return $dependencies;
   }
diff --git a/core/modules/user/tests/src/Kernel/Views/HandlerFilterRolesTest.php b/core/modules/user/tests/src/Kernel/Views/HandlerFilterRolesTest.php
index ec5a06bf1cb0..878300b79d51 100644
--- a/core/modules/user/tests/src/Kernel/Views/HandlerFilterRolesTest.php
+++ b/core/modules/user/tests/src/Kernel/Views/HandlerFilterRolesTest.php
@@ -5,6 +5,7 @@
 use Drupal\user\Entity\Role;
 use Drupal\views\Entity\View;
 use Drupal\views\Views;
+use PHPUnit\Framework\Error\Warning;
 
 /**
  * Tests the roles filter handler.
@@ -95,4 +96,28 @@ public function testDependencies() {
     $this->assertEqual($expected, $view->getDependencies());
   }
 
+  /**
+   * Tests that a warning is triggered if the filter references a missing role.
+   */
+  public function testMissingRole() {
+    $role = Role::create(['id' => 'test_user_role']);
+    $role->save();
+    /** @var \Drupal\views\Entity\View $view */
+    $view = View::load('test_user_name');
+    $display = &$view->getDisplay('default');
+    $display['display_options']['filters']['roles_target_id'] = [
+      'id' => 'roles_target_id',
+      'table' => 'user__roles',
+      'field' => 'roles_target_id',
+      'value' => ['test_user_role' => 'test_user_role'],
+      'plugin_id' => 'user_roles',
+    ];
+    // Ensure no warning is triggered before the role is deleted.
+    $view->calculateDependencies();
+    $role->delete();
+    $this->expectException(Warning::class);
+    $this->expectExceptionMessage('The test_user_role role does not exist. You should review and fix the configuration of the test_user_name view.');
+    $view->calculateDependencies();
+  }
+
 }
-- 
GitLab