View source
<?php
namespace Drupal\Tests\ckeditor5\FunctionalJavascript;
class AdminUiTest extends CKEditor5TestBase {
protected static $modules = [
'media_library',
'ckeditor',
'ckeditor5_incompatible_filter_test',
];
public function testSettingsOnlyFireAjaxWithCkeditor5() {
$page = $this
->getSession()
->getPage();
$assert_session = $this
->assertSession();
$this
->addNewTextFormat($page, $assert_session);
$this
->addNewTextFormat($page, $assert_session, 'ckeditor');
$this
->drupalGet('admin/config/content/formats/manage/ckeditor5');
$number_ajax_instances_before = $this
->getSession()
->evaluateScript('Drupal.ajax.instances.length');
$this
->assertTrue($page
->hasUncheckedField('filters[media_embed][status]'));
$page
->checkField('filters[media_embed][status]');
$this
->assertNotEmpty($assert_session
->waitForElement('css', '.ajax-progress-throbber'));
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->responseContains('Media types selectable in the Media Library');
$assert_session
->assertWaitOnAjaxRequest();
$number_ajax_instances_after = $this
->getSession()
->evaluateScript('Drupal.ajax.instances.length');
$this
->assertGreaterThan($number_ajax_instances_before, $number_ajax_instances_after);
$this
->drupalGet('admin/config/content/formats/manage/ckeditor');
$number_ajax_instances_before = $this
->getSession()
->evaluateScript('Drupal.ajax.instances.length');
$this
->assertTrue($page
->hasUncheckedField('filters[media_embed][status]'));
$page
->checkField('filters[media_embed][status]');
$this
->assertEmpty($assert_session
->waitForElement('css', '.ajax-progress-throbber'));
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->responseContains('Media types selectable in the Media Library');
$assert_session
->assertWaitOnAjaxRequest();
$number_ajax_instances_after = $this
->getSession()
->evaluateScript('Drupal.ajax.instances.length');
$this
->assertSame($number_ajax_instances_before, $number_ajax_instances_after);
$this
->drupalGet('admin/config/content/formats/add');
$page
->fillField('name', 'trigger validator');
$assert_session
->waitForText('Machine name');
$page
->checkField('roles[authenticated]');
$incompatible_filter_name = 'filters[filter_incompatible][status]';
$number_ajax_instances_before = $this
->getSession()
->evaluateScript('Drupal.ajax.instances.length');
$this
->assertTrue($page
->hasUncheckedField($incompatible_filter_name));
$page
->checkField($incompatible_filter_name);
$this
->assertEmpty($assert_session
->waitForElement('css', '.ajax-progress-throbber'));
$assert_session
->assertWaitOnAjaxRequest();
$number_ajax_instances_after = $this
->getSession()
->evaluateScript('Drupal.ajax.instances.length');
$this
->assertSame($number_ajax_instances_before, $number_ajax_instances_after);
$page
->selectFieldOption('editor[editor]', 'ckeditor5');
$assert_session
->assertWaitOnAjaxRequest();
$filter_warning = 'CKEditor 5 only works with HTML-based text formats. The "A TYPE_MARKUP_LANGUAGE filter incompatible with CKEditor 5" (filter_incompatible) filter implies this text format is not HTML anymore.';
$assert_session
->pageTextContains($filter_warning);
$this
->assertTrue($page
->hasCheckedField($incompatible_filter_name));
$page
->uncheckField($incompatible_filter_name);
$this
->assertNotEmpty($assert_session
->waitForElement('css', '.ajax-progress-throbber'));
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->pageTextNotContains($filter_warning);
}
public function testUnavailableFiltersHiddenWhenSwitching() {
$page = $this
->getSession()
->getPage();
$assert_session = $this
->assertSession();
$this
->createNewTextFormat($page, $assert_session, 'ckeditor');
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->pageTextNotContains('Filter settings');
$page
->selectFieldOption('editor[editor]', 'ckeditor5');
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->pageTextNotContains('Filter settings');
}
public function testFilterCheckboxesToggleSettings() {
$page = $this
->getSession()
->getPage();
$assert_session = $this
->assertSession();
$this
->createNewTextFormat($page, $assert_session);
$assert_session
->assertWaitOnAjaxRequest();
$media_tab = $page
->find('css', '[href^="#edit-filters-media-embed-settings"]');
$this
->assertFalse($media_tab
->isVisible(), 'Media filter settings should not be present because media filter is not enabled');
$this
->assertTrue($page
->hasUncheckedField('filters[media_embed][status]'));
$page
->checkField('filters[media_embed][status]');
$assert_session
->assertWaitOnAjaxRequest();
$media_tab = $assert_session
->waitForElementVisible('css', '[href^="#edit-filters-media-embed-settings"]');
$this
->assertTrue($media_tab
->isVisible(), 'Media settings should appear when media filter enabled');
$page
->uncheckField('filters[media_embed][status]');
$assert_session
->assertWaitOnAjaxRequest();
$media_tab = $page
->find('css', '[href^="#edit-filters-media-embed-settings"]');
$this
->assertFalse($media_tab
->isVisible(), 'Media settings should be removed when media filter disabled');
}
public function testMessagesDoNotAccumulate() : void {
$page = $this
->getSession()
->getPage();
$assert_session = $this
->assertSession();
$this
->addNewTextFormat($page, $assert_session);
$this
->drupalGet('admin/config/content/formats/manage/ckeditor5');
$this
->assertNotEmpty($assert_session
->waitForElement('css', '.ckeditor5-toolbar-item-sourceEditing'));
$this
->triggerKeyUp('.ckeditor5-toolbar-item-sourceEditing', 'ArrowDown');
$assert_session
->assertWaitOnAjaxRequest();
$find_validation_error_messages = function () use ($page) : array {
return $page
->findAll('css', '[role=alert]:contains("The following tag(s) are already supported by enabled plugins and should not be added to the Source Editing "Manually editable HTML tags" field: Bold (<strong>).")');
};
$this
->assertCount(0, $find_validation_error_messages());
$assert_session
->waitForText('Source editing');
$page
->find('css', '[href^="#edit-editor-settings-plugins-ckeditor5-sourceediting"]')
->click();
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->waitForText('Manually editable HTML tags');
$source_edit_tags_field = $assert_session
->fieldExists('editor[settings][plugins][ckeditor5_sourceEditing][allowed_tags]');
$source_edit_tags_field
->setValue('<strong>');
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertCount(1, $find_validation_error_messages());
$source_edit_tags_field
->setValue('');
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertCount(0, $find_validation_error_messages());
$source_edit_tags_field
->setValue('<strong>');
$assert_session
->assertWaitOnAjaxRequest();
$this
->assertCount(1, $find_validation_error_messages());
}
public function testPluginSettingsFormSection() {
$page = $this
->getSession()
->getPage();
$assert_session = $this
->assertSession();
$this
->createNewTextFormat($page, $assert_session);
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->fieldValueEquals('editor[settings][toolbar][items]', '["heading","bold","italic"]');
$assert_session
->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-heading"]');
$this
->triggerKeyUp('.ckeditor5-toolbar-item-heading', 'ArrowUp');
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->elementNotExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-heading"]');
$assert_session
->elementExists('css', '#plugin-settings-wrapper');
$assert_session
->elementNotContains('css', '#plugin-settings-wrapper', '<div');
$this
->triggerKeyUp('.ckeditor5-toolbar-item-sourceEditing', 'ArrowDown');
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-sourceediting"]');
$assert_session
->elementNotExists('css', '[data-drupal-selector="edit-editor-settings-plugins-media-media"]');
$this
->assertTrue($page
->hasUncheckedField('filters[media_embed][status]'));
$page
->checkField('filters[media_embed][status]');
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-media-media"]');
}
public function testLanguageConfigForm() {
$page = $this
->getSession()
->getPage();
$assert_session = $this
->assertSession();
$this
->createNewTextFormat($page, $assert_session);
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->elementNotExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-language"]');
$this
->assertNotEmpty($assert_session
->waitForElement('css', '.ckeditor5-toolbar-item-textPartLanguage'));
$this
->triggerKeyUp('.ckeditor5-toolbar-item-textPartLanguage', 'ArrowDown');
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->waitForElement('css', '[role=alert][data-drupal-message-type="warning"]:contains("The Language plugin needs another plugin to create <span>, for it to be able to create the following attributes: <span lang dir>. Enable a plugin that supports creating this tag. If none exists, you can configure the Source Editing plugin to support it.")');
$this
->assertNotEmpty($assert_session
->elementExists('css', '.ckeditor5-toolbar-item-sourceEditing'));
$this
->triggerKeyUp('.ckeditor5-toolbar-item-sourceEditing', 'ArrowDown');
$assert_session
->assertWaitOnAjaxRequest();
$page
->clickLink('Source editing');
$this
->assertNotNull($assert_session
->waitForElementVisible('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-sourceediting-allowed-tags"]'));
$javascript = <<<JS
const allowedTags = document.querySelector('[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-sourceediting-allowed-tags"]');
allowedTags.value = '<span>';
allowedTags.dispatchEvent(new Event('input'));
JS;
$this
->getSession()
->executeScript($javascript);
$this
->triggerKeyUp('.ckeditor5-toolbar-item-undo', 'ArrowDown');
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->waitForElementRemoved('css', '[data-drupal-messages] [role="alert"]');
$assert_session
->elementExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-language"]');
$this
->triggerKeyUp('.ckeditor5-toolbar-item-textPartLanguage', 'ArrowUp');
$assert_session
->assertWaitOnAjaxRequest();
$assert_session
->elementNotExists('css', '[data-drupal-selector="edit-editor-settings-plugins-ckeditor5-language"]');
}
}