Revert "Issue #2510104 by pwolanin, nod_, Fabianx, Wim Leers, droplet, Pere Orga: Convert drupalSettings from JavaScript to JSON, to allow for CSP in the future"

This reverts commit 94615a137b.
8.0.x
Alex Pott 2015-07-23 10:13:45 +01:00
parent 341f0e4c92
commit e8e883f9c8
6 changed files with 22 additions and 40 deletions

View File

@ -52,10 +52,6 @@ drupal:
drupalSettings:
version: VERSION
js:
# Need to specify a negative weight like drupal.js until
# https://www.drupal.org/node/1945262 is resolved.
misc/drupalSettingsLoader.js: { weight: -18 }
drupalSettings:
# These placeholder values will be set by system_js_settings_alter().
path:

View File

@ -51,6 +51,12 @@ class JsCollectionRenderer implements AssetCollectionRendererInterface {
// query-string instead, to enforce reload on every page request.
$default_query_string = $this->state->get('system.css_js_query_string') ?: '0';
// For inline JavaScript to validate as XHTML, all JavaScript containing
// XHTML needs to be wrapped in CDATA. To make that backwards compatible
// with HTML 4, we need to comment out the CDATA-tag.
$embed_prefix = "\n<!--//--><![CDATA[//><!--\n";
$embed_suffix = "\n//--><!]]>\n";
// Defaults for each SCRIPT element.
$element_defaults = array(
'#type' => 'html_tag',
@ -67,13 +73,9 @@ class JsCollectionRenderer implements AssetCollectionRendererInterface {
// 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']);
$element['#value_prefix'] = $embed_prefix;
$element['#value'] = 'var drupalSettings = ' . Json::encode($js_asset['data']) . ";";
$element['#value_suffix'] = $embed_suffix;
break;
case 'file':

View File

@ -11,6 +11,14 @@
* @prop {number} length=0
*/
/**
* Variable generated by Drupal with all the configuration created from PHP.
*
* @global
*
* @var {object} drupalSettings
*/
/**
* Variable generated by Drupal that holds all translated strings from PHP.
*

View File

@ -1,24 +0,0 @@
/**
* @file
* Parse inline JSON and initialize the drupalSettings global object.
*/
(function () {
"use strict";
var settingsElement = document.querySelector('script[type="application/json"][data-drupal-selector="drupal-settings-json"]');
/**
* Variable generated by Drupal with all the configuration created from PHP.
*
* @global
*
* @type {object}
*/
window.drupalSettings = {};
if (settingsElement !== null) {
window.drupalSettings = JSON.parse(settingsElement.textContent);
}
})();

View File

@ -66,7 +66,7 @@ trait AssertContentTrait {
$this->plainTextContent = NULL;
$this->elements = NULL;
$this->drupalSettings = array();
if (preg_match('@<script type="application/json" data-drupal-selector="drupal-settings-json">([^<]*)</script>@', $content, $matches)) {
if (preg_match('/var drupalSettings = (.*?);$/m', $content, $matches)) {
$this->drupalSettings = Json::decode($matches[1]);
}
}

View File

@ -185,9 +185,9 @@ class AttachedAssetsTest extends KernelTestBase {
$rendered_footer_js = \Drupal::service('asset.js.collection_renderer')->render($footer_js);
$this->assertTrue(
count($rendered_footer_js) == 2
&& $rendered_footer_js[0]['#attributes']['data-drupal-selector'] === 'drupal-settings-json'
&& substr($rendered_footer_js[0]['#value'], 0, 20) === 'var drupalSettings ='
&& substr($rendered_footer_js[1]['#attributes']['src'], 0, 7) === 'http://',
'There are 2 JavaScript assets in the footer: one with drupal settings, one with the sole aggregated JavaScript asset.'
'There are 2 JavaScript assets in the footer: one with drupalSettings, one with the sole aggregated JavaScript asset.'
);
}
@ -206,9 +206,9 @@ class AttachedAssetsTest extends KernelTestBase {
$rendered_js = $this->renderer->renderPlain($js_render_array);
// Parse the generated drupalSettings <script> back to a PHP representation.
$startToken = '{';
$startToken = 'drupalSettings = ';
$endToken = '}';
$start = strpos($rendered_js, $startToken);
$start = strpos($rendered_js, $startToken) + strlen($startToken);
$end = strrpos($rendered_js, $endToken);
$json = Unicode::substr($rendered_js, $start, $end - $start + 1);
$parsed_settings = Json::decode($json);