From adaad5f54cb7275476c41c3a5da6d257327a70ec Mon Sep 17 00:00:00 2001
From: Nathaniel Catchpole <catch@35733.no-reply.drupal.org>
Date: Tue, 8 Mar 2016 11:46:29 +0900
Subject: [PATCH] Issue #2679903 by thpoul, Dave Reid, Wim Leers: CKEditor uses
 separate cache-busting query string from Drupal's

---
 core/modules/ckeditor/ckeditor.libraries.yml         |  1 +
 core/modules/ckeditor/ckeditor.module                | 12 ++++++++++++
 core/modules/ckeditor/js/ckeditor.js                 |  3 +++
 .../ckeditor/src/Tests/CKEditorLoadingTest.php       | 10 ++++++++++
 4 files changed, 26 insertions(+)

diff --git a/core/modules/ckeditor/ckeditor.libraries.yml b/core/modules/ckeditor/ckeditor.libraries.yml
index 67c46dcfd433..902cb993238a 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 80af8e9bf904..f166d94c19ac 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 313621f26f11..497393f9a1ac 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 feba8ecd7d50..9aa2ce2b5a4b 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() {
-- 
GitLab