Skip to content
Snippets Groups Projects
Unverified Commit bc383a3b authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3437499 by catch, kristiaanvandeneynde, oily, berdir: Use placeholdering for more blocks

parent 9525aa6d
No related branches found
No related tags found
No related merge requests found
Pipeline #450972 canceled
Showing
with 112 additions and 41 deletions
......@@ -76,6 +76,19 @@ public function access(AccountInterface $account, $return_as_object = FALSE);
*/
public function build();
/**
* Whether to render blocks in a placeholder.
*
* When blocks of this type are rendered, indicate whether they should be
* rendered in a placeholder or not. In general, blocks that attach libraries
* and/or render entities should be placeholdered to optimize various aspects
* of rendering performance.
*
* @return bool
* Whether to placeholder blocks of this plugin type.
*/
public function createPlaceholder(): bool;
/**
* Sets a particular value in the block settings.
*
......
......@@ -296,4 +296,11 @@ public function setInPreview(bool $in_preview): void {
$this->inPreview = $in_preview;
}
/**
* {@inheritdoc}
*/
public function createPlaceholder(): bool {
return FALSE;
}
}
......@@ -83,4 +83,11 @@ public function build() {
return $local_actions;
}
/**
* {@inheritdoc}
*/
public function createPlaceholder(): bool {
return TRUE;
}
}
......@@ -165,4 +165,11 @@ public function blockSubmit($form, FormStateInterface $form_state) {
$this->configuration['secondary'] = $levels['secondary'];
}
/**
* {@inheritdoc}
*/
public function createPlaceholder(): bool {
return TRUE;
}
}
......@@ -75,6 +75,13 @@ public function viewMultiple(array $entities = [], $view_mode = 'full', $langcod
$build[$entity_id] += [
'#lazy_builder' => [static::class . '::lazyBuilder', [$entity_id, $view_mode, $langcode]],
];
// Only add create_placeholder if it's explicitly set to TRUE, so it can
// be set to TRUE by automatic placeholdering conditions if it's absent.
if ($plugin->createPlaceholder()) {
$build[$entity_id] += [
'#create_placeholder' => TRUE,
];
}
}
}
......
......@@ -196,6 +196,13 @@ public function build() {
}
}
/**
* {@inheritdoc}
*/
public function createPlaceholder(): bool {
return TRUE;
}
/**
* Loads the block content entity of the block.
*
......
......@@ -73,4 +73,11 @@ public function build() {
return $this->breadcrumbManager->build($this->routeMatch)->toRenderable();
}
/**
* {@inheritdoc}
*/
public function createPlaceholder(): bool {
return TRUE;
}
}
......@@ -235,4 +235,11 @@ public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), ['route.menu_active_trails:' . $menu_name]);
}
/**
* {@inheritdoc}
*/
public function createPlaceholder(): bool {
return TRUE;
}
}
......@@ -24,6 +24,10 @@ class ViewsBlock extends ViewsBlockBase {
* {@inheritdoc}
*/
public function build() {
// If the block plugin is invalid, there is nothing to do.
if (!method_exists($this->view->display_handler, 'preBlockBuild')) {
return [];
}
$this->view->display_handler->preBlockBuild($this);
$args = [];
......
......@@ -258,4 +258,11 @@ public function getViewExecutable() {
return $this->view;
}
/**
* {@inheritdoc}
*/
public function createPlaceholder(): bool {
return TRUE;
}
}
......@@ -49,10 +49,10 @@ public function testFrontAndRecipesPagesAuthenticated(): void {
$expected = [
'ScriptCount' => 3,
'ScriptBytes' => 170500,
'StylesheetCount' => 6,
'StylesheetCount' => 5,
'StylesheetBytes' => 86650,
];
$this->assertMetrics($expected, $performance_data);
}
/**
......@@ -70,8 +70,8 @@ public function testFrontAndRecipesPagesEditor(): void {
$expected = [
'ScriptCount' => 5,
'ScriptBytes' => 338200,
'StylesheetCount' => 6,
'StylesheetBytes' => 308500,
'StylesheetCount' => 5,
'StylesheetBytes' => 206750,
];
$this->assertMetrics($expected, $performance_data);
}
......
......@@ -51,18 +51,19 @@ public function testFrontPageAuthenticatedWarmCache(): void {
$expected = [
'QueryCount' => 4,
'CacheGetCount' => 40,
'CacheGetCount' => 42,
'CacheGetCountByBin' => [
'config' => 22,
'discovery' => 5,
'data' => 7,
'bootstrap' => 4,
'dynamic_page_cache' => 2,
'render' => 2,
],
'CacheSetCount' => 0,
'CacheDeleteCount' => 0,
'CacheTagInvalidationCount' => 0,
'CacheTagLookupQueryCount' => 2,
'CacheTagLookupQueryCount' => 4,
'ScriptCount' => 2,
'ScriptBytes' => 123850,
'StylesheetCount' => 2,
......
......@@ -178,6 +178,9 @@ protected function testNodePageWarmCache(): void {
'SELECT "base_table"."id" AS "id", "base_table"."path" AS "path", "base_table"."alias" AS "alias", "base_table"."langcode" AS "langcode" FROM "path_alias" "base_table" WHERE ("base_table"."status" = 1) AND ("base_table"."path" LIKE "/node/1" ESCAPE \'\\\\\') AND ("base_table"."langcode" IN ("es", "und")) ORDER BY "base_table"."langcode" ASC, "base_table"."id" DESC',
'SELECT "menu_tree"."menu_name" AS "menu_name", "menu_tree"."route_name" AS "route_name", "menu_tree"."route_parameters" AS "route_parameters", "menu_tree"."url" AS "url", "menu_tree"."title" AS "title", "menu_tree"."description" AS "description", "menu_tree"."parent" AS "parent", "menu_tree"."weight" AS "weight", "menu_tree"."options" AS "options", "menu_tree"."expanded" AS "expanded", "menu_tree"."enabled" AS "enabled", "menu_tree"."provider" AS "provider", "menu_tree"."metadata" AS "metadata", "menu_tree"."class" AS "class", "menu_tree"."form_class" AS "form_class", "menu_tree"."id" AS "id" FROM "menu_tree" "menu_tree" WHERE ("route_name" = "entity.node.canonical") AND ("route_param_key" = "node=1") AND ("menu_name" = "account") ORDER BY "depth" ASC, "weight" ASC, "id" ASC',
'SELECT "menu_tree"."menu_name" AS "menu_name", "menu_tree"."route_name" AS "route_name", "menu_tree"."route_parameters" AS "route_parameters", "menu_tree"."url" AS "url", "menu_tree"."title" AS "title", "menu_tree"."description" AS "description", "menu_tree"."parent" AS "parent", "menu_tree"."weight" AS "weight", "menu_tree"."options" AS "options", "menu_tree"."expanded" AS "expanded", "menu_tree"."enabled" AS "enabled", "menu_tree"."provider" AS "provider", "menu_tree"."metadata" AS "metadata", "menu_tree"."class" AS "class", "menu_tree"."form_class" AS "form_class", "menu_tree"."id" AS "id" FROM "menu_tree" "menu_tree" WHERE ("route_name" = "entity.node.canonical") AND ("route_param_key" = "node=1") AND ("menu_name" = "main") ORDER BY "depth" ASC, "weight" ASC, "id" ASC',
'SELECT "menu_tree"."menu_name" AS "menu_name", "menu_tree"."route_name" AS "route_name", "menu_tree"."route_parameters" AS "route_parameters", "menu_tree"."url" AS "url", "menu_tree"."title" AS "title", "menu_tree"."description" AS "description", "menu_tree"."parent" AS "parent", "menu_tree"."weight" AS "weight", "menu_tree"."options" AS "options", "menu_tree"."expanded" AS "expanded", "menu_tree"."enabled" AS "enabled", "menu_tree"."provider" AS "provider", "menu_tree"."metadata" AS "metadata", "menu_tree"."class" AS "class", "menu_tree"."form_class" AS "form_class", "menu_tree"."id" AS "id" FROM "menu_tree" "menu_tree" WHERE ("route_name" = "entity.node.canonical") AND ("route_param_key" = "node=1") AND ("menu_name" = "footer") ORDER BY "depth" ASC, "weight" ASC, "id" ASC',
'SELECT "base_table"."id" AS "id", "base_table"."path" AS "path", "base_table"."alias" AS "alias", "base_table"."langcode" AS "langcode" FROM "path_alias" "base_table" WHERE ("base_table"."status" = 1) AND ("base_table"."alias" LIKE "/recipes" ESCAPE \'\\\\\') AND ("base_table"."langcode" IN ("en", "und")) ORDER BY "base_table"."langcode" ASC, "base_table"."id" DESC',
'SELECT "base_table"."id" AS "id", "base_table"."path" AS "path", "base_table"."alias" AS "alias", "base_table"."langcode" AS "langcode" FROM "path_alias" "base_table" WHERE ("base_table"."status" = 1) AND ("base_table"."alias" LIKE "/node" ESCAPE \'\\\\\') AND ("base_table"."langcode" IN ("en", "und")) ORDER BY "base_table"."langcode" ASC, "base_table"."id" DESC',
'SELECT "base_table"."vid" AS "vid", "base_table"."nid" AS "nid" FROM "node_revision" "base_table" INNER JOIN "node_field_data" "node_field_data" ON "node_field_data"."nid" = "base_table"."nid" INNER JOIN "node_field_revision" "node_field_revision" ON "node_field_revision"."vid" = "base_table"."vid" AND "node_field_revision"."langcode" = "en" WHERE ("node_field_data"."nid" = "1") AND ("node_field_revision"."revision_translation_affected" = 1) GROUP BY "base_table"."vid", "base_table"."nid" ORDER BY "base_table"."vid" DESC LIMIT 1 OFFSET 0',
'SELECT "revision"."vid" AS "vid", "revision"."langcode" AS "langcode", "revision"."revision_uid" AS "revision_uid", "revision"."revision_timestamp" AS "revision_timestamp", "revision"."revision_log" AS "revision_log", "revision"."revision_default" AS "revision_default", "base"."nid" AS "nid", "base"."type" AS "type", "base"."uuid" AS "uuid", CASE "base"."vid" WHEN "revision"."vid" THEN 1 ELSE 0 END AS "isDefaultRevision" FROM "node" "base" INNER JOIN "node_revision" "revision" ON "revision"."nid" = "base"."nid" AND "revision"."vid" IN (75)',
'SELECT "revision".* FROM "node_field_revision" "revision" WHERE ("revision"."vid" IN (75)) AND ("revision"."vid" IN ("75")) ORDER BY "revision"."vid" ASC',
......@@ -275,9 +278,6 @@ protected function testNodePageWarmCache(): void {
'SELECT "t".* FROM "node_revision__field_summary" "t" WHERE ("revision_id" IN ("75")) AND ("deleted" = 0) AND ("langcode" IN ("en", "es", "und", "zxx")) ORDER BY "delta" ASC',
'SELECT "t".* FROM "node_revision__field_tags" "t" WHERE ("revision_id" IN ("75")) AND ("deleted" = 0) AND ("langcode" IN ("en", "es", "und", "zxx")) ORDER BY "delta" ASC',
'SELECT "t".* FROM "node_revision__layout_builder__layout" "t" WHERE ("revision_id" IN ("75")) AND ("deleted" = 0) AND ("langcode" IN ("en", "es", "und", "zxx")) ORDER BY "delta" ASC',
'SELECT "base_table"."id" AS "id", "base_table"."path" AS "path", "base_table"."alias" AS "alias", "base_table"."langcode" AS "langcode" FROM "path_alias" "base_table" WHERE ("base_table"."status" = 1) AND ("base_table"."alias" LIKE "/recipes" ESCAPE \'\\\\\') AND ("base_table"."langcode" IN ("en", "und")) ORDER BY "base_table"."langcode" ASC, "base_table"."id" DESC',
'SELECT "base_table"."id" AS "id", "base_table"."path" AS "path", "base_table"."alias" AS "alias", "base_table"."langcode" AS "langcode" FROM "path_alias" "base_table" WHERE ("base_table"."status" = 1) AND ("base_table"."alias" LIKE "/node" ESCAPE \'\\\\\') AND ("base_table"."langcode" IN ("en", "und")) ORDER BY "base_table"."langcode" ASC, "base_table"."id" DESC',
'SELECT "menu_tree"."menu_name" AS "menu_name", "menu_tree"."route_name" AS "route_name", "menu_tree"."route_parameters" AS "route_parameters", "menu_tree"."url" AS "url", "menu_tree"."title" AS "title", "menu_tree"."description" AS "description", "menu_tree"."parent" AS "parent", "menu_tree"."weight" AS "weight", "menu_tree"."options" AS "options", "menu_tree"."expanded" AS "expanded", "menu_tree"."enabled" AS "enabled", "menu_tree"."provider" AS "provider", "menu_tree"."metadata" AS "metadata", "menu_tree"."class" AS "class", "menu_tree"."form_class" AS "form_class", "menu_tree"."id" AS "id" FROM "menu_tree" "menu_tree" WHERE ("route_name" = "entity.node.canonical") AND ("route_param_key" = "node=1") AND ("menu_name" = "footer") ORDER BY "depth" ASC, "weight" ASC, "id" ASC',
'INSERT INTO "semaphore" ("name", "value", "expire") VALUES ("theme_registry:runtime:umami:Drupal\Core\Utility\ThemeRegistry", "LOCK_ID", "EXPIRE")',
'DELETE FROM "semaphore" WHERE ("name" = "theme_registry:runtime:umami:Drupal\Core\Utility\ThemeRegistry") AND ("value" = "LOCK_ID")',
'INSERT INTO "semaphore" ("name", "value", "expire") VALUES ("active-trail:route:entity.node.canonical:route_parameters:a:1:{s:4:"node";s:1:"1";}:Drupal\Core\Cache\CacheCollector", "LOCK_ID", "EXPIRE")',
......@@ -288,7 +288,7 @@ protected function testNodePageWarmCache(): void {
$expected = [
'QueryCount' => 172,
'CacheGetCount' => 247,
'CacheGetCount' => 253,
'CacheGetCountByBin' => [
'page' => 1,
'config' => 66,
......@@ -297,14 +297,14 @@ protected function testNodePageWarmCache(): void {
'entity' => 18,
'bootstrap' => 8,
'dynamic_page_cache' => 2,
'render' => 67,
'render' => 73,
'default' => 3,
'menu' => 2,
],
'CacheSetCount' => 41,
'CacheDeleteCount' => 0,
'CacheTagInvalidationCount' => 0,
'CacheTagLookupQueryCount' => 28,
'CacheTagLookupQueryCount' => 27,
'CacheTagGroupedLookups' => [
[
'entity_types',
......@@ -360,12 +360,6 @@ protected function testNodePageWarmCache(): void {
['config:block.block.umami_main_menu', 'config:system.menu.main'],
['config:block.block.umami_messages'],
['config:block.block.umami_help'],
[
'config:block.block.umami_local_tasks',
'config:workflows.workflow.editorial',
],
['config:views.view.recipes'],
['config:block.block.umami_breadcrumbs'],
[
'config:block.block.umami_views_block__recipe_collections_block',
'taxonomy_term:1',
......@@ -401,8 +395,10 @@ protected function testNodePageWarmCache(): void {
'block_content:1',
'config:block.block.umami_banner_home',
'config:block.block.umami_banner_recipes',
'config:block.block.umami_breadcrumbs',
'config:block.block.umami_content',
'config:block.block.umami_languageswitcher',
'config:block.block.umami_local_tasks',
'config:block.block.umami_page_title',
'config:block.block.umami_views_block__articles_aside_block_1',
'config:block.block.umami_views_block__promoted_items_block_1',
......@@ -410,6 +406,8 @@ protected function testNodePageWarmCache(): void {
'config:configurable_language_list',
'http_response',
],
['config:views.view.recipes'],
['config:workflows.workflow.editorial'],
['config:user.role.anonymous'],
],
'ScriptCount' => 1,
......
......@@ -35,15 +35,13 @@ public function testBigPipe(): void {
->setPublished();
$node->save();
// Front page: one placeholder, for messages.
// Front page: Five placeholders.
$this->drupalGet('');
$this->assertBigPipePlaceholderReplacementCount(1);
$this->assertBigPipePlaceholderReplacementCount(5);
// Node page: 2 placeholders:
// 1. messages
// 2. comment form
// Node page: Six placeholders:
$this->drupalGet($node->toUrl());
$this->assertBigPipePlaceholderReplacementCount(2);
$this->assertBigPipePlaceholderReplacementCount(6);
}
/**
......
......@@ -127,7 +127,7 @@ protected function testAnonymous(): void {
$this->assertSame($expected_queries, $recorded_queries);
$expected = [
'QueryCount' => 36,
'CacheGetCount' => 122,
'CacheGetCount' => 132,
'CacheGetCountByBin' => [
'page' => 1,
'config' => 21,
......@@ -135,7 +135,7 @@ protected function testAnonymous(): void {
'discovery' => 38,
'bootstrap' => 8,
'dynamic_page_cache' => 2,
'render' => 35,
'render' => 45,
'default' => 5,
'entity' => 2,
'menu' => 2,
......@@ -143,7 +143,7 @@ protected function testAnonymous(): void {
'CacheSetCount' => 45,
'CacheDeleteCount' => 0,
'CacheTagInvalidationCount' => 0,
'CacheTagLookupQueryCount' => 21,
'CacheTagLookupQueryCount' => 17,
'CacheTagGroupedLookups' => [
[
'route_match',
......@@ -174,17 +174,17 @@ protected function testAnonymous(): void {
['config:block.block.stark_main_menu', 'config:system.menu.main'],
['config:block.block.stark_search_form_wide'],
['config:block.block.stark_account_menu', 'config:system.menu.account'],
['config:block.block.stark_breadcrumbs'],
['config:block.block.stark_primary_admin_actions'],
['config:block.block.stark_messages'],
['config:block.block.stark_primary_local_tasks'],
['config:block.block.stark_secondary_local_tasks'],
['config:block.block.stark_help'],
['config:block.block.stark_powered'],
['config:block.block.stark_syndicate'],
[
'config:block.block.stark_breadcrumbs',
'config:block.block.stark_content',
'config:block.block.stark_page_title',
'config:block.block.stark_primary_admin_actions',
'config:block.block.stark_primary_local_tasks',
'config:block.block.stark_secondary_local_tasks',
'config:block_list',
'http_response',
],
......@@ -225,11 +225,11 @@ protected function testAnonymous(): void {
$this->assertSame($expected_queries, $recorded_queries);
$expected = [
'QueryCount' => 10,
'CacheGetCount' => 92,
'CacheGetCount' => 102,
'CacheSetCount' => 16,
'CacheDeleteCount' => 0,
'CacheTagInvalidationCount' => 0,
'CacheTagLookupQueryCount' => 18,
'CacheTagLookupQueryCount' => 14,
'CacheTagGroupedLookups' => [
[
'route_match',
......@@ -257,17 +257,18 @@ protected function testAnonymous(): void {
['config:block.block.stark_main_menu', 'config:system.menu.main'],
['config:block.block.stark_search_form_wide'],
['config:block.block.stark_account_menu', 'config:system.menu.account'],
['config:block.block.stark_breadcrumbs'],
['config:block.block.stark_primary_admin_actions'],
['config:block.block.stark_messages'],
['config:block.block.stark_primary_local_tasks'],
['config:block.block.stark_secondary_local_tasks'],
['config:block.block.stark_help'],
['config:block.block.stark_powered'],
['config:block.block.stark_syndicate'],
[
'config:block.block.stark_breadcrumbs',
'config:block.block.stark_content',
'config:block.block.stark_page_title',
'config:block.block.stark_primary_admin_actions',
'config:block.block.stark_primary_local_tasks',
'config:block.block.stark_secondary_local_tasks',
'config:block_list',
'http_response',
],
......@@ -305,11 +306,11 @@ protected function testAnonymous(): void {
$this->assertSame($expected_queries, $recorded_queries);
$expected = [
'QueryCount' => 14,
'CacheGetCount' => 80,
'CacheGetCount' => 87,
'CacheSetCount' => 17,
'CacheDeleteCount' => 0,
'CacheTagInvalidationCount' => 0,
'CacheTagLookupQueryCount' => 16,
'CacheTagLookupQueryCount' => 13,
'StylesheetCount' => 1,
'StylesheetBytes' => 1950,
];
......@@ -360,7 +361,7 @@ protected function testLogin(): void {
$this->assertSame($expected_queries, $recorded_queries);
$expected = [
'QueryCount' => 17,
'CacheGetCount' => 84,
'CacheGetCount' => 83,
'CacheSetCount' => 1,
'CacheDeleteCount' => 1,
'CacheTagInvalidationCount' => 0,
......@@ -468,7 +469,7 @@ protected function testLoginBlock(): void {
$this->assertSame($expected_queries, $recorded_queries);
$expected = [
'QueryCount' => 18,
'CacheGetCount' => 103,
'CacheGetCount' => 105,
'CacheSetCount' => 1,
'CacheDeleteCount' => 1,
'CacheTagInvalidationCount' => 0,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment