Loading core/modules/ckeditor5/js/ckeditor5.js +3 −16 Original line number Diff line number Diff line Loading @@ -443,22 +443,9 @@ editor.model.document.on('change:data', () => { const callback = callbacks.get(id); if (callback) { if (editor.plugins.has('SourceEditing')) { // If the change:data is being called while in source editing // mode, it means that the form is being submitted. To avoid // race conditions, in this case the callback gets called // without decorating the callback with debounce. // @see https://www.drupal.org/i/3229174 // @see Drupal.editorDetach if (editor.plugins.get('SourceEditing').isSourceEditingMode) { callback(); return; } } // Marks the field as changed. // @see Drupal.editorAttach debounce(callback, 400)(); callback(); } }); Loading Loading @@ -530,7 +517,7 @@ * Callback called with the value of the editor. */ onChange(element, callback) { callbacks.set(getElementId(element), callback); callbacks.set(getElementId(element), debounce(callback, 400, true)); }, /** Loading Loading @@ -570,7 +557,7 @@ const callback = callbacks.get(id); if (callback) { // Allow modules to update EditorModel by providing the current data. debounce(callback, 400)(editor.getData()); callback(editor.getData()); } }); }) Loading core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5Test.php +78 −0 Original line number Diff line number Diff line Loading @@ -797,4 +797,82 @@ function (ConstraintViolation $v) { $assert_session->responseContains('<!-- Hamsters, alpacas, llamas, and kittens are cute! --><p>This is a <em>test!</em></p>'); } /** * Ensures that changes are saved in CKEditor 5. */ public function testSave(): void { // To replicate the bug from https://www.drupal.org/i/3396742 // We need 2 or more text formats and node edit page. FilterFormat::create([ 'format' => 'ckeditor5', 'name' => 'CKEditor 5 HTML', 'roles' => [RoleInterface::AUTHENTICATED_ID], ])->save(); Editor::create([ 'format' => 'ckeditor5', 'editor' => 'ckeditor5', 'settings' => [ 'toolbar' => [ 'items' => [ 'sourceEditing', ], ], 'plugins' => [ 'ckeditor5_sourceEditing' => [ 'allowed_tags' => [], ], ], ], ])->save(); $this->assertSame([], array_map( function (ConstraintViolation $v) { return (string) $v->getMessage(); }, iterator_to_array(CKEditor5::validatePair( Editor::load('ckeditor5'), FilterFormat::load('ckeditor5') )) )); FilterFormat::create([ 'format' => 'ckeditor5_2', 'name' => 'CKEditor 5 HTML 2', 'roles' => [RoleInterface::AUTHENTICATED_ID], ])->save(); Editor::create([ 'format' => 'ckeditor5_2', 'editor' => 'ckeditor5', ])->save(); $this->assertSame([], array_map( function (ConstraintViolation $v) { return (string) $v->getMessage(); }, iterator_to_array(CKEditor5::validatePair( Editor::load('ckeditor5_2'), FilterFormat::load('ckeditor5_2') )) )); $this->drupalCreateNode([ 'title' => 'My test content', ]); // Test that entered text is saved. $this->drupalGet('node/1/edit'); $page = $this->getSession()->getPage(); $this->waitForEditor(); $editor = $page->find('css', '.ck-content'); $editor->setValue('Very important information'); $page->pressButton('Save'); $this->assertSession()->responseContains('Very important information'); // Test that changes only in source are saved. $this->drupalGet('node/1/edit'); $page = $this->getSession()->getPage(); $this->waitForEditor(); $this->pressEditorButton('Source'); $editor = $page->find('css', '.ck-source-editing-area textarea'); $editor->setValue('Text hidden in the source'); $page->pressButton('Save'); $this->assertSession()->responseContains('Text hidden in the source'); } } Loading
core/modules/ckeditor5/js/ckeditor5.js +3 −16 Original line number Diff line number Diff line Loading @@ -443,22 +443,9 @@ editor.model.document.on('change:data', () => { const callback = callbacks.get(id); if (callback) { if (editor.plugins.has('SourceEditing')) { // If the change:data is being called while in source editing // mode, it means that the form is being submitted. To avoid // race conditions, in this case the callback gets called // without decorating the callback with debounce. // @see https://www.drupal.org/i/3229174 // @see Drupal.editorDetach if (editor.plugins.get('SourceEditing').isSourceEditingMode) { callback(); return; } } // Marks the field as changed. // @see Drupal.editorAttach debounce(callback, 400)(); callback(); } }); Loading Loading @@ -530,7 +517,7 @@ * Callback called with the value of the editor. */ onChange(element, callback) { callbacks.set(getElementId(element), callback); callbacks.set(getElementId(element), debounce(callback, 400, true)); }, /** Loading Loading @@ -570,7 +557,7 @@ const callback = callbacks.get(id); if (callback) { // Allow modules to update EditorModel by providing the current data. debounce(callback, 400)(editor.getData()); callback(editor.getData()); } }); }) Loading
core/modules/ckeditor5/tests/src/FunctionalJavascript/CKEditor5Test.php +78 −0 Original line number Diff line number Diff line Loading @@ -797,4 +797,82 @@ function (ConstraintViolation $v) { $assert_session->responseContains('<!-- Hamsters, alpacas, llamas, and kittens are cute! --><p>This is a <em>test!</em></p>'); } /** * Ensures that changes are saved in CKEditor 5. */ public function testSave(): void { // To replicate the bug from https://www.drupal.org/i/3396742 // We need 2 or more text formats and node edit page. FilterFormat::create([ 'format' => 'ckeditor5', 'name' => 'CKEditor 5 HTML', 'roles' => [RoleInterface::AUTHENTICATED_ID], ])->save(); Editor::create([ 'format' => 'ckeditor5', 'editor' => 'ckeditor5', 'settings' => [ 'toolbar' => [ 'items' => [ 'sourceEditing', ], ], 'plugins' => [ 'ckeditor5_sourceEditing' => [ 'allowed_tags' => [], ], ], ], ])->save(); $this->assertSame([], array_map( function (ConstraintViolation $v) { return (string) $v->getMessage(); }, iterator_to_array(CKEditor5::validatePair( Editor::load('ckeditor5'), FilterFormat::load('ckeditor5') )) )); FilterFormat::create([ 'format' => 'ckeditor5_2', 'name' => 'CKEditor 5 HTML 2', 'roles' => [RoleInterface::AUTHENTICATED_ID], ])->save(); Editor::create([ 'format' => 'ckeditor5_2', 'editor' => 'ckeditor5', ])->save(); $this->assertSame([], array_map( function (ConstraintViolation $v) { return (string) $v->getMessage(); }, iterator_to_array(CKEditor5::validatePair( Editor::load('ckeditor5_2'), FilterFormat::load('ckeditor5_2') )) )); $this->drupalCreateNode([ 'title' => 'My test content', ]); // Test that entered text is saved. $this->drupalGet('node/1/edit'); $page = $this->getSession()->getPage(); $this->waitForEditor(); $editor = $page->find('css', '.ck-content'); $editor->setValue('Very important information'); $page->pressButton('Save'); $this->assertSession()->responseContains('Very important information'); // Test that changes only in source are saved. $this->drupalGet('node/1/edit'); $page = $this->getSession()->getPage(); $this->waitForEditor(); $this->pressEditorButton('Source'); $editor = $page->find('css', '.ck-source-editing-area textarea'); $editor->setValue('Text hidden in the source'); $page->pressButton('Save'); $this->assertSession()->responseContains('Text hidden in the source'); } }