diff --git a/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php b/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php index ab6abf7..a5dd437 100644 --- a/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php +++ b/src/Plugin/EntityBrowser/WidgetSelector/DropDown.php @@ -28,9 +28,9 @@ class DropDown extends WidgetSelectorBase { $browser = $form_state->getFormObject()->getEntityBrowser(); $widget_ids = []; - foreach (array_keys($this->widget_ids) as $id) { - if ($browser->getWidget($id)->access()) { - $widget_ids[$id] = $this->widget_ids[$id]; + foreach ($this->widget_ids as $widget_id => $widget_name) { + if ($browser->getWidget($widget_id)->access()) { + $widget_ids[$widget_id] = $widget_name; } } diff --git a/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml b/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml index 65178f0..1956d39 100644 --- a/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml +++ b/tests/modules/entity_browser_test/config/install/entity_browser.browser.test_entity_browser_file.yml @@ -35,3 +35,9 @@ widgets: weight: -10 label: view id: view + cbc59500-04ab-4395-b063-c561f0e3bf80: + id: dummy + label: dummy + weight: -8 + uuid: cbc59500-04ab-4395-b063-c561f0e3bf80 + settings: { } diff --git a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php index 7d19edf..d2961cc 100644 --- a/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php +++ b/tests/modules/entity_browser_test/src/Plugin/EntityBrowser/Widget/DummyWidget.php @@ -2,6 +2,7 @@ namespace Drupal\entity_browser_test\Plugin\EntityBrowser\Widget; +use Drupal\Core\Access\AccessResult; use Drupal\Core\Form\FormStateInterface; use Drupal\entity_browser\WidgetBase; @@ -55,4 +56,17 @@ class DummyWidget extends WidgetBase { return $form_state->getValue('dummy_entities', []); } + /** + * {@inheritdoc} + */ + public function access($return_as_object = FALSE) { + if (\Drupal::state()->get('eb_test_dummy_widget_access', TRUE)) { + $access = AccessResult::allowed(); + } + else { + $access = AccessResult::forbidden(); + } + return $return_as_object ? $access : $access->isAllowed(); + } + } diff --git a/tests/src/FunctionalJavascript/EntityBrowserTest.php b/tests/src/FunctionalJavascript/EntityBrowserTest.php index e8add2c..d97f8f1 100644 --- a/tests/src/FunctionalJavascript/EntityBrowserTest.php +++ b/tests/src/FunctionalJavascript/EntityBrowserTest.php @@ -78,6 +78,7 @@ class EntityBrowserTest extends EntityBrowserJavascriptTestBase { $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file'); + $this->assertSession()->linkExists('dummy'); $this->assertSession()->linkExists('view'); $this->assertSession()->linkExists('upload'); @@ -102,6 +103,19 @@ class EntityBrowserTest extends EntityBrowserJavascriptTestBase { // 'files[upload][]' => $this->container->get('file_system')->realpath($image2->getFileUri()), //]; // $this->drupalPostForm(NULL, $edit, 'Select files');. + + \Drupal::state()->set('eb_test_dummy_widget_access', FALSE); + + $this->drupalGet('node/add/article'); + + $this->assertSession()->linkExists('Select entities'); + $this->getSession()->getPage()->clickLink('Select entities'); + + $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file'); + + $this->assertSession()->linkNotExists('dummy'); + $this->assertSession()->linkExists('view'); + $this->assertSession()->linkExists('upload'); } /** @@ -130,6 +144,9 @@ class EntityBrowserTest extends EntityBrowserJavascriptTestBase { $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file'); $this->assertSession()->selectExists('widget'); + $this->assertSession()->optionExists('widget', 'cbc59500-04ab-4395-b063-c561f0e3bf80'); // Dummy + $this->assertSession()->optionExists('widget', '2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87'); // Upload + $this->assertSession()->optionExists('widget', '774798f1-5ec5-4b63-84bd-124cd51ec07d'); // View // Selects the view widget. $this->getSession()->getPage()->selectFieldOption('widget', '774798f1-5ec5-4b63-84bd-124cd51ec07d'); @@ -148,10 +165,23 @@ class EntityBrowserTest extends EntityBrowserJavascriptTestBase { // Causes a fatal. // Selects the upload widget. // $this->getSession()->getPage()->selectFieldOption('widget', '2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87');. + + \Drupal::state()->set('eb_test_dummy_widget_access', FALSE); + + $this->drupalGet('node/add/article'); + + $this->assertSession()->linkExists('Select entities'); + $this->getSession()->getPage()->clickLink('Select entities'); + + $this->getSession()->switchToIFrame('entity_browser_iframe_test_entity_browser_file'); + + $this->assertSession()->optionNotExists('widget', 'cbc59500-04ab-4395-b063-c561f0e3bf80'); // Dummy + $this->assertSession()->optionExists('widget', '2dc1ab07-2f8f-42c9-aab7-7eef7f8b7d87'); // Upload + $this->assertSession()->optionExists('widget', '774798f1-5ec5-4b63-84bd-124cd51ec07d'); // View } /** - * Tests wievs selection display. + * Tests views selection display. */ public function testViewsSelectionDisplayWidget() { diff --git a/tests/src/Kernel/Extension/EntityBrowserTest.php b/tests/src/Kernel/Extension/EntityBrowserTest.php index 8a102b7..16104f9 100644 --- a/tests/src/Kernel/Extension/EntityBrowserTest.php +++ b/tests/src/Kernel/Extension/EntityBrowserTest.php @@ -13,6 +13,7 @@ use Drupal\entity_browser\WidgetInterface; use Drupal\entity_browser\WidgetSelectorInterface; use Drupal\entity_browser\SelectionDisplayInterface; use Drupal\KernelTests\KernelTestBase; +use Drupal\user\Entity\User; use Drupal\views\Entity\View; /** @@ -466,4 +467,41 @@ class EntityBrowserTest extends KernelTestBase { $this->assertEmpty($form_state->getErrors(), t('Validation succeeded where expected')); } + /** + * Tests view widget access. + */ + public function testViewWidgetAccess() { + $this->installConfig(['entity_browser_test']); + $this->installEntitySchema('user'); + $this->installEntitySchema('user_role'); + + /** @var \Drupal\entity_browser\EntityBrowserInterface $entity */ + $entity = $this->controller->load('test_entity_browser_file'); + + $this->assertFalse($entity->getWidget('774798f1-5ec5-4b63-84bd-124cd51ec07d')->access()); + + // Create a user that has permission to access the view and try with it. + /** @var \Drupal\user\RoleInterface $role */ + $role = $this->container->get('entity_type.manager') + ->getStorage('user_role') + ->create([ + 'name' => $this->randomString(), + 'id' => $this->randomMachineName(), + ]); + $role->grantPermission('access content'); + $role->save(); + + $user = $this->container->get('entity_type.manager') + ->getStorage('user') + ->create([ + 'name' => $this->randomString(), + 'mail' => 'info@example.com', + 'roles' => $role->id(), + ]); + $user->save(); + \Drupal::currentUser()->setAccount($user); + + $this->assertTrue($entity->getWidget('774798f1-5ec5-4b63-84bd-124cd51ec07d')->access()); + } + }