From 44664acfa3a737d0290f48bfaa6b8323aeae965c Mon Sep 17 00:00:00 2001 From: Alex Pott Date: Wed, 21 Nov 2018 16:26:04 +0000 Subject: [PATCH] Issue #2948068 by drpal, dawehner, borisson_, ethomas08, lauriii, yoroy, tedbow: Placing and then removing a block appends incorrect query string destination parameter --- core/modules/block/js/block.admin.es6.js | 3 ++- core/modules/block/js/block.admin.js | 2 +- core/modules/block/src/BlockListBuilder.php | 17 +++++++++++++ .../block/tests/src/Functional/BlockTest.php | 24 +++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/core/modules/block/js/block.admin.es6.js b/core/modules/block/js/block.admin.es6.js index 197bc4beadd..ff4d8eb20df 100644 --- a/core/modules/block/js/block.admin.es6.js +++ b/core/modules/block/js/block.admin.es6.js @@ -93,7 +93,8 @@ */ Drupal.behaviors.blockHighlightPlacement = { attach(context, settings) { - if (settings.blockPlacement) { + // Ensure that the block we are attempting to scroll to actually exists. + if (settings.blockPlacement && $('.js-block-placed').length) { $(context) .find('[data-drupal-selector="edit-blocks"]') .once('block-highlight') diff --git a/core/modules/block/js/block.admin.js b/core/modules/block/js/block.admin.js index 7cafed16ac6..641f12d3f3a 100644 --- a/core/modules/block/js/block.admin.js +++ b/core/modules/block/js/block.admin.js @@ -41,7 +41,7 @@ Drupal.behaviors.blockHighlightPlacement = { attach: function attach(context, settings) { - if (settings.blockPlacement) { + if (settings.blockPlacement && $('.js-block-placed').length) { $(context).find('[data-drupal-selector="edit-blocks"]').once('block-highlight').each(function () { var $container = $(this); diff --git a/core/modules/block/src/BlockListBuilder.php b/core/modules/block/src/BlockListBuilder.php index c1ccc504dbc..d2286fcdd36 100644 --- a/core/modules/block/src/BlockListBuilder.php +++ b/core/modules/block/src/BlockListBuilder.php @@ -354,6 +354,23 @@ class BlockListBuilder extends ConfigEntityListBuilder implements FormInterface if (isset($operations['delete'])) { $operations['delete']['title'] = $this->t('Remove'); + // Block operation links should have the `block-placement` query string + // parameter removed to ensure that JavaScript does not receive a block + // name that has been recently removed. + foreach ($operations as $operation) { + /** @var \Drupal\Core\Url $url */ + $url = $operation['url']; + $query = $url->getOption('query'); + $destination = $query['destination']; + + $destinationUrl = Url::fromUserInput($destination); + $destinationQuery = $destinationUrl->getOption('query'); + unset($destinationQuery['block-placement']); + + $destinationUrl->setOption('query', $destinationQuery); + $query['destination'] = $destinationUrl->toString(); + $url->setOption('query', $query); + } } return $operations; } diff --git a/core/modules/block/tests/src/Functional/BlockTest.php b/core/modules/block/tests/src/Functional/BlockTest.php index 53b48662cd2..9fb33573c46 100644 --- a/core/modules/block/tests/src/Functional/BlockTest.php +++ b/core/modules/block/tests/src/Functional/BlockTest.php @@ -238,6 +238,30 @@ class BlockTest extends BlockTestBase { $this->assertNoRaw($block->id()); } + /** + * Tests the block operation links. + */ + public function testBlockOperationLinks() { + $this->drupalGet('admin/structure/block'); + // Go to the select block form. + $this->clickLink('Place block'); + // Select the first available block. + $this->clickLink('Place block'); + // Finally place the block + $this->submitForm([], 'Save block'); + + $url = $this->getUrl(); + $parsed = parse_url($url); + $this->assertContains('block-placement', $parsed['query']); + + $this->clickLink('Remove'); + $this->submitForm([], 'Remove'); + + $url = $this->getUrl(); + $parsed = parse_url($url); + $this->assertTrue(empty($parsed['query'])); + } + /** * Tests that the block form has a theme selector when not passed via the URL. */