Issue #2942600 by tim.plunkett: SectionComponent::toRenderArray() runs access checks even when not needed
parent
c924020c45
commit
97a4389997
|
@ -3,6 +3,7 @@
|
||||||
namespace Drupal\layout_builder;
|
namespace Drupal\layout_builder;
|
||||||
|
|
||||||
use Drupal\Component\Plugin\Exception\PluginException;
|
use Drupal\Component\Plugin\Exception\PluginException;
|
||||||
|
use Drupal\Core\Access\AccessResult;
|
||||||
use Drupal\Core\Block\BlockPluginInterface;
|
use Drupal\Core\Block\BlockPluginInterface;
|
||||||
use Drupal\Core\Cache\CacheableMetadata;
|
use Drupal\Core\Cache\CacheableMetadata;
|
||||||
use Drupal\Core\Plugin\ContextAwarePluginInterface;
|
use Drupal\Core\Plugin\ContextAwarePluginInterface;
|
||||||
|
@ -103,11 +104,18 @@ class SectionComponent {
|
||||||
// @todo Figure out the best way to unify fields and blocks and components
|
// @todo Figure out the best way to unify fields and blocks and components
|
||||||
// in https://www.drupal.org/node/1875974.
|
// in https://www.drupal.org/node/1875974.
|
||||||
if ($plugin instanceof BlockPluginInterface) {
|
if ($plugin instanceof BlockPluginInterface) {
|
||||||
$access = $plugin->access($this->currentUser(), TRUE);
|
$cacheability = CacheableMetadata::createFromObject($plugin);
|
||||||
$cacheability = CacheableMetadata::createFromObject($access);
|
|
||||||
|
|
||||||
if ($in_preview || $access->isAllowed()) {
|
// Only check access if the component is not being previewed.
|
||||||
$cacheability->addCacheableDependency($plugin);
|
if ($in_preview) {
|
||||||
|
$access = AccessResult::allowed()->setCacheMaxAge(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$access = $plugin->access($this->currentUser(), TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
$cacheability->addCacheableDependency($access);
|
||||||
|
if ($access->isAllowed()) {
|
||||||
// @todo Move this to BlockBase in https://www.drupal.org/node/2931040.
|
// @todo Move this to BlockBase in https://www.drupal.org/node/2931040.
|
||||||
$output = [
|
$output = [
|
||||||
'#theme' => 'block',
|
'#theme' => 'block',
|
||||||
|
|
|
@ -76,7 +76,6 @@ class LayoutSectionTest extends BrowserTestBase {
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'foobar',
|
'foobar',
|
||||||
'User context found',
|
|
||||||
],
|
],
|
||||||
'user',
|
'user',
|
||||||
'user:2',
|
'user:2',
|
||||||
|
|
|
@ -136,6 +136,9 @@ class SectionRenderTest extends UnitTestCase {
|
||||||
$access_result = AccessResult::forbidden();
|
$access_result = AccessResult::forbidden();
|
||||||
$block->access($this->account->reveal(), TRUE)->willReturn($access_result);
|
$block->access($this->account->reveal(), TRUE)->willReturn($access_result);
|
||||||
$block->build()->shouldNotBeCalled();
|
$block->build()->shouldNotBeCalled();
|
||||||
|
$block->getCacheContexts()->willReturn([]);
|
||||||
|
$block->getCacheTags()->willReturn([]);
|
||||||
|
$block->getCacheMaxAge()->willReturn(Cache::PERMANENT);
|
||||||
|
|
||||||
$section = [
|
$section = [
|
||||||
new SectionComponent('some_uuid', 'content', ['id' => 'block_plugin_id']),
|
new SectionComponent('some_uuid', 'content', ['id' => 'block_plugin_id']),
|
||||||
|
@ -155,6 +158,50 @@ class SectionRenderTest extends UnitTestCase {
|
||||||
$this->assertEquals($expected, $result);
|
$this->assertEquals($expected, $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers ::toRenderArray
|
||||||
|
*/
|
||||||
|
public function testToRenderArrayPreview() {
|
||||||
|
$block_content = ['#markup' => 'The block content.'];
|
||||||
|
$render_array = [
|
||||||
|
'#theme' => 'block',
|
||||||
|
'#weight' => 0,
|
||||||
|
'#configuration' => [],
|
||||||
|
'#plugin_id' => 'block_plugin_id',
|
||||||
|
'#base_plugin_id' => 'block_plugin_id',
|
||||||
|
'#derivative_plugin_id' => NULL,
|
||||||
|
'content' => $block_content,
|
||||||
|
'#cache' => [
|
||||||
|
'contexts' => [],
|
||||||
|
'tags' => [],
|
||||||
|
'max-age' => 0,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$block = $this->prophesize(BlockPluginInterface::class);
|
||||||
|
$this->blockManager->createInstance('block_plugin_id', ['id' => 'block_plugin_id'])->willReturn($block->reveal());
|
||||||
|
|
||||||
|
$block->access($this->account->reveal(), TRUE)->shouldNotBeCalled();
|
||||||
|
$block->build()->willReturn($block_content);
|
||||||
|
$block->getCacheContexts()->willReturn([]);
|
||||||
|
$block->getCacheTags()->willReturn([]);
|
||||||
|
$block->getCacheMaxAge()->willReturn(Cache::PERMANENT);
|
||||||
|
$block->getConfiguration()->willReturn([]);
|
||||||
|
$block->getPluginId()->willReturn('block_plugin_id');
|
||||||
|
$block->getBaseId()->willReturn('block_plugin_id');
|
||||||
|
$block->getDerivativeId()->willReturn(NULL);
|
||||||
|
|
||||||
|
$section = [
|
||||||
|
new SectionComponent('some_uuid', 'content', ['id' => 'block_plugin_id']),
|
||||||
|
];
|
||||||
|
$expected = [
|
||||||
|
'content' => [
|
||||||
|
'some_uuid' => $render_array,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
$result = (new Section('layout_onecol', [], $section))->toRenderArray([], TRUE);
|
||||||
|
$this->assertEquals($expected, $result);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @covers ::toRenderArray
|
* @covers ::toRenderArray
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue