diff --git a/core/tests/Drupal/FunctionalTests/Theme/ClaroLayoutBuilderTest.php b/core/tests/Drupal/FunctionalTests/Theme/ClaroLayoutBuilderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..a198c110ea49fdaa3051905d6293a2e553d2fd85 --- /dev/null +++ b/core/tests/Drupal/FunctionalTests/Theme/ClaroLayoutBuilderTest.php @@ -0,0 +1,111 @@ +<?php + +namespace Drupal\FunctionalTests\Theme; + +use Drupal\Tests\BrowserTestBase; + +/** + * Tests the layout builder with the Claro theme. + * + * @group claro + */ +class ClaroLayoutBuilderTest extends BrowserTestBase { + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'claro'; + + /** + * {@inheritdoc} + */ + public static $modules = [ + 'views', + 'layout_builder', + 'layout_builder_views_test', + 'layout_test', + 'block', + 'block_test', + 'node', + 'layout_builder_test', + ]; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + $this->drupalPlaceBlock('local_tasks_block', ['region' => 'header']); + + // Create two nodes. + $this->createContentType([ + 'type' => 'bundle_with_section_field', + 'name' => 'Bundle with section field', + ]); + $this->createNode([ + 'type' => 'bundle_with_section_field', + 'title' => 'The first node title', + 'body' => [ + [ + 'value' => 'The first node body', + ], + ], + ]); + $this->createNode([ + 'type' => 'bundle_with_section_field', + 'title' => 'The second node title', + 'body' => [ + [ + 'value' => 'The second node body', + ], + ], + ]); + } + + /** + * Tests the layout builder has expected contextual links with Claro. + * + * @see claro.theme + */ + public function testContextualLinks() { + $assert_session = $this->assertSession(); + $page = $this->getSession()->getPage(); + + $this->drupalLogin($this->drupalCreateUser([ + 'configure any layout', + 'administer node display', + 'administer node fields', + 'access contextual links', + ])); + + $field_ui_prefix = 'admin/structure/types/manage/bundle_with_section_field'; + + // From the manage display page, go to manage the layout. + $this->drupalGet("$field_ui_prefix/display/default"); + $assert_session->linkNotExists('Manage layout'); + $assert_session->fieldDisabled('layout[allow_custom]'); + + $this->drupalPostForm(NULL, ['layout[enabled]' => TRUE], 'Save'); + $assert_session->linkExists('Manage layout'); + $this->clickLink('Manage layout'); + + // Add a new block. + $assert_session->linkExists('Add block'); + $this->clickLink('Add block'); + $assert_session->linkExists('Powered by Drupal'); + $this->clickLink('Powered by Drupal'); + $page->fillField('settings[label]', 'This is the label'); + $page->checkField('settings[label_display]'); + $page->pressButton('Add block'); + + // Test that the block has the contextual class applied and the container + // for contextual links. + $assert_session->elementExists('css', 'div.block-system-powered-by-block.contextual-region div[data-contextual-id]'); + + // Ensure other blocks do not have contextual links. + $assert_session->elementExists('css', 'div.block-page-title-block'); + $assert_session->elementNotExists('css', 'div.block-page-title-block.contextual-region div[data-contextual-id]'); + } + +} diff --git a/core/tests/Drupal/FunctionalTests/Theme/SevenLayoutBuilderTest.php b/core/tests/Drupal/FunctionalTests/Theme/SevenLayoutBuilderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ff668895813da71266f6a1e2bc7ac8121c1d08c5 --- /dev/null +++ b/core/tests/Drupal/FunctionalTests/Theme/SevenLayoutBuilderTest.php @@ -0,0 +1,112 @@ +<?php + +namespace Drupal\FunctionalTests\Theme; + +use Drupal\Tests\BrowserTestBase; + +/** + * Tests the Seven theme. + * + * @group seven + */ +class SevenLayoutBuilderTest extends BrowserTestBase { + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'seven'; + + /** + * {@inheritdoc} + */ + public static $modules = [ + 'views', + 'layout_builder', + 'layout_builder_views_test', + 'layout_test', + 'block', + 'block_test', + 'node', + 'layout_builder_test', + ]; + + /** + * {@inheritdoc} + */ + protected function setUp() { + parent::setUp(); + + $this->drupalPlaceBlock('page_title_block', ['region' => 'header']); + $this->drupalPlaceBlock('local_tasks_block', ['region' => 'header']); + + // Create two nodes. + $this->createContentType([ + 'type' => 'bundle_with_section_field', + 'name' => 'Bundle with section field', + ]); + $this->createNode([ + 'type' => 'bundle_with_section_field', + 'title' => 'The first node title', + 'body' => [ + [ + 'value' => 'The first node body', + ], + ], + ]); + $this->createNode([ + 'type' => 'bundle_with_section_field', + 'title' => 'The second node title', + 'body' => [ + [ + 'value' => 'The second node body', + ], + ], + ]); + } + + /** + * Tests the layout builder has expected contextual links with Seven. + * + * @see seven.theme + */ + public function testContextualLinks() { + $assert_session = $this->assertSession(); + $page = $this->getSession()->getPage(); + + $this->drupalLogin($this->drupalCreateUser([ + 'configure any layout', + 'administer node display', + 'administer node fields', + 'access contextual links', + ])); + + $field_ui_prefix = 'admin/structure/types/manage/bundle_with_section_field'; + + // From the manage display page, go to manage the layout. + $this->drupalGet("$field_ui_prefix/display/default"); + $assert_session->linkNotExists('Manage layout'); + $assert_session->fieldDisabled('layout[allow_custom]'); + + $this->drupalPostForm(NULL, ['layout[enabled]' => TRUE], 'Save'); + $assert_session->linkExists('Manage layout'); + $this->clickLink('Manage layout'); + + // Add a new block. + $assert_session->linkExists('Add block'); + $this->clickLink('Add block'); + $assert_session->linkExists('Powered by Drupal'); + $this->clickLink('Powered by Drupal'); + $page->fillField('settings[label]', 'This is the label'); + $page->checkField('settings[label_display]'); + $page->pressButton('Add block'); + + // Test that the block has the contextual class applied and the container + // for contextual links. + $assert_session->elementExists('css', 'div.block-system-powered-by-block.contextual-region div[data-contextual-id]'); + + // Ensure other blocks do not have contextual links. + $assert_session->elementExists('css', 'div.block-page-title-block'); + $assert_session->elementNotExists('css', 'div.block-page-title-block.contextual-region div[data-contextual-id]'); + } + +} diff --git a/core/themes/claro/claro.theme b/core/themes/claro/claro.theme index bc6bcfed7b0f926f56f533303ec2f6dcc61c26c7..df810f09b8fbf2309a433d64841c20511d103758 100644 --- a/core/themes/claro/claro.theme +++ b/core/themes/claro/claro.theme @@ -175,10 +175,10 @@ function claro_preprocess_entity_add_list(&$variables) { /** * Implements hook_preprocess_block() for block content. * - * Disables contextual links for all blocks. + * Disables contextual links for all blocks except for layout builder blocks. */ function claro_preprocess_block(&$variables) { - if (isset($variables['title_suffix']['contextual_links'])) { + if (isset($variables['title_suffix']['contextual_links']) && !isset($variables['elements']['#contextual_links']['layout_builder_block'])) { unset($variables['title_suffix']['contextual_links']); unset($variables['elements']['#contextual_links']); diff --git a/core/themes/seven/seven.theme b/core/themes/seven/seven.theme index 740f1bd28d6fb3e9982708c6b93081a836384b71..08a594b5a53388d69769be1851d0990a748935be 100644 --- a/core/themes/seven/seven.theme +++ b/core/themes/seven/seven.theme @@ -89,10 +89,10 @@ function seven_preprocess_block_content_add_list(&$variables) { /** * Implements hook_preprocess_block() for block content. * - * Disables contextual links for all blocks. + * Disables contextual links for all blocks except for layout builder blocks. */ function seven_preprocess_block(&$variables) { - if (isset($variables['title_suffix']['contextual_links'])) { + if (isset($variables['title_suffix']['contextual_links']) && !isset($variables['elements']['#contextual_links']['layout_builder_block'])) { unset($variables['title_suffix']['contextual_links']); unset($variables['elements']['#contextual_links']);