Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 41 |
JsCollectionRenderer | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
182 | |
0.00% |
0 / 41 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
render | |
0.00% |
0 / 1 |
156 | |
0.00% |
0 / 39 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Asset\JsCollectionRenderer. | |
*/ | |
namespace Drupal\Core\Asset; | |
use Drupal\Component\Serialization\Json; | |
use Drupal\Core\State\StateInterface; | |
/** | |
* Renders JavaScript assets. | |
*/ | |
class JsCollectionRenderer implements AssetCollectionRendererInterface { | |
/** | |
* The state key/value store. | |
* | |
* @var \Drupal\Core\State\StateInterface | |
*/ | |
protected $state; | |
/** | |
* Constructs a JsCollectionRenderer. | |
* | |
* @param \Drupal\Core\State\StateInterface | |
* The state key/value store. | |
*/ | |
public function __construct(StateInterface $state) { | |
$this->state = $state; | |
} | |
/** | |
* {@inheritdoc} | |
* | |
* This class evaluates the aggregation enabled/disabled condition on a group | |
* by group basis by testing whether an aggregate file has been made for the | |
* group rather than by testing the site-wide aggregation setting. This allows | |
* this class to work correctly even if modules have implemented custom | |
* logic for grouping and aggregating files. | |
*/ | |
public function render(array $js_assets) { | |
$elements = array(); | |
// A dummy query-string is added to filenames, to gain control over | |
// browser-caching. The string changes on every update or full cache | |
// flush, forcing browsers to load a new copy of the files, as the | |
// URL changed. Files that should not be cached get REQUEST_TIME as | |
// query-string instead, to enforce reload on every page request. | |
$default_query_string = $this->state->get('system.css_js_query_string') ?: '0'; | |
// Defaults for each SCRIPT element. | |
$element_defaults = array( | |
'#type' => 'html_tag', | |
'#tag' => 'script', | |
'#value' => '', | |
); | |
// Loop through all JS assets. | |
foreach ($js_assets as $js_asset) { | |
// Element properties that do not depend on JS asset type. | |
$element = $element_defaults; | |
$element['#browsers'] = $js_asset['browsers']; | |
// Element properties that depend on item type. | |
switch ($js_asset['type']) { | |
case 'setting': | |
$element['#attributes'] = array( | |
// This type attribute prevents this from being parsed as an | |
// inline script. | |
'type' => 'application/json', | |
'data-drupal-selector' => 'drupal-settings-json', | |
); | |
$element['#value'] = Json::encode($js_asset['data']); | |
break; | |
case 'file': | |
$query_string = $js_asset['version'] == -1 ? $default_query_string : 'v=' . $js_asset['version']; | |
$query_string_separator = (strpos($js_asset['data'], '?') !== FALSE) ? '&' : '?'; | |
$element['#attributes']['src'] = file_url_transform_relative(file_create_url($js_asset['data'])); | |
// Only add the cache-busting query string if this isn't an aggregate | |
// file. | |
if (!isset($js_asset['preprocessed'])) { | |
$element['#attributes']['src'] .= $query_string_separator . ($js_asset['cache'] ? $query_string : REQUEST_TIME); | |
} | |
break; | |
case 'external': | |
$element['#attributes']['src'] = $js_asset['data']; | |
break; | |
default: | |
throw new \Exception('Invalid JS asset type.'); | |
} | |
// Attributes may only be set if this script is output independently. | |
if (!empty($element['#attributes']['src']) && !empty($js_asset['attributes'])) { | |
$element['#attributes'] += $js_asset['attributes']; | |
} | |
$elements[] = $element; | |
} | |
return $elements; | |
} | |
} |