diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc index 8235b9f94c2..3f2a085b289 100644 --- a/core/includes/bootstrap.inc +++ b/core/includes/bootstrap.inc @@ -2564,7 +2564,7 @@ function drupal_fast_404() { $fast_paths = variable_get('404_fast_paths', FALSE); if ($fast_paths && preg_match($fast_paths, request_path())) { drupal_add_http_header('Status', '404 Not Found'); - $fast_404_html = variable_get('404_fast_html', '404 Not Found

Not Found

The requested URL "@path" was not found on this server.

'); + $fast_404_html = variable_get('404_fast_html', '404 Not Found

Not Found

The requested URL "@path" was not found on this server.

'); // Replace @path in the variable with the page path. print strtr($fast_404_html, array('@path' => check_plain(request_uri()))); exit; diff --git a/core/includes/common.inc b/core/includes/common.inc index e7ebd1f4cdd..d0e9a2fd3d4 100644 --- a/core/includes/common.inc +++ b/core/includes/common.inc @@ -76,6 +76,11 @@ const CSS_DEFAULT = 0; */ const CSS_THEME = 100; +/** + * The default group for JavaScript settings added to the page. + */ +const JS_SETTING = -200; + /** * The default group for JavaScript and jQuery libraries added to the page. */ @@ -91,11 +96,6 @@ const JS_DEFAULT = 0; */ const JS_THEME = 100; -/** - * The default group for JavaScript settings added to the page. - */ -const JS_SETTING = 200; - /** * Error code indicating that the request exceeded the specified timeout. * @@ -3528,7 +3528,8 @@ function drupal_html_id($id) { // requested id. $_POST['ajax_html_ids'] contains the ids as they were // returned by this function, potentially with the appended counter, so // we parse that to reconstruct the $seen_ids array. - foreach ($_POST['ajax_html_ids'] as $seen_id) { + $ajax_html_ids = explode(' ', $_POST['ajax_html_ids']); + foreach ($ajax_html_ids as $seen_id) { // We rely on '--' being used solely for separating a base id from the // counter, which this function ensures when returning an id. $parts = explode('--', $seen_id, 2); @@ -4037,7 +4038,7 @@ function drupal_pre_render_scripts($elements) { switch ($item['type']) { case 'setting': $element['#value_prefix'] = $embed_prefix; - $element['#value'] = 'jQuery.extend(Drupal.settings, ' . drupal_json_encode(drupal_array_merge_deep_array($item['data'])) . ");"; + $element['#value'] = 'var drupalSettings = ' . drupal_json_encode(drupal_array_merge_deep_array($item['data'])) . ";"; $element['#value_suffix'] = $embed_suffix; break; diff --git a/core/includes/form.inc b/core/includes/form.inc index 29bce0019be..5f580fb4584 100644 --- a/core/includes/form.inc +++ b/core/includes/form.inc @@ -4590,7 +4590,7 @@ function _form_set_class(&$element, $class = array()) { $element['#attributes']['required'] = 'required'; $element['#attributes']['aria-required'] = 'true'; } - if (isset($element['#parents']) && form_get_error($element)) { + if (isset($element['#parents']) && form_get_error($element) !== NULL) { $element['#attributes']['class'][] = 'error'; } } diff --git a/core/misc/ajax.js b/core/misc/ajax.js index 94bfb890fb5..8e935ed266d 100644 --- a/core/misc/ajax.js +++ b/core/misc/ajax.js @@ -284,10 +284,13 @@ Drupal.ajax.prototype.beforeSerialize = function (element, options) { // Prevent duplicate HTML ids in the returned markup. // @see drupal_html_id() - options.data['ajax_html_ids[]'] = []; - $('[id]').each(function () { - options.data['ajax_html_ids[]'].push(this.id); - }); + var ids = document.querySelectorAll('[id]'); + var ajaxHtmlIds = []; + for (var i = 0, il = ids.length; i < il; i++) { + ajaxHtmlIds.push(ids[i].id); + } + // Join IDs to minimize request size. + options.data.ajax_html_ids = ajaxHtmlIds.join(' '); // Allow Drupal to return new JavaScript and CSS files to load without // returning the ones already loaded. diff --git a/core/misc/drupal.js b/core/misc/drupal.js index 8bbddc2370b..627e264a784 100644 --- a/core/misc/drupal.js +++ b/core/misc/drupal.js @@ -1,14 +1,17 @@ -var Drupal = Drupal || { 'settings': {}, 'behaviors': {}, 'locale': {} }; +var Drupal = Drupal || { 'behaviors': {}, 'locale': {} }; // Allow other JavaScript libraries to use $. jQuery.noConflict(); // JavaScript should be made compatible with libraries other than jQuery by // wrapping it in an anonymous closure. -(function ($, Drupal, window, document, undefined) { +(function ($, Drupal, drupalSettings) { "use strict"; +// Populate Drupal.settings with the drupalSettings variable. +Drupal.settings = drupalSettings; + /** * Custom error type thrown after attach/detach if one or more behaviors failed. * @@ -71,7 +74,7 @@ DrupalBehaviorError.prototype = new Error(); */ Drupal.attachBehaviors = function (context, settings) { context = context || document; - settings = settings || Drupal.settings; + settings = settings || drupalSettings; var i, errors = [], behaviors = Drupal.behaviors; // Execute all of them. for (i in behaviors) { @@ -133,7 +136,7 @@ Drupal.attachBehaviors = function (context, settings) { */ Drupal.detachBehaviors = function (context, settings, trigger) { context = context || document; - settings = settings || Drupal.settings; + settings = settings || drupalSettings; trigger = trigger || 'unload'; var i, errors = [], behaviors = Drupal.behaviors; // Execute all of them. @@ -159,7 +162,7 @@ Drupal.detachBehaviors = function (context, settings, trigger) { * @todo Temporary solution for the mobile initiative. */ Drupal.checkWidthBreakpoint = function (width) { - width = width || Drupal.settings.widthBreakpoint || 640; + width = width || drupalSettings.widthBreakpoint || 640; return (document.documentElement.clientWidth > width); }; @@ -259,7 +262,7 @@ Drupal.t = function (str, args, options) { * Returns the URL to a Drupal page. */ Drupal.url = function (path) { - return Drupal.settings.basePath + Drupal.settings.scriptPath + path; + return drupalSettings.basePath + drupalSettings.scriptPath + path; }; /** @@ -434,7 +437,7 @@ $('html').addClass('js'); //Attach all behaviors. $(function () { - Drupal.attachBehaviors(document, Drupal.settings); + Drupal.attachBehaviors(document, drupalSettings); }); /** @@ -455,4 +458,4 @@ $.extend(Drupal.theme, { } }); -})(jQuery, Drupal, this, this.document); +})(jQuery, Drupal, window.drupalSettings); diff --git a/core/modules/block/block.admin.inc b/core/modules/block/block.admin.inc index 848298f00d2..cc4bd716354 100644 --- a/core/modules/block/block.admin.inc +++ b/core/modules/block/block.admin.inc @@ -285,7 +285,8 @@ function block_admin_configure($form, &$form_state, $module, $delta) { $form['settings']['title'] = array( '#type' => 'textfield', '#title' => t('Block title'), - '#maxlength' => 64, + '#maxlength' => 255, + '#size' => 60, '#description' => $block->module == 'block' ? t('The title of the block as shown to the user.') : t('Override the default title for the block. Use !placeholder to display no title, or leave blank to use the default block title.', array('!placeholder' => '<none>')), '#default_value' => isset($block->title) ? $block->title : '', '#weight' => -19, diff --git a/core/modules/block/block.install b/core/modules/block/block.install index 4c5149b85fc..09ba522ca50 100644 --- a/core/modules/block/block.install +++ b/core/modules/block/block.install @@ -79,7 +79,7 @@ function block_schema() { ), 'title' => array( 'type' => 'varchar', - 'length' => 64, + 'length' => 255, 'not null' => TRUE, 'default' => '', 'description' => 'Custom title for the block. (Empty string will use block default title, will remove the title, text will cause block to use specified title.)', @@ -311,6 +311,21 @@ function block_update_8002() { ->execute(); } +/** + * Increase {block}.title length to 255 characters. + */ +function block_update_8003() { + db_change_field('block', 'title', 'title', array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + 'description' => 'Custom title for the block. (Empty string will use block default title, will remove the title, text will cause block to use specified title.)', + 'translatable' => TRUE, + ) + ); +} + /** * @} End of "addtogroup updates-7.x-to-8.x". * The next series of updates should start at 9000. diff --git a/core/modules/color/color.module b/core/modules/color/color.module index d4ca6ca554a..56c04cf4090 100644 --- a/core/modules/color/color.module +++ b/core/modules/color/color.module @@ -771,7 +771,7 @@ function color_library_info() { 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), - array('system', 'drupal.settings'), + array('system', 'drupalSettings'), array('system', 'jquery.once'), ), ); diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module index 63cf18bfed8..2efc07cf4eb 100644 --- a/core/modules/field_ui/field_ui.module +++ b/core/modules/field_ui/field_ui.module @@ -397,7 +397,7 @@ function field_ui_library_info() { 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), - array('system', 'drupal.settings'), + array('system', 'drupalSettings'), array('system', 'jquery.once'), ), ); diff --git a/core/modules/file/file.module b/core/modules/file/file.module index 447871b0710..0f6cb64738f 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -1710,7 +1710,7 @@ function file_library_info() { 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), - array('system', 'drupal.settings'), + array('system', 'drupalSettings'), ), ); diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module index 86689acc2f2..a210a9e1d99 100644 --- a/core/modules/locale/locale.module +++ b/core/modules/locale/locale.module @@ -466,7 +466,7 @@ function locale_library_info() { 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), - array('system', 'drupal.settings'), + array('system', 'drupalSettings'), ), ); diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php index 640f9e077ac..bf8f8456de8 100644 --- a/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php +++ b/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php @@ -62,24 +62,24 @@ class NodeAccessPagerTest extends WebTestBase { // View the node page. With the default 50 comments per page there should // be two pages (0, 1) but no third (2) page. $this->drupalGet('node/' . $node->nid); - $this->assertText($node->label(), t('Node title found.')); - $this->assertText(t('Comments'), t('Has a comments section.')); - $this->assertRaw('page=1', t('Secound page exists.')); - $this->assertNoRaw('page=2', t('No third page exists.')); + $this->assertText($node->label()); + $this->assertText(t('Comments')); + $this->assertRaw('page=1'); + $this->assertNoRaw('page=2'); } /** * Tests the forum node pager for nodes with multiple grants per realm. */ public function testForumPager() { - // Lookup the forums vocabulary vid. + // Look up the forums vocabulary ID. $vid = config('forum.settings')->get('vocabulary'); - $this->assertTrue($vid, t('Forum navigation vocabulary found.')); + $this->assertTrue($vid, 'Forum navigation vocabulary ID is set.'); - // Lookup the general discussion term. + // Look up the general discussion term. $tree = taxonomy_get_tree($vid, 0, 1); $tid = reset($tree)->tid; - $this->assertTrue($tid, t('General discussion term found.')); + $this->assertTrue($tid, 'General discussion term is found in the forum vocabulary.'); // Create 30 nodes. for ($i = 0; $i < 30; $i++) { @@ -98,7 +98,7 @@ class NodeAccessPagerTest extends WebTestBase { // page there should be two pages for 30 nodes, no more. $this->drupalLogin($this->web_user); $this->drupalGet('forum/' . $tid); - $this->assertRaw('page=1', t('Secound page exists.')); - $this->assertNoRaw('page=2', t('No third page exists.')); + $this->assertRaw('page=1'); + $this->assertNoRaw('page=2'); } } diff --git a/core/modules/node/node.module b/core/modules/node/node.module index bca8d9b6644..573d286788e 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -4054,7 +4054,7 @@ function node_library_info() { 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), - array('system', 'drupal.settings'), + array('system', 'drupalSettings'), array('system', 'drupal.form'), ), ); diff --git a/core/modules/overlay/overlay.module b/core/modules/overlay/overlay.module index e03c032b4a2..3ae575c6641 100644 --- a/core/modules/overlay/overlay.module +++ b/core/modules/overlay/overlay.module @@ -213,7 +213,7 @@ function overlay_library_info() { 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), - array('system', 'drupal.settings'), + array('system', 'drupalSettings'), array('system', 'jquery.ui.core'), array('system', 'jquery.bbq'), ), @@ -232,7 +232,7 @@ function overlay_library_info() { 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), - array('system', 'drupal.settings'), + array('system', 'drupalSettings'), array('system', 'jquery.once'), ), ); diff --git a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php index 385d6f4586a..b293c29279a 100644 --- a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php +++ b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php @@ -1284,9 +1284,12 @@ abstract class WebTestBase extends TestBase { $extra_post .= '&' . urlencode($key) . '=' . urlencode($value); } } + $ajax_html_ids = array(); foreach ($this->xpath('//*[@id]') as $element) { - $id = (string) $element['id']; - $extra_post .= '&' . urlencode('ajax_html_ids[]') . '=' . urlencode($id); + $ajax_html_ids[] = (string) $element['id']; + } + if (!empty($ajax_html_ids)) { + $extra_post .= '&' . urlencode('ajax_html_ids') . '=' . urlencode(implode(' ', $ajax_html_ids)); } if (isset($drupal_settings['ajaxPageState'])) { $extra_post .= '&' . urlencode('ajax_page_state[theme]') . '=' . urlencode($drupal_settings['ajaxPageState']['theme']); @@ -1985,7 +1988,7 @@ abstract class WebTestBase extends TestBase { $this->plainTextContent = FALSE; $this->elements = FALSE; $this->drupalSettings = array(); - if (preg_match('/jQuery\.extend\(Drupal\.settings, (.*?)\);/', $content, $matches)) { + if (preg_match('/var drupalSettings = (.*?);/', $content, $matches)) { $this->drupalSettings = drupal_json_decode($matches[1]); } } diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module index f216339f1d5..dd5ee4dee55 100644 --- a/core/modules/simpletest/simpletest.module +++ b/core/modules/simpletest/simpletest.module @@ -551,7 +551,7 @@ function simpletest_library_info() { 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), - array('system', 'drupal.settings'), + array('system', 'drupalSettings'), array('system', 'jquery.once'), array('system', 'drupal.tableselect'), ), diff --git a/core/modules/statistics/statistics.module b/core/modules/statistics/statistics.module index 72a1efbe8bb..8469e52e2aa 100644 --- a/core/modules/statistics/statistics.module +++ b/core/modules/statistics/statistics.module @@ -474,7 +474,7 @@ function statistics_library_info() { 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), - array('system', 'drupal.settings'), + array('system', 'drupalSettings'), ), ); diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/JavaScriptTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/JavaScriptTest.php index 872aaa7e7a0..d2f39bb80cc 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Common/JavaScriptTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Common/JavaScriptTest.php @@ -76,7 +76,7 @@ class JavaScriptTest extends WebTestBase { */ function testAddSetting() { // Add a file in order to test default settings. - drupal_add_library('system', 'drupal.settings'); + drupal_add_library('system', 'drupalSettings'); $javascript = drupal_add_js(); $last_settings = reset($javascript['settings']['data']); $this->assertTrue($last_settings['currentPath'], 'The current path JavaScript setting is set correctly.'); @@ -136,15 +136,13 @@ class JavaScriptTest extends WebTestBase { * Test drupal_get_js() for JavaScript settings. */ function testHeaderSetting() { - drupal_add_library('system', 'drupal.settings'); + drupal_add_library('system', 'drupalSettings'); $javascript = drupal_get_js('header'); $this->assertTrue(strpos($javascript, 'basePath') > 0, 'Rendered JavaScript header returns basePath setting.'); $this->assertTrue(strpos($javascript, 'scriptPath') > 0, 'Rendered JavaScript header returns scriptPath setting.'); $this->assertTrue(strpos($javascript, 'pathPrefix') > 0, 'Rendered JavaScript header returns pathPrefix setting.'); $this->assertTrue(strpos($javascript, 'currentPath') > 0, 'Rendered JavaScript header returns currentPath setting.'); - $this->assertTrue(strpos($javascript, 'core/misc/drupal.js') > 0, 'Rendered JavaScript header includes Drupal.js.'); - $this->assertTrue(strpos($javascript, 'core/misc/jquery.js') > 0, 'Rendered JavaScript header includes jQuery.'); // Only the second of these two entries should appear in Drupal.settings. drupal_add_js(array('commonTest' => 'commonTestShouldNotAppear'), 'setting'); @@ -173,11 +171,11 @@ class JavaScriptTest extends WebTestBase { $this->assertTrue($associative_array_override, t('drupal_add_js() correctly overrides settings within an associative array.')); // Check in a rendered page. $this->drupalGet('common-test/query-string'); - $this->assertPattern('@