summaryrefslogtreecommitdiffstatshomepage
path: root/core/modules/block
diff options
context:
space:
mode:
Diffstat (limited to 'core/modules/block')
-rw-r--r--core/modules/block/block.module4
-rw-r--r--core/modules/block/migrations/d6_block.yml2
-rw-r--r--core/modules/block/migrations/d7_block.yml2
-rw-r--r--core/modules/block/src/BlockViewBuilder.php6
-rw-r--r--core/modules/block/src/Hook/BlockHooks.php7
-rw-r--r--core/modules/block/tests/modules/block_test/src/Hook/BlockTestHooks.php10
-rw-r--r--core/modules/block/tests/src/Kernel/BlockConfigSchemaTest.php4
-rw-r--r--core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php86
-rw-r--r--core/modules/block/tests/src/Kernel/BlockViewBuilderTest.php24
-rw-r--r--core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php2
10 files changed, 140 insertions, 7 deletions
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index 94a2cb9fc7a7..24e285894915 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -16,6 +16,10 @@ use Drupal\Core\Installer\InstallerKernel;
* @see block_modules_installed()
*/
function block_themes_installed($theme_list): void {
+ // Do not create blocks during config sync.
+ if (\Drupal::service('config.installer')->isSyncing()) {
+ return;
+ }
// Disable this functionality prior to install profile installation because
// block configuration is often optional or provided by the install profile
// itself. block_theme_initialize() will be called when the install profile is
diff --git a/core/modules/block/migrations/d6_block.yml b/core/modules/block/migrations/d6_block.yml
index 74922444e8df..853ce28a47b8 100644
--- a/core/modules/block/migrations/d6_block.yml
+++ b/core/modules/block/migrations/d6_block.yml
@@ -56,8 +56,6 @@ process:
1: forum_new_block
locale:
0: language_block
- node:
- 0: node_syndicate_block
search:
0: search_form_block
statistics:
diff --git a/core/modules/block/migrations/d7_block.yml b/core/modules/block/migrations/d7_block.yml
index 9b031b7daa79..35c6f23d86f4 100644
--- a/core/modules/block/migrations/d7_block.yml
+++ b/core/modules/block/migrations/d7_block.yml
@@ -59,8 +59,6 @@ process:
new: forum_new_block
# locale:
# 0: language_block
- node:
- syndicate: node_syndicate_block
search:
form: search_form_block
statistics:
diff --git a/core/modules/block/src/BlockViewBuilder.php b/core/modules/block/src/BlockViewBuilder.php
index f33092de869e..b5a1e4643468 100644
--- a/core/modules/block/src/BlockViewBuilder.php
+++ b/core/modules/block/src/BlockViewBuilder.php
@@ -67,7 +67,11 @@ class BlockViewBuilder extends EntityViewBuilder implements TrustedCallbackInter
if ($plugin instanceof MainContentBlockPluginInterface || $plugin instanceof TitleBlockPluginInterface) {
// Immediately build a #pre_render-able block, since this block cannot
// be built lazily.
- $build[$entity_id] += static::buildPreRenderableBlock($entity, $this->moduleHandler());
+ $cacheableMetadata = CacheableMetadata::createFromRenderArray($build[$entity_id]);
+ $preRenderableBlock = static::buildPreRenderableBlock($entity, $this->moduleHandler());
+ $cacheableMetadata->addCacheableDependency(CacheableMetadata::createFromRenderArray($preRenderableBlock));
+ $build[$entity_id] += $preRenderableBlock;
+ $cacheableMetadata->applyTo($build[$entity_id]);
}
else {
// Assign a #lazy_builder callback, which will generate a #pre_render-
diff --git a/core/modules/block/src/Hook/BlockHooks.php b/core/modules/block/src/Hook/BlockHooks.php
index 657109309a30..802a60bccb15 100644
--- a/core/modules/block/src/Hook/BlockHooks.php
+++ b/core/modules/block/src/Hook/BlockHooks.php
@@ -151,7 +151,12 @@ class BlockHooks {
* @see block_themes_installed()
*/
#[Hook('modules_installed')]
- public function modulesInstalled($modules): void {
+ public function modulesInstalled($modules, bool $is_syncing): void {
+ // Do not create blocks during config sync.
+ if ($is_syncing) {
+ return;
+ }
+
// block_themes_installed() does not call block_theme_initialize() during
// site installation because block configuration can be optional or provided
// by the profile. Now, when the profile is installed, this configuration
diff --git a/core/modules/block/tests/modules/block_test/src/Hook/BlockTestHooks.php b/core/modules/block/tests/modules/block_test/src/Hook/BlockTestHooks.php
index 19afd070f9d0..7954c270df24 100644
--- a/core/modules/block/tests/modules/block_test/src/Hook/BlockTestHooks.php
+++ b/core/modules/block/tests/modules/block_test/src/Hook/BlockTestHooks.php
@@ -37,6 +37,16 @@ class BlockTestHooks {
}
/**
+ * Implements hook_block_view_BASE_BLOCK_ID_alter().
+ *
+ * @see \Drupal\Tests\block\Kernel\BlockViewBuilderTest::testBlockViewBuilderCacheTitleBlock()
+ */
+ #[Hook('block_view_page_title_block_alter')]
+ public function blockViewPageTitleBlockAlter(array &$build, BlockPluginInterface $block): void {
+ $build['#cache']['tags'][] = 'custom_cache_tag';
+ }
+
+ /**
* Implements hook_block_build_BASE_BLOCK_ID_alter().
*/
#[Hook('block_build_test_cache_alter')]
diff --git a/core/modules/block/tests/src/Kernel/BlockConfigSchemaTest.php b/core/modules/block/tests/src/Kernel/BlockConfigSchemaTest.php
index 8b2ead48edaf..6305ab7f8415 100644
--- a/core/modules/block/tests/src/Kernel/BlockConfigSchemaTest.php
+++ b/core/modules/block/tests/src/Kernel/BlockConfigSchemaTest.php
@@ -65,6 +65,10 @@ class BlockConfigSchemaTest extends KernelTestBase {
*/
public function testBlockConfigSchema(): void {
foreach ($this->blockManager->getDefinitions() as $block_id => $definition) {
+ // Skip the syndicate block as it is deprecated.
+ if ($block_id === 'node_syndicate_block') {
+ continue;
+ }
$id = $this->randomMachineName();
$block = Block::create([
'id' => $id,
diff --git a/core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php b/core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php
new file mode 100644
index 000000000000..80e3f7983420
--- /dev/null
+++ b/core/modules/block/tests/src/Kernel/BlockConfigSyncTest.php
@@ -0,0 +1,86 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\block\Kernel;
+
+use Drupal\Core\Config\ConfigInstallerInterface;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\Extension\ThemeInstallerInterface;
+use Drupal\KernelTests\KernelTestBase;
+use Drupal\block\Entity\Block;
+
+/**
+ * Tests that blocks are not created during config sync.
+ *
+ * @group block
+ */
+class BlockConfigSyncTest extends KernelTestBase {
+
+ /**
+ * {@inheritdoc}
+ */
+ protected static $modules = ['block', 'system'];
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function setUp(): void {
+ parent::setUp();
+
+ \Drupal::service(ThemeInstallerInterface::class)
+ ->install(['stark', 'claro']);
+
+ // Delete all existing blocks.
+ foreach (Block::loadMultiple() as $block) {
+ $block->delete();
+ }
+
+ // Set the default theme.
+ $this->config('system.theme')
+ ->set('default', 'stark')
+ ->save();
+
+ // Create a block for the default theme to be copied later.
+ Block::create([
+ 'id' => 'test_block',
+ 'plugin' => 'system_powered_by_block',
+ 'region' => 'content',
+ 'theme' => 'stark',
+ ])->save();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function register(ContainerBuilder $container): void {
+ parent::register($container);
+ $container->setParameter('install_profile', 'testing');
+ }
+
+ /**
+ * Tests blocks are not created during config sync.
+ *
+ * @param bool $syncing
+ * Whether or not config is syncing when the hook is invoked.
+ * @param string|null $expected_block_id
+ * The expected ID of the block that should be created, or NULL if no block
+ * should be created.
+ *
+ * @testWith [true, null]
+ * [false, "claro_test_block"]
+ */
+ public function testNoBlocksCreatedDuringConfigSync(bool $syncing, ?string $expected_block_id): void {
+ \Drupal::service(ConfigInstallerInterface::class)
+ ->setSyncing($syncing);
+
+ // Invoke the hook that should skip block creation due to config sync.
+ \Drupal::moduleHandler()->invoke('block', 'themes_installed', [['claro']]);
+ // This should hold true if the "current" install profile triggers an
+ // invocation of hook_modules_installed().
+ \Drupal::moduleHandler()->invoke('block', 'modules_installed', [['testing'], $syncing]);
+
+ $this->assertSame($expected_block_id, Block::load('claro_test_block')?->id());
+ }
+
+}
diff --git a/core/modules/block/tests/src/Kernel/BlockViewBuilderTest.php b/core/modules/block/tests/src/Kernel/BlockViewBuilderTest.php
index d93e1f819eab..377cd31deacb 100644
--- a/core/modules/block/tests/src/Kernel/BlockViewBuilderTest.php
+++ b/core/modules/block/tests/src/Kernel/BlockViewBuilderTest.php
@@ -164,6 +164,30 @@ class BlockViewBuilderTest extends KernelTestBase {
}
/**
+ * Tests title block render cache handling.
+ *
+ * @see \Drupal\block_test\Hook\BlockTestHooks::blockViewPageTitleBlockAlter()
+ */
+ public function testBlockViewBuilderCacheTitleBlock(): void {
+ // Create title block.
+ $this->block = $this->controller->create([
+ 'id' => 'test_block_title',
+ 'theme' => 'stark',
+ 'plugin' => 'page_title_block',
+ ]);
+ $this->block->save();
+
+ $entity = Block::load('test_block_title');
+ $builder = \Drupal::entityTypeManager()->getViewBuilder('block');
+ $output = $builder->view($entity, 'block');
+
+ $this->assertSame(
+ ['block_view', 'config:block.block.test_block_title', 'custom_cache_tag'],
+ $output['#cache']['tags']
+ );
+ }
+
+ /**
* Verifies render cache handling of the block being tested.
*
* @see ::testBlockViewBuilderCache()
diff --git a/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php
index 3f20b2148b8d..dc96d95e6996 100644
--- a/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php
+++ b/core/modules/block/tests/src/Kernel/Migrate/d6/MigrateBlockTest.php
@@ -100,7 +100,7 @@ class MigrateBlockTest extends MigrateDrupal6TestBase {
*/
public function testBlockMigration(): void {
$blocks = Block::loadMultiple();
- $this->assertCount(25, $blocks);
+ $this->assertCount(24, $blocks);
// Check user blocks.
$visibility = [