67 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * @file
 | 
						|
 * Adds BigPipe no-JS detection.
 | 
						|
 */
 | 
						|
 | 
						|
use Drupal\big_pipe\Render\Placeholder\BigPipeStrategy;
 | 
						|
use Drupal\Core\Routing\RouteMatchInterface;
 | 
						|
use Drupal\Core\Url;
 | 
						|
 | 
						|
/**
 | 
						|
 * Implements hook_help().
 | 
						|
 */
 | 
						|
function big_pipe_help($route_name, RouteMatchInterface $route_match) {
 | 
						|
  switch ($route_name) {
 | 
						|
    case 'help.page.big_pipe':
 | 
						|
      $output = '<h3>' . t('About') . '</h3>';
 | 
						|
      $output .= '<p>' . t('The BigPipe module sends pages with dynamic content in a way that allows browsers to show them much faster. For more information, see the <a href=":big_pipe-documentation">online documentation for the BigPipe module</a>.', [':big_pipe-documentation' => 'https://www.drupal.org/documentation/modules/big_pipe']) . '</p>';
 | 
						|
      $output .= '<h3>' . t('Uses') . '</h3>';
 | 
						|
      $output .= '<dl>';
 | 
						|
      $output .= '<dt>' . t('Speeding up your site') . '</dt>';
 | 
						|
      $output .= '<dd>' . t('The module requires no configuration. Every part of the page contains metadata that allows BigPipe to figure this out on its own.') . '</dd>';
 | 
						|
      $output .= '</dl>';
 | 
						|
 | 
						|
      return $output;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Implements hook_page_attachments().
 | 
						|
 *
 | 
						|
 * @see \Drupal\big_pipe\Controller\BigPipeController::setNoJsCookie()
 | 
						|
 */
 | 
						|
function big_pipe_page_attachments(array &$page) {
 | 
						|
  // Routes that don't use BigPipe also don't need no-JS detection.
 | 
						|
  if (\Drupal::routeMatch()->getRouteObject()->getOption('_no_big_pipe')) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  $request = \Drupal::request();
 | 
						|
  // BigPipe is only used when there is an actual session, so only add the no-JS
 | 
						|
  // detection when there actually is a session.
 | 
						|
  // @see \Drupal\big_pipe\Render\Placeholder\BigPipeStrategy.
 | 
						|
  $session_exists = \Drupal::service('session_configuration')->hasSession($request);
 | 
						|
  $page['#cache']['contexts'][] = 'session.exists';
 | 
						|
  // Only do the no-JS detection while we don't know if there's no JS support:
 | 
						|
  // avoid endless redirect loops.
 | 
						|
  $has_big_pipe_nojs_cookie = $request->cookies->has(BigPipeStrategy::NOJS_COOKIE);
 | 
						|
  $page['#cache']['contexts'][] = 'cookies:' . BigPipeStrategy::NOJS_COOKIE;
 | 
						|
  if ($session_exists && !$has_big_pipe_nojs_cookie) {
 | 
						|
    $page['#attached']['html_head'][] = [
 | 
						|
      [
 | 
						|
        // Redirect through a 'Refresh' meta tag if JavaScript is disabled.
 | 
						|
        '#tag' => 'meta',
 | 
						|
        '#noscript' => TRUE,
 | 
						|
        '#attributes' => [
 | 
						|
          'http-equiv' => 'Refresh',
 | 
						|
          // @todo: Switch to Url::fromRoute() once https://www.drupal.org/node/2589967 is resolved.
 | 
						|
          'content' => '0; URL=' . Url::fromUri('internal:/big_pipe/no-js', ['query' => \Drupal::service('redirect.destination')->getAsArray()])->toString(),
 | 
						|
        ],
 | 
						|
      ],
 | 
						|
      'big_pipe_detect_nojs',
 | 
						|
    ];
 | 
						|
  }
 | 
						|
}
 |