diff --git a/core/modules/ckeditor/ckeditor.libraries.yml b/core/modules/ckeditor/ckeditor.libraries.yml index 67c46dcfd4339b6fe590a6a1783991f8577579f5..902cb993238ab12996e108166b396a3faa40e06b 100644 --- a/core/modules/ckeditor/ckeditor.libraries.yml +++ b/core/modules/ckeditor/ckeditor.libraries.yml @@ -8,6 +8,7 @@ drupal.ckeditor: dependencies: - core/jquery - core/drupal + - core/drupalSettings - core/drupal.debounce - core/ckeditor - editor/drupal.editor diff --git a/core/modules/ckeditor/ckeditor.module b/core/modules/ckeditor/ckeditor.module index 80af8e9bf904c17c95d9b38fb07c9cffb93c588d..f166d94c19acead83091b1b705d07e2b56ed70e8 100644 --- a/core/modules/ckeditor/ckeditor.module +++ b/core/modules/ckeditor/ckeditor.module @@ -102,3 +102,15 @@ function _ckeditor_theme_css($theme = NULL) { } return $css; } + +/** + * Implements hook_library_info_alter(). + */ +function ckeditor_library_info_alter(&$libraries, $extension) { + // Pass Drupal's JS cache-busting string via settings along to CKEditor. + // @see http://docs.ckeditor.com/#!/api/CKEDITOR-property-timestamp + if ($extension === 'ckeditor' && isset($libraries['drupal.ckeditor'])) { + $query_string = \Drupal::state()->get('system.css_js_query_string') ?: '0'; + $libraries['drupal.ckeditor']['drupalSettings']['ckeditor']['timestamp'] = $query_string; + } +} diff --git a/core/modules/ckeditor/js/ckeditor.js b/core/modules/ckeditor/js/ckeditor.js index 313621f26f11f0bf0cc7f7cbe92c15a86df60b5c..497393f9a1ac01e0e3b24ce9f0ea5e4c8e79df90 100644 --- a/core/modules/ckeditor/js/ckeditor.js +++ b/core/modules/ckeditor/js/ckeditor.js @@ -273,4 +273,7 @@ } }); + // Set the CKEditor cache-busting string to the same value as Drupal. + CKEDITOR.timestamp = drupalSettings.ckeditor.timestamp; + })(Drupal, Drupal.debounce, CKEDITOR, jQuery); diff --git a/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php b/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php index feba8ecd7d50943229bae7309219b235a4ca9cf9..9aa2ce2b5a4b7e1e46c4f4f32d02b6c98576c3eb 100644 --- a/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php +++ b/core/modules/ckeditor/src/Tests/CKEditorLoadingTest.php @@ -148,6 +148,16 @@ function testLoading() { $this->assertIdentical($expected, $this->castSafeStrings($settings['editor']), "Text Editor module's JavaScript settings on the page are correct."); $this->assertTrue($editor_js_present, 'Text Editor JavaScript is present.'); $this->assertTrue(in_array('ckeditor/drupal.ckeditor', explode(',', $settings['ajaxPageState']['libraries'])), 'CKEditor glue library is present.'); + + // Assert that CKEditor uses Drupal's cache-busting query string by + // comparing the setting sent with the page with the current query string. + $settings = $this->getDrupalSettings(); + $expected = $settings['ckeditor']['timestamp']; + $this->assertIdentical($expected, \Drupal::state()->get('system.css_js_query_string'), "CKEditor scripts cache-busting string is correct before flushing all caches."); + // Flush all caches then make sure that $settings['ckeditor']['timestamp'] + // still matches. + drupal_flush_all_caches(); + $this->assertIdentical($expected, \Drupal::state()->get('system.css_js_query_string'), "CKEditor scripts cache-busting string is correct after flushing all caches."); } protected function getThingsToCheck() {