diff --git a/core/modules/user/src/Tests/Views/AccessPermissionTest.php b/core/modules/user/src/Tests/Views/AccessPermissionTest.php index 3e77e2a..80bebe0 100644 --- a/core/modules/user/src/Tests/Views/AccessPermissionTest.php +++ b/core/modules/user/src/Tests/Views/AccessPermissionTest.php @@ -7,6 +7,7 @@ namespace Drupal\user\Tests\Views; +use Drupal\Core\Access\AccessResultInterface; use Drupal\user\Plugin\views\access\Permission; use Drupal\views\Plugin\views\display\DisplayPluginBase; use Drupal\views\Views; @@ -37,8 +38,12 @@ function testAccessPerm() { $this->assertTrue($access_plugin instanceof Permission, 'Make sure the right class got instantiated.'); $this->assertEqual($access_plugin->pluginTitle(), t('Permission')); - $this->assertFalse($view->display_handler->access($this->webUser)); - $this->assertTrue($view->display_handler->access($this->normalUser)); + $access = $view->display_handler->access($this->webUser); + $this->assertTrue($access instanceof AccessResultInterface); + $this->assertFalse($access->isAllowed()); + $access = $view->display_handler->access($this->normalUser); + $this->assertTrue($access instanceof AccessResultInterface); + $this->assertTrue($access->isAllowed()); } /** diff --git a/core/modules/views/src/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php index b915fd0..fff9488 100644 --- a/core/modules/views/src/ViewExecutable.php +++ b/core/modules/views/src/ViewExecutable.php @@ -1626,7 +1626,6 @@ public function attachDisplays() { * (optional) The checked account. * * @param bool $return_as_object - * @param bool $return_as_object * (optional) Whether an object or boolean value is returned. * * @return bool|\Drupal\Core\Access\AccessResultInterface @@ -1656,14 +1655,16 @@ public function access($displays = NULL, AccountInterface $account = NULL, $retu // We can't use choose_display() here because that function // calls this one. + $access = AccessResult::forbidden(); $displays = (array)$displays; - $access = AccessResult::neutral(); foreach ($displays as $display_id) { if ($this->displayHandlers->has($display_id)) { if (($display = $this->displayHandlers->get($display_id))) { - // @fixme This is certainly not the right thing to do. We want to not - // combine all of them but rather just match one of them. - $access = $access->orIf($display->access($account)); + $display_access = $display->access($account); + if ($display_access->isAllowed()) { + $access = $display_access; + break; + } } } } diff --git a/core/modules/views/tests/src/Unit/ViewExecutableTest.php b/core/modules/views/tests/src/Unit/ViewExecutableTest.php index 65ca9ee..b48892c 100644 --- a/core/modules/views/tests/src/Unit/ViewExecutableTest.php +++ b/core/modules/views/tests/src/Unit/ViewExecutableTest.php @@ -556,11 +556,12 @@ public function testAccessWithMultipleDisplay($page_1_access, $page_2_access, $e public function providerTestAccessWithMultipleDisplay() { $data = [ - [AccessResult::allowed(), AccessResult::allowed(), AccessResult::allowed()], - [AccessResult::neutral(), AccessResult::allowed(), AccessResult::allowed()], - [AccessResult::allowed(), AccessResult::neutral(), AccessResult::allowed()], - [AccessResult::neutral(), AccessResult::neutral(), AccessResult::neutral()], - [AccessResult::forbidden(), AccessResult::allowed(), AccessResult::allowed()], + 'both_allowed' => [AccessResult::allowed(), AccessResult::allowed(), AccessResult::allowed()], + 'first_neutral' => [AccessResult::neutral(), AccessResult::allowed(), AccessResult::allowed()], + 'second_neutral' => [AccessResult::allowed(), AccessResult::neutral(), AccessResult::allowed()], + 'both_neutral' => [AccessResult::neutral(), AccessResult::neutral(), AccessResult::forbidden()], + 'first_forbidden' => [AccessResult::forbidden(), AccessResult::allowed(), AccessResult::allowed()], + 'second_forbidden' => [AccessResult::allowed(), AccessResult::forbidden(), AccessResult::allowed()], ]; return $data;