diff --git a/js/refreshless.js b/js/refreshless.js index f73718f..78fca8e 100644 --- a/js/refreshless.js +++ b/js/refreshless.js @@ -11,7 +11,7 @@ // Tracks the current position in the History API. // @todo Make this not be a global. - var currentPos = null; + var currentPos = NULL; /** * @typedef {object} Url @@ -118,9 +118,9 @@ var url = new Url(navigationUrl); this.absoluteUrl = url.absoluteUrl; this.requestUrl = url.requestUrl; - this.fragment = url.fragment ? url.fragment : false; + this.fragment = url.fragment ? url.fragment : FALSE; // For type = inter only. - this.content = null; + this.content = NULL; } State.prototype.getId = function () { return State.getIdForPos(this.pos); @@ -130,7 +130,7 @@ }; State.prototype.store = function (method) { storage.setItem(this.getId(), JSON.stringify(this)); - history[method + 'State'](this.getId(), null, this.absoluteUrl); + history[method + 'State'](this.getId(), NULL, this.absoluteUrl); }; /** @@ -207,10 +207,10 @@ fakeResponse.unshift({ command: 'settings', settings: settingsWithAdditiveLibraries, - merge: true + merge: TRUE }); ajaxObject.success(fakeResponse, 'success'); - debugInterState(false); + debugInterState(FALSE); } }; @@ -342,7 +342,7 @@ currentPos = history.length - 1; var root = storage.getItem('Drupal.refreshless.root'); - if (root === null) { + if (root === NULL) { root = currentPos; storage.setItem('Drupal.refreshless.root', root); } @@ -353,7 +353,7 @@ if (root === currentPos) { var rootState = new State(root, 'inter', window.location); rootState.content = buildPageStateContent([], buildRootResponse(), drupalSettings); - rootState.root = true; + rootState.root = TRUE; rootState.store('replace'); } }; @@ -408,7 +408,7 @@ state.content = buildPageStateContent(librariesBefore, response, drupalSettings); state.store('push'); currentPos++; - debugInterState(true); + debugInterState(TRUE); scrollToTop(target.fragment); }; @@ -490,10 +490,10 @@ // progress indicator or a URL. var ajaxObject = Drupal.ajax({ url: url, - base: false, - element: false, + base: FALSE, + element: FALSE, // @todo refreshless progress? - progress: false, + progress: FALSE, dialogType: 'refreshless' }); var ajaxInstanceIndex = Drupal.ajax.instances.length; @@ -528,7 +528,7 @@ // Set this to null and allow garbage collection to reclaim // the memory. - Drupal.ajax.instances[ajaxInstanceIndex] = null; + Drupal.ajax.instances[ajaxInstanceIndex] = NULL; }; // Pass Refreshless' page state, to allow the server to determine which diff --git a/refreshless.services.yml b/refreshless.services.yml index 1d16139..8142372 100644 --- a/refreshless.services.yml +++ b/refreshless.services.yml @@ -20,6 +20,6 @@ services: main_content_renderer.refreshless: class: Drupal\refreshless\Render\MainContent\RefreshlessRenderer - arguments: ['@main_content_renderer.html', '@refreshless.page_state', '@html_response.attachments_processor'] + arguments: ['@main_content_renderer.html','@renderer', '@refreshless.page_state', '@html_response.attachments_processor','@theme.manager','@theme_handler','@csrf_token','@render_cache'] tags: - { name: render.main_content_renderer, format: drupal_refreshless } diff --git a/src/Ajax/RefreshlessUpdateHtmlHeadCommand.php b/src/Ajax/RefreshlessUpdateHtmlHeadCommand.php index 066c722..e1c692b 100644 --- a/src/Ajax/RefreshlessUpdateHtmlHeadCommand.php +++ b/src/Ajax/RefreshlessUpdateHtmlHeadCommand.php @@ -7,8 +7,8 @@ use Drupal\Core\Ajax\CommandInterface; /** * AJAX command for updating the HTML . * - * Note that this does not touch CSS or JS in : for those, the AJAX - * system has separate commands, we don't need to do anything about that. + * Note that this does not touch CSS or JS in : for those, the AJAX + * system has separate commands, we don't need to do anything about that. * This is for everything in *except* CSS and JS. * * @see \Drupal\Core\Ajax\AjaxResponseAttachmentsProcessor::buildAttachmentsCommands() diff --git a/src/Render/MainContent/RefreshlessRenderer.php b/src/Render/MainContent/RefreshlessRenderer.php index f3cd23b..a365a55 100644 --- a/src/Render/MainContent/RefreshlessRenderer.php +++ b/src/Render/MainContent/RefreshlessRenderer.php @@ -14,6 +14,11 @@ use Drupal\refreshless\Ajax\RefreshlessUpdateRegionCommand; use Drupal\refreshless\RefreshlessPageState; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException; +use Drupal\Core\Render\RendererInterface; +use Drupal\Core\Theme\ThemeManagerInterface; +use Drupal\Core\Extension\ThemeHandlerInterface; +use Drupal\Core\Access\CsrfTokenGenerator; +use Drupal\Core\Render\RenderCacheInterface; /** * Default main content renderer for Refreshless requests. @@ -40,16 +45,60 @@ class RefreshlessRenderer implements MainContentRendererInterface { */ protected $htmlResponseAttachmentsProcessor; + /** + * The renderer service. + * + * @var \Drupal\Core\Render\RendererInterface + */ + protected $renderer; + + /** + * The theme manager. + * + * @var \Drupal\Core\Theme\ThemeManagerInterface + */ + protected $themeManager; + + /** + * The theme handler. + * + * @var \Drupal\Core\Extension\ThemeHandlerInterface + */ + protected $themeHandler; + + /** + * The CSRF token generator. + * + * @var \Drupal\Core\Access\CsrfTokenGenerator + */ + protected $csrfToken; + + /** + * The render cache. + * + * @var \Drupal\Core\Render\RenderCacheInterface + */ + protected $renderCache; + /** * {@inheritdoc} */ public function __construct(MainContentRendererInterface $html_renderer, + RendererInterface $renderer, RefreshlessPageState $refreshless_page_state, - AttachmentsResponseProcessorInterface $html_response_attachments_processor) { + AttachmentsResponseProcessorInterface $html_response_attachments_processor, + ThemeManagerInterface $theme_manager, + ThemeHandlerInterface $theme_handler, + CsrfTokenGenerator $csrf_token, + RenderCacheInterface $render_cache) { $this->htmlRenderer = $html_renderer; - $this->renderer = \Drupal::service('renderer'); + $this->renderer = $renderer; $this->refreshlessPageState = $refreshless_page_state; $this->htmlResponseAttachmentsProcessor = $html_response_attachments_processor; + $this->themeManager = $theme_manager; + $this->themeHandler = $theme_handler; + $this->csrfToken = $csrf_token; + $this->renderCache = $render_cache; } /** @@ -63,9 +112,9 @@ class RefreshlessRenderer implements MainContentRendererInterface { // The theme token is only validated when the theme requested is not the // default, so don't generate it unless necessary. // @see \Drupal\Core\Theme\AjaxBasePageNegotiator::determineActiveTheme() - $active_theme_key = \Drupal::theme()->getActiveTheme()->getName(); - if ($active_theme_key !== \Drupal::service('theme_handler')->getDefault()) { - $theme_token = \Drupal::csrfToken()->get($active_theme_key); + $active_theme_key = $this->themeManager->getActiveTheme()->getName(); + if ($active_theme_key !== $this->themeHandler->getDefault()) { + $theme_token = $this->csrfToken->get($active_theme_key); } else { $theme_token = ''; @@ -84,11 +133,11 @@ class RefreshlessRenderer implements MainContentRendererInterface { throw new PreconditionFailedHttpException(); } - list($page, $title) = $this->htmlRenderer->prepare($main_content, $request, $route_match); + [$page, $title] = $this->htmlRenderer->prepare($main_content, $request, $route_match); // Render each region separately and determine whether it has changed. $response = new AjaxResponse(); - $regions = \Drupal::theme()->getActiveTheme()->getRegions(); + $regions = $this->themeManager->getActiveTheme()->getRegions(); // Start with page-level HTML attachments and cacheability. $metadata = BubbleableMetadata::createFromRenderArray($page); foreach ($regions as $region) { @@ -102,7 +151,7 @@ class RefreshlessRenderer implements MainContentRendererInterface { $this->renderer->renderRoot($page[$region]); $region_metadata = BubbleableMetadata::createFromRenderArray($page[$region]); if ($this->refreshlessPageState->hasChanged($region_metadata, $request)) { - $response->addCommand(new RefreshlessUpdateRegionCommand($region, \Drupal::service('render_cache')->getCacheableRenderArray($page[$region]))); + $response->addCommand(new RefreshlessUpdateRegionCommand($region, $this->renderCache->getCacheableRenderArray($page[$region]))); } $metadata = $metadata->merge($region_metadata);