Loading core/lib/Drupal/Core/Render/MainContent/DialogRenderer.php +17 −1 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ public function renderResponse(array $main_content, Request $request, RouteMatch $title = $main_content['#title'] ?? $this->titleResolver->getTitle($request, $route_match->getRouteObject()); // Determine the dialog options and the target for the OpenDialogCommand. $options = $request->request->all('dialogOptions'); $options = $this->getDialogOptions($request); $target = $this->determineTargetSelector($options, $route_match); $response->addCommand(new OpenDialogCommand($target, $title, $content, $options)); Loading Loading @@ -100,4 +100,20 @@ protected function determineTargetSelector(array &$options, RouteMatchInterface return $target; } /** * Returns the dialog options from request. * * @param \Symfony\Component\HttpFoundation\Request $request * The HTTP request. * * @return array * The dialog options used for OpenDialogCommand. */ protected function getDialogOptions(Request $request): array { if ($request->getMethod() === 'GET') { return $request->query->all('dialogOptions'); } return $request->request->all('dialogOptions'); } } core/lib/Drupal/Core/Render/MainContent/ModalRenderer.php +2 −3 Original line number Diff line number Diff line Loading @@ -29,9 +29,8 @@ public function renderResponse(array $main_content, Request $request, RouteMatch // If the main content doesn't provide a title, use the title resolver. $title = $main_content['#title'] ?? $this->titleResolver->getTitle($request, $route_match->getRouteObject()); // Determine the title: use the title provided by the main content if any, // otherwise get it from the routing information. $options = $request->request->all('dialogOptions'); // Determine the dialog options for the OpenDialogCommand. $options = $this->getDialogOptions($request); $response->addCommand(new OpenModalDialogCommand($title, $content, $options)); return $response; Loading core/modules/system/tests/modules/ajax_test/ajax_test.routing.yml +16 −0 Original line number Diff line number Diff line Loading @@ -129,3 +129,19 @@ ajax_test.throw_exception: _controller: '\Drupal\ajax_test\Controller\AjaxTestController::throwException' requirements: _access: 'TRUE' ajax_test.http_methods: path: '/ajax-test/http-methods' defaults: _controller: Drupal\ajax_test\Controller\AjaxTestController::httpMethods requirements: _access: 'TRUE' options: no_cache: TRUE ajax_test.http_methods.dialog: path: '/ajax-test/http-methods-dialog' defaults: _controller: Drupal\ajax_test\Controller\AjaxTestController::httpMethodsDialog requirements: _access: 'TRUE' core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php +38 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ namespace Drupal\ajax_test\Controller; use Drupal\Component\Serialization\Json; use Drupal\Core\Ajax\AjaxResponse; use Drupal\Core\Ajax\AlertCommand; use Drupal\Core\Ajax\CloseDialogCommand; Loading Loading @@ -419,4 +420,41 @@ public function exceptionLink() { ]; } /** * Provides an Ajax link used with different HTTP methods. * * @return array * The AJAX link. */ public function httpMethods(): array { return [ '#type' => 'link', '#title' => 'Link', '#url' => Url::fromRoute('ajax_test.http_methods.dialog'), '#attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', 'data-dialog-options' => Json::encode(['width' => 800]), // Use this state var to change the HTTP method in tests. // @see \Drupal\FunctionalJavascriptTests\Ajax\DialogTest::testHttpMethod() 'data-ajax-http-method' => \Drupal::state()->get('ajax_test.http_method', 'POST'), ], '#attached' => [ 'library' => [ 'core/drupal.dialog.ajax', ], ], ]; } /** * Provides a modal dialog to test links with different HTTP methods. * * @return array * The render array. */ public function httpMethodsDialog(): array { return ['#markup' => 'Modal dialog contents']; } } core/tests/Drupal/FunctionalJavascriptTests/Ajax/DialogTest.php +34 −0 Original line number Diff line number Diff line Loading @@ -188,4 +188,38 @@ public function testDialog() { $this->assertNotNull($form_title, 'The add form title is as expected.'); } /** * Tests dialog link opener with different HTTP methods. */ public function testHttpMethod(): void { $assert = $this->assertSession(); $script = <<<SCRIPT (function() { return document.querySelector('div[aria-describedby="drupal-modal"]').offsetWidth; }()) SCRIPT; // Open the modal dialog with POST HTTP method. $this->drupalGet('/ajax-test/http-methods'); $this->clickLink('Link'); $assert->assertWaitOnAjaxRequest(); $assert->pageTextContains('Modal dialog contents'); $width = $this->getSession()->getDriver()->evaluateScript($script); // The theme is adding 4px as padding and border on each side. $this->assertSame(808, $width); // Switch to GET HTTP method. // @see \Drupal\ajax_test\Controller\AjaxTestController::httpMethods() \Drupal::state()->set('ajax_test.http_method', 'GET'); // Open the modal dialog with GET HTTP method. $this->drupalGet('/ajax-test/http-methods'); $this->clickLink('Link'); $assert->assertWaitOnAjaxRequest(); $assert->pageTextContains('Modal dialog contents'); $width = $this->getSession()->getDriver()->evaluateScript($script); // The theme is adding 4px as padding and border on each side. $this->assertSame(808, $width); } } Loading
core/lib/Drupal/Core/Render/MainContent/DialogRenderer.php +17 −1 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ public function renderResponse(array $main_content, Request $request, RouteMatch $title = $main_content['#title'] ?? $this->titleResolver->getTitle($request, $route_match->getRouteObject()); // Determine the dialog options and the target for the OpenDialogCommand. $options = $request->request->all('dialogOptions'); $options = $this->getDialogOptions($request); $target = $this->determineTargetSelector($options, $route_match); $response->addCommand(new OpenDialogCommand($target, $title, $content, $options)); Loading Loading @@ -100,4 +100,20 @@ protected function determineTargetSelector(array &$options, RouteMatchInterface return $target; } /** * Returns the dialog options from request. * * @param \Symfony\Component\HttpFoundation\Request $request * The HTTP request. * * @return array * The dialog options used for OpenDialogCommand. */ protected function getDialogOptions(Request $request): array { if ($request->getMethod() === 'GET') { return $request->query->all('dialogOptions'); } return $request->request->all('dialogOptions'); } }
core/lib/Drupal/Core/Render/MainContent/ModalRenderer.php +2 −3 Original line number Diff line number Diff line Loading @@ -29,9 +29,8 @@ public function renderResponse(array $main_content, Request $request, RouteMatch // If the main content doesn't provide a title, use the title resolver. $title = $main_content['#title'] ?? $this->titleResolver->getTitle($request, $route_match->getRouteObject()); // Determine the title: use the title provided by the main content if any, // otherwise get it from the routing information. $options = $request->request->all('dialogOptions'); // Determine the dialog options for the OpenDialogCommand. $options = $this->getDialogOptions($request); $response->addCommand(new OpenModalDialogCommand($title, $content, $options)); return $response; Loading
core/modules/system/tests/modules/ajax_test/ajax_test.routing.yml +16 −0 Original line number Diff line number Diff line Loading @@ -129,3 +129,19 @@ ajax_test.throw_exception: _controller: '\Drupal\ajax_test\Controller\AjaxTestController::throwException' requirements: _access: 'TRUE' ajax_test.http_methods: path: '/ajax-test/http-methods' defaults: _controller: Drupal\ajax_test\Controller\AjaxTestController::httpMethods requirements: _access: 'TRUE' options: no_cache: TRUE ajax_test.http_methods.dialog: path: '/ajax-test/http-methods-dialog' defaults: _controller: Drupal\ajax_test\Controller\AjaxTestController::httpMethodsDialog requirements: _access: 'TRUE'
core/modules/system/tests/modules/ajax_test/src/Controller/AjaxTestController.php +38 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ namespace Drupal\ajax_test\Controller; use Drupal\Component\Serialization\Json; use Drupal\Core\Ajax\AjaxResponse; use Drupal\Core\Ajax\AlertCommand; use Drupal\Core\Ajax\CloseDialogCommand; Loading Loading @@ -419,4 +420,41 @@ public function exceptionLink() { ]; } /** * Provides an Ajax link used with different HTTP methods. * * @return array * The AJAX link. */ public function httpMethods(): array { return [ '#type' => 'link', '#title' => 'Link', '#url' => Url::fromRoute('ajax_test.http_methods.dialog'), '#attributes' => [ 'class' => ['use-ajax'], 'data-dialog-type' => 'modal', 'data-dialog-options' => Json::encode(['width' => 800]), // Use this state var to change the HTTP method in tests. // @see \Drupal\FunctionalJavascriptTests\Ajax\DialogTest::testHttpMethod() 'data-ajax-http-method' => \Drupal::state()->get('ajax_test.http_method', 'POST'), ], '#attached' => [ 'library' => [ 'core/drupal.dialog.ajax', ], ], ]; } /** * Provides a modal dialog to test links with different HTTP methods. * * @return array * The render array. */ public function httpMethodsDialog(): array { return ['#markup' => 'Modal dialog contents']; } }
core/tests/Drupal/FunctionalJavascriptTests/Ajax/DialogTest.php +34 −0 Original line number Diff line number Diff line Loading @@ -188,4 +188,38 @@ public function testDialog() { $this->assertNotNull($form_title, 'The add form title is as expected.'); } /** * Tests dialog link opener with different HTTP methods. */ public function testHttpMethod(): void { $assert = $this->assertSession(); $script = <<<SCRIPT (function() { return document.querySelector('div[aria-describedby="drupal-modal"]').offsetWidth; }()) SCRIPT; // Open the modal dialog with POST HTTP method. $this->drupalGet('/ajax-test/http-methods'); $this->clickLink('Link'); $assert->assertWaitOnAjaxRequest(); $assert->pageTextContains('Modal dialog contents'); $width = $this->getSession()->getDriver()->evaluateScript($script); // The theme is adding 4px as padding and border on each side. $this->assertSame(808, $width); // Switch to GET HTTP method. // @see \Drupal\ajax_test\Controller\AjaxTestController::httpMethods() \Drupal::state()->set('ajax_test.http_method', 'GET'); // Open the modal dialog with GET HTTP method. $this->drupalGet('/ajax-test/http-methods'); $this->clickLink('Link'); $assert->assertWaitOnAjaxRequest(); $assert->pageTextContains('Modal dialog contents'); $width = $this->getSession()->getDriver()->evaluateScript($script); // The theme is adding 4px as padding and border on each side. $this->assertSame(808, $width); } }