function MediaTest::testDialogAccess

Tests the EditorMediaDialog's form elements' #access logic.

File

core/modules/ckeditor/tests/src/FunctionalJavascript/MediaTest.php, line 497

Class

MediaTest
@coversDefaultClass \Drupal\ckeditor\Plugin\CKEditorPlugin\DrupalMedia @group ckeditor @group legacy

Namespace

Drupal\Tests\ckeditor\FunctionalJavascript

Code

public function testDialogAccess() {
    $page = $this->getSession()
        ->getPage();
    $assert_session = $this->assertSession();
    $this->drupalGet($this->host
        ->toUrl('edit-form'));
    $this->waitForEditor();
    $this->assignNameToCkeditorIframe();
    $this->getSession()
        ->switchToIFrame('ckeditor');
    // Enable `filter_html` without "alt", "data-align" or "data-caption"
    // attributes added to the drupal-media tag.
    $allowed_html = "<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type='1 A I'> <li> <dl> <dt> <dd> <h2 id='jump-*'> <h3 id> <h4 id> <h5 id> <h6 id> <drupal-media data-entity-type data-entity-uuid data-view-mode>";
    $filter_format = FilterFormat::load('test_format');
    $filter_format->setFilterConfig('filter_html', [
        'status' => TRUE,
        'settings' => [
            'allowed_html' => $allowed_html,
        ],
    ])
        ->save();
    // Test the validation of attributes in the dialog.  If the alt,
    // data-caption, and data-align attributes are not set on the drupal-media
    // tag, the respective fields shouldn't display in the dialog.
    $this->drupalGet($this->host
        ->toUrl('edit-form'));
    $this->waitForEditor();
    $this->assignNameToCkeditorIframe();
    $this->getSession()
        ->switchToIFrame('ckeditor');
    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'drupal-media', 2000));
    // Test `aria-label` attribute appears on the widget wrapper.
    $assert_session->elementExists('css', '.cke_widget_drupalmedia[aria-label="Screaming hairy armadillo"]');
    $page->pressButton('Edit media');
    $this->waitForMetadataDialog();
    $assert_session->fieldNotExists('attributes[alt]');
    $assert_session->fieldNotExists('attributes[align]');
    $assert_session->fieldNotExists('hasCaption');
    $assert_session->pageTextContains('There is nothing to configure for this media.');
    // The edit link for the format shouldn't appear unless the user has
    // permission to edit the text format.
    $assert_session->pageTextNotContains('Edit the text format Test format to modify the attributes that can be overridden.');
    $page->pressButton('Close');
    $this->getSession()
        ->switchToIFrame('ckeditor');
    // Now test the same thing with a user who has access to edit text formats.
    // An extra message containing a link to edit the text format should
    // appear.
    Role::load(RoleInterface::AUTHENTICATED_ID)->grantPermission('administer filters')
        ->save();
    $this->drupalGet($this->host
        ->toUrl('edit-form'));
    $this->waitForEditor();
    $this->assignNameToCkeditorIframe();
    $this->getSession()
        ->switchToIFrame('ckeditor');
    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'drupal-media', 2000));
    $page->pressButton('Edit media');
    $this->waitForMetadataDialog();
    $assert_session->fieldNotExists('attributes[alt]');
    $assert_session->fieldNotExists('attributes[align]');
    $assert_session->fieldNotExists('hasCaption');
    $assert_session->pageTextContains('There is nothing to configure for this media. Edit the text format Test format to modify the attributes that can be overridden.');
    $assert_session->linkExists('Edit the text format Test format');
    $page->pressButton('Close');
    $this->getSession()
        ->switchToIFrame('ckeditor');
    // Now test that adding the attributes to the allowed HTML will allow
    // the fields to display in the dialog.
    $allowed_html = str_replace('<drupal-media data-entity-type data-entity-uuid data-view-mode>', '<drupal-media alt data-align data-caption data-entity-type data-entity-uuid data-view-mode>', $allowed_html);
    $filter_format->setFilterConfig('filter_html', [
        'status' => TRUE,
        'settings' => [
            'allowed_html' => $allowed_html,
        ],
    ])
        ->save();
    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'drupal-media', 2000));
    $page->pressButton('Edit media');
    $this->waitForMetadataDialog();
    $assert_session->fieldExists('attributes[alt]');
    $assert_session->fieldExists('attributes[data-align]');
    $assert_session->fieldExists('hasCaption');
    $page->pressButton('Close');
    $this->getSession()
        ->switchToIFrame('ckeditor');
    // Test that setting the media image field to not display alt field also
    // disables it in the dialog.
    FieldConfig::loadByName('media', 'image', 'field_media_image')->setSetting('alt_field', FALSE)
        ->save();
    // @todo This manual cache clearing should not be necessary, fix in
    // https://www.drupal.org/project/drupal/issues/3076544
    $this->container
        ->get('cache.discovery')
        ->delete('entity_bundle_field_definitions:media:image:en');
    // Wait for preview.
    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'drupal-media', 2000));
    $page->pressButton('Edit media');
    $this->waitForMetadataDialog();
    $assert_session->fieldNotExists('attributes[alt]');
    $assert_session->fieldExists('attributes[data-align]');
    $assert_session->fieldExists('hasCaption');
    $page->pressButton('Close');
    $this->getSession()
        ->switchToIFrame('ckeditor');
    // Test that enabling the alt field on the media image field restores
    // the field in the dialog.
    FieldConfig::loadByName('media', 'image', 'field_media_image')->setSetting('alt_field', TRUE)
        ->save();
    // @todo This manual cache clearing should not be necessary, fix in
    // https://www.drupal.org/project/drupal/issues/3076544
    $this->container
        ->get('cache.discovery')
        ->delete('entity_bundle_field_definitions:media:image:en');
    // Wait for preview.
    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'drupal-media', 2000));
    $page->pressButton('Edit media');
    $this->waitForMetadataDialog();
    $assert_session->fieldExists('attributes[alt]');
    $assert_session->fieldExists('attributes[data-align]');
    $assert_session->fieldExists('hasCaption');
    $page->pressButton('Close');
    $this->getSession()
        ->switchToIFrame('ckeditor');
    // Test that disabling `filter_caption` and `filter_align` disables the
    // respective fields in the dialog.
    $filter_format->setFilterConfig('filter_caption', [
        'status' => FALSE,
    ])
        ->setFilterConfig('filter_align', [
        'status' => FALSE,
    ])
        ->save();
    // Wait for preview.
    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'drupal-media', 2000));
    $page->pressButton('Edit media');
    $this->waitForMetadataDialog();
    $assert_session->fieldNotExists('attributes[data-align]');
    $assert_session->fieldNotExists('hasCaption');
    // The alt field should be unaffected.
    $assert_session->fieldExists('attributes[alt]');
    $page->pressButton('Close');
    $this->getSession()
        ->switchToIFrame('ckeditor');
    // Test that enabling the two filters restores the fields in the dialog.
    $filter_format->setFilterConfig('filter_caption', [
        'status' => TRUE,
    ])
        ->setFilterConfig('filter_align', [
        'status' => TRUE,
    ])
        ->save();
    // Wait for preview.
    $this->assertNotEmpty($assert_session->waitForElementVisible('css', 'drupal-media', 2000));
    $page->pressButton('Edit media');
    $this->waitForMetadataDialog();
    $assert_session->fieldExists('attributes[data-align]');
    $assert_session->fieldExists('hasCaption');
    $assert_session->pageTextNotContains('There is nothing to configure for this media. Edit the text format Test format to modify the attributes that can be overridden.');
    // The alt field should be unaffected.
    $assert_session->fieldExists('attributes[alt]');
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.