diff --git a/core/core.services.yml b/core/core.services.yml index f91e5976f3..4c4e49bc0b 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -1150,6 +1150,10 @@ services: tags: - { name: event_subscriber } arguments: ['@resolver_manager.entity'] + ajax.ajax_page_state_listener: + class: Drupal\Core\Ajax\AjaxPageStateSubscriber + tags: + - { name: 'event_subscriber' } ajax_response.subscriber: class: Drupal\Core\EventSubscriber\AjaxResponseSubscriber arguments: ['@ajax_response.attachments_processor'] diff --git a/core/lib/Drupal/Core/Ajax/AjaxPageStateSubscriber.php b/core/lib/Drupal/Core/Ajax/AjaxPageStateSubscriber.php new file mode 100644 index 0000000000..a20100e3de --- /dev/null +++ b/core/lib/Drupal/Core/Ajax/AjaxPageStateSubscriber.php @@ -0,0 +1,44 @@ +getRequest(); + // AJAX page state is only compressed on GET requests. + if ($request->getMethod() === 'GET') { + $ajax_page_state = $request->get('ajax_page_state'); + if ($ajax_page_state) { + $ajax_page_state = json_decode(UrlHelper::uncompressQueryParameter($ajax_page_state), TRUE); + if (is_array($ajax_page_state)) { + $request->request->set('ajax_page_state', $ajax_page_state); + $request->query->set('ajax_page_state', $ajax_page_state); + } + } + } + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents(): array { + $events[KernelEvents::REQUEST][] = ['onRequest']; + return $events; + } + +} diff --git a/core/lib/Drupal/Core/Asset/AssetResolver.php b/core/lib/Drupal/Core/Asset/AssetResolver.php index 42b51c39d8..0eaf6e8dee 100644 --- a/core/lib/Drupal/Core/Asset/AssetResolver.php +++ b/core/lib/Drupal/Core/Asset/AssetResolver.php @@ -4,6 +4,7 @@ use Drupal\Component\Utility\Crypt; use Drupal\Component\Utility\NestedArray; +use Drupal\Component\Utility\UrlHelper; use Drupal\Core\Cache\CacheBackendInterface; use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Language\LanguageManagerInterface; @@ -325,6 +326,11 @@ public function getJsAssets(AttachedAssetsInterface $assets, $optimize, Language // Update the $assets object accordingly, so that it reflects the final // settings. $assets->setSettings($settings); + // Convert ajaxPageState to a compressed string from an array, since it is + // used by ajax.js to pass to AJAX requests as a query parameter. + if (isset($settings['ajaxPageState'])) { + $settings['ajaxPageState'] = UrlHelper::compressQueryParameter(json_encode($settings['ajaxPageState'])); + } $settings_as_inline_javascript = [ 'type' => 'setting', 'group' => JS_SETTING, diff --git a/core/misc/ajax.js b/core/misc/ajax.js index 32d8cf08ac..bf6ffa4a81 100644 --- a/core/misc/ajax.js +++ b/core/misc/ajax.js @@ -827,10 +827,7 @@ // @see \Drupal\Core\Theme\AjaxBasePageNegotiator // @see \Drupal\Core\Asset\LibraryDependencyResolverInterface::getMinimalRepresentativeSubset() // @see system_js_settings_alter() - const pageState = drupalSettings.ajaxPageState; - options.data['ajax_page_state[theme]'] = pageState.theme; - options.data['ajax_page_state[theme_token]'] = pageState.theme_token; - options.data['ajax_page_state[libraries]'] = pageState.libraries; + options.data.ajax_page_state = drupalSettings.ajaxPageState; }; /**