Update to Drupal 8.2.0. For more information, see https://www.drupal.org/project/drupal/releases/8.2.0
This commit is contained in:
parent
2f563ab520
commit
f1c8716f57
1732 changed files with 52334 additions and 11780 deletions
|
@ -34,7 +34,9 @@ editor.editor.*:
|
|||
mapping:
|
||||
width:
|
||||
type: integer
|
||||
nullable: true
|
||||
label: 'Maximum width'
|
||||
height:
|
||||
type: integer
|
||||
nullable: true
|
||||
label: 'Maximum height'
|
||||
|
|
|
@ -67,6 +67,20 @@ function editor_element_info_alter(&$types) {
|
|||
|
||||
/**
|
||||
* Implements hook_form_FORM_ID_alter() for \Drupal\filter\FilterFormatListBuilder.
|
||||
*
|
||||
* Implements hook_field_formatter_info_alter().
|
||||
*
|
||||
* @see quickedit_field_formatter_info_alter()
|
||||
*/
|
||||
function editor_field_formatter_info_alter(&$info) {
|
||||
// Update \Drupal\text\Plugin\Field\FieldFormatter\TextDefaultFormatter's
|
||||
// annotation to indicate that it supports the 'editor' in-place editor
|
||||
// provided by this module.
|
||||
$info['text_default']['quickedit'] = ['editor' => 'editor'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_form_FORM_ID_alter().
|
||||
*/
|
||||
function editor_form_filter_admin_overview_alter(&$form, FormStateInterface $form_state) {
|
||||
// @todo Cleanup column injection: https://www.drupal.org/node/1876718.
|
||||
|
@ -249,7 +263,7 @@ function editor_load($format_id) {
|
|||
// than one editor will be needed on a page (such as having multiple text
|
||||
// formats for administrators). Loading a small number of editors all at once
|
||||
// is more efficient than loading multiple editors individually.
|
||||
$editors = entity_load_multiple('editor');
|
||||
$editors = Editor::loadMultiple();
|
||||
return isset($editors[$format_id]) ? $editors[$format_id] : NULL;
|
||||
}
|
||||
|
||||
|
|
21
core/modules/editor/editor.post_update.php
Normal file
21
core/modules/editor/editor.post_update.php
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Post update functions for Editor.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup updates-8.2.x
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Clear the render cache to fix file references added by Editor.
|
||||
*/
|
||||
function editor_post_update_clear_cache_for_file_reference_filter() {
|
||||
}
|
||||
|
||||
/**
|
||||
* @} End of "addtogroup updates-8.2.x".
|
||||
*/
|
|
@ -2,8 +2,6 @@ editor.filter_xss:
|
|||
path: '/editor/filter_xss/{filter_format}'
|
||||
defaults:
|
||||
_controller: '\Drupal\editor\EditorController::filterXss'
|
||||
options:
|
||||
_theme: ajax_base_page
|
||||
requirements:
|
||||
_entity_access: 'filter_format.use'
|
||||
|
||||
|
@ -12,7 +10,6 @@ editor.field_untransformed_text:
|
|||
defaults:
|
||||
_controller: '\Drupal\editor\EditorController::getUntransformedText'
|
||||
options:
|
||||
_theme: ajax_base_page
|
||||
parameters:
|
||||
entity:
|
||||
type: entity:{entity_type}
|
||||
|
@ -21,21 +18,17 @@ editor.field_untransformed_text:
|
|||
_access_quickedit_entity_field: 'TRUE'
|
||||
|
||||
editor.image_dialog:
|
||||
path: '/editor/dialog/image/{filter_format}'
|
||||
path: '/editor/dialog/image/{editor}'
|
||||
defaults:
|
||||
_form: '\Drupal\editor\Form\EditorImageDialog'
|
||||
_title: 'Upload image'
|
||||
options:
|
||||
_theme: ajax_base_page
|
||||
requirements:
|
||||
_entity_access: 'filter_format.use'
|
||||
_entity_access: 'editor.use'
|
||||
|
||||
editor.link_dialog:
|
||||
path: '/editor/dialog/link/{filter_format}'
|
||||
path: '/editor/dialog/link/{editor}'
|
||||
defaults:
|
||||
_form: '\Drupal\editor\Form\EditorLinkDialog'
|
||||
_title: 'Add link'
|
||||
options:
|
||||
_theme: ajax_base_page
|
||||
requirements:
|
||||
_entity_access: 'filter_format.use'
|
||||
_entity_access: 'editor.use'
|
||||
|
|
24
core/modules/editor/src/EditorAccessControlHandler.php
Normal file
24
core/modules/editor/src/EditorAccessControlHandler.php
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\editor;
|
||||
|
||||
use Drupal\Core\Entity\EntityAccessControlHandler;
|
||||
use Drupal\Core\Entity\EntityInterface;
|
||||
use Drupal\Core\Session\AccountInterface;
|
||||
|
||||
/**
|
||||
* Defines the access control handler for the text editor entity type.
|
||||
*
|
||||
* @see \Drupal\editor\Entity\Editor
|
||||
*/
|
||||
class EditorAccessControlHandler extends EntityAccessControlHandler {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function checkAccess(EntityInterface $editor, $operation, AccountInterface $account) {
|
||||
/** @var \Drupal\editor\EditorInterface $editor */
|
||||
return $editor->getFilterFormat()->access($operation, $account, TRUE);
|
||||
}
|
||||
|
||||
}
|
|
@ -120,7 +120,7 @@ class Standard extends Xss implements EditorXssFilterInterface {
|
|||
/**
|
||||
* Get all allowed tags from a restrictions data structure.
|
||||
*
|
||||
* @param array|FALSE $restrictions
|
||||
* @param array|false $restrictions
|
||||
* Restrictions as returned by FilterInterface::getHTMLRestrictions().
|
||||
*
|
||||
* @return array
|
||||
|
@ -144,7 +144,7 @@ class Standard extends Xss implements EditorXssFilterInterface {
|
|||
/**
|
||||
* Get all forbidden tags from a restrictions data structure.
|
||||
*
|
||||
* @param array|FALSE $restrictions
|
||||
* @param array|false $restrictions
|
||||
* Restrictions as returned by FilterInterface::getHTMLRestrictions().
|
||||
*
|
||||
* @return array
|
||||
|
|
|
@ -11,6 +11,9 @@ use Drupal\editor\EditorInterface;
|
|||
* @ConfigEntityType(
|
||||
* id = "editor",
|
||||
* label = @Translation("Text Editor"),
|
||||
* handlers = {
|
||||
* "access" = "Drupal\editor\EditorAccessControlHandler",
|
||||
* },
|
||||
* entity_keys = {
|
||||
* "id" = "format"
|
||||
* },
|
||||
|
|
|
@ -5,7 +5,7 @@ namespace Drupal\editor\Form;
|
|||
use Drupal\Component\Utility\Bytes;
|
||||
use Drupal\Core\Form\FormBase;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\filter\Entity\FilterFormat;
|
||||
use Drupal\editor\Entity\Editor;
|
||||
use Drupal\Core\Ajax\AjaxResponse;
|
||||
use Drupal\Core\Ajax\HtmlCommand;
|
||||
use Drupal\editor\Ajax\EditorDialogSave;
|
||||
|
@ -54,10 +54,10 @@ class EditorImageDialog extends FormBase {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @param \Drupal\filter\Entity\FilterFormat $filter_format
|
||||
* The filter format for which this dialog corresponds.
|
||||
* @param \Drupal\editor\Entity\Editor $editor
|
||||
* The text editor to which this dialog corresponds.
|
||||
*/
|
||||
public function buildForm(array $form, FormStateInterface $form_state, FilterFormat $filter_format = NULL) {
|
||||
public function buildForm(array $form, FormStateInterface $form_state, Editor $editor = NULL) {
|
||||
// This form is special, in that the default values do not come from the
|
||||
// server side, but from the client side, from a text editor. We must cache
|
||||
// this data in form state, because when the form is rebuilt, we will be
|
||||
|
@ -81,8 +81,6 @@ class EditorImageDialog extends FormBase {
|
|||
$form['#prefix'] = '<div id="editor-image-dialog-form">';
|
||||
$form['#suffix'] = '</div>';
|
||||
|
||||
$editor = editor_load($filter_format->id());
|
||||
|
||||
// Construct strings to use in the upload validators.
|
||||
$image_upload = $editor->getImageUploadSettings();
|
||||
if (!empty($image_upload['max_dimensions']['width']) || !empty($image_upload['max_dimensions']['height'])) {
|
||||
|
@ -151,7 +149,7 @@ class EditorImageDialog extends FormBase {
|
|||
|
||||
// When Drupal core's filter_align is being used, the text editor may
|
||||
// offer the ability to change the alignment.
|
||||
if (isset($image_element['data-align']) && $filter_format->filters('filter_align')->status) {
|
||||
if (isset($image_element['data-align']) && $editor->getFilterFormat()->filters('filter_align')->status) {
|
||||
$form['align'] = array(
|
||||
'#title' => $this->t('Align'),
|
||||
'#type' => 'radios',
|
||||
|
@ -170,7 +168,7 @@ class EditorImageDialog extends FormBase {
|
|||
|
||||
// When Drupal core's filter_caption is being used, the text editor may
|
||||
// offer the ability to in-place edit the image's caption: show a toggle.
|
||||
if (isset($image_element['hasCaption']) && $filter_format->filters('filter_caption')->status) {
|
||||
if (isset($image_element['hasCaption']) && $editor->getFilterFormat()->filters('filter_caption')->status) {
|
||||
$form['caption'] = array(
|
||||
'#title' => $this->t('Caption'),
|
||||
'#type' => 'checkbox',
|
||||
|
|
|
@ -4,7 +4,7 @@ namespace Drupal\editor\Form;
|
|||
|
||||
use Drupal\Core\Form\FormBase;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\filter\Entity\FilterFormat;
|
||||
use Drupal\editor\Entity\Editor;
|
||||
use Drupal\Core\Ajax\AjaxResponse;
|
||||
use Drupal\Core\Ajax\HtmlCommand;
|
||||
use Drupal\editor\Ajax\EditorDialogSave;
|
||||
|
@ -25,10 +25,10 @@ class EditorLinkDialog extends FormBase {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*
|
||||
* @param \Drupal\filter\Entity\FilterFormat $filter_format
|
||||
* The filter format for which this dialog corresponds.
|
||||
* @param \Drupal\editor\Entity\Editor $editor
|
||||
* The text editor to which this dialog corresponds.
|
||||
*/
|
||||
public function buildForm(array $form, FormStateInterface $form_state, FilterFormat $filter_format = NULL) {
|
||||
public function buildForm(array $form, FormStateInterface $form_state, Editor $editor = NULL) {
|
||||
// The default values are set directly from \Drupal::request()->request,
|
||||
// provided by the editor plugin opening the dialog.
|
||||
$user_input = $form_state->getUserInput();
|
||||
|
|
|
@ -12,7 +12,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
|
|||
/**
|
||||
* Provides a filter to track images uploaded via a Text Editor.
|
||||
*
|
||||
* Passes the text unchanged, but associates the cache tags of referenced files.
|
||||
* Generates file URLs and associates the cache tags of referenced files.
|
||||
*
|
||||
* @Filter(
|
||||
* id = "editor_file_reference",
|
||||
|
@ -71,6 +71,16 @@ class EditorFileReference extends FilterBase implements ContainerFactoryPluginIn
|
|||
$processed_uuids = array();
|
||||
foreach ($xpath->query('//*[@data-entity-type="file" and @data-entity-uuid]') as $node) {
|
||||
$uuid = $node->getAttribute('data-entity-uuid');
|
||||
|
||||
// If there is a 'src' attribute, set it to the file entity's current
|
||||
// URL. This ensures the URL works even after the file location changes.
|
||||
if ($node->hasAttribute('src')) {
|
||||
$file = $this->entityManager->loadEntityByUuid('file', $uuid);
|
||||
if ($file) {
|
||||
$node->setAttribute('src', file_url_transform_relative(file_create_url($file->getFileUri())));
|
||||
}
|
||||
}
|
||||
|
||||
// Only process the first occurrence of each file UUID.
|
||||
if (!isset($processed_uuids[$uuid])) {
|
||||
$processed_uuids[$uuid] = TRUE;
|
||||
|
@ -81,6 +91,7 @@ class EditorFileReference extends FilterBase implements ContainerFactoryPluginIn
|
|||
}
|
||||
}
|
||||
}
|
||||
$result->setProcessedText(Html::serialize($dom));
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
|
|
@ -4,6 +4,7 @@ namespace Drupal\editor\Plugin\InPlaceEditor;
|
|||
|
||||
use Drupal\Component\Plugin\PluginBase;
|
||||
use Drupal\Core\Field\FieldItemListInterface;
|
||||
use Drupal\filter\Entity\FilterFormat;
|
||||
use Drupal\quickedit\Plugin\InPlaceEditorInterface;
|
||||
use Drupal\filter\Plugin\FilterInterface;
|
||||
|
||||
|
@ -11,8 +12,7 @@ use Drupal\filter\Plugin\FilterInterface;
|
|||
* Defines the formatted text in-place editor.
|
||||
*
|
||||
* @InPlaceEditor(
|
||||
* id = "editor",
|
||||
* alternativeTo = {"plain_text"}
|
||||
* id = "editor"
|
||||
* )
|
||||
*/
|
||||
class Editor extends PluginBase implements InPlaceEditorInterface {
|
||||
|
@ -30,16 +30,14 @@ class Editor extends PluginBase implements InPlaceEditorInterface {
|
|||
// This editor is compatible with formatted ("rich") text fields; but only
|
||||
// if there is a currently active text format, that text format has an
|
||||
// associated editor and that editor supports inline editing.
|
||||
elseif (in_array($field_definition->getType(), array('text', 'text_long', 'text_with_summary'), TRUE)) {
|
||||
if ($editor = editor_load($items[0]->format)) {
|
||||
$definition = \Drupal::service('plugin.manager.editor')->getDefinition($editor->getEditor());
|
||||
if ($definition['supports_inline_editing'] === TRUE) {
|
||||
return TRUE;
|
||||
}
|
||||
elseif ($editor = editor_load($items[0]->format)) {
|
||||
$definition = \Drupal::service('plugin.manager.editor')->getDefinition($editor->getEditor());
|
||||
if ($definition['supports_inline_editing'] === TRUE) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -61,7 +59,7 @@ class Editor extends PluginBase implements InPlaceEditorInterface {
|
|||
* @return bool
|
||||
*/
|
||||
protected function textFormatHasTransformationFilters($format_id) {
|
||||
$format = entity_load('filter_format', $format_id);
|
||||
$format = FilterFormat::load($format_id);
|
||||
return (bool) count(array_intersect(array(FilterInterface::TYPE_TRANSFORM_REVERSIBLE, FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE), $format->getFiltertypes()));
|
||||
}
|
||||
|
||||
|
|
83
core/modules/editor/src/Tests/EditorDialogAccessTest.php
Normal file
83
core/modules/editor/src/Tests/EditorDialogAccessTest.php
Normal file
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\editor\Tests;
|
||||
|
||||
use Drupal\Core\Url;
|
||||
use Drupal\editor\Entity\Editor;
|
||||
use Drupal\Tests\BrowserTestBase;
|
||||
|
||||
/**
|
||||
* Test access to the editor dialog forms.
|
||||
*
|
||||
* @group editor
|
||||
*/
|
||||
class EditorDialogAccessTest extends BrowserTestBase {
|
||||
|
||||
/**
|
||||
* Modules to install.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['editor', 'filter', 'ckeditor'];
|
||||
|
||||
/**
|
||||
* Test access to the editor image dialog.
|
||||
*/
|
||||
public function testEditorImageDialogAccess() {
|
||||
$url = Url::fromRoute('editor.image_dialog', ['editor' => 'plain_text']);
|
||||
$session = $this->assertSession();
|
||||
|
||||
// With no text editor, expect a 404.
|
||||
$this->drupalGet($url);
|
||||
$session->statusCodeEquals(404);
|
||||
|
||||
// With a text editor but without image upload settings, expect a 200, but
|
||||
// there should not be an input[type=file].
|
||||
$editor = Editor::create([
|
||||
'editor' => 'ckeditor',
|
||||
'format' => 'plain_text',
|
||||
'settings' => [
|
||||
'toolbar' => [
|
||||
'rows' => [
|
||||
[
|
||||
[
|
||||
'name' => 'Media',
|
||||
'items' => [
|
||||
'DrupalImage',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
'plugins' => [],
|
||||
],
|
||||
'image_upload' => [
|
||||
'status' => FALSE,
|
||||
'scheme' => 'public',
|
||||
'directory' => 'inline-images',
|
||||
'max_size' => '',
|
||||
'max_dimensions' => [
|
||||
'width' => 0,
|
||||
'height' => 0,
|
||||
],
|
||||
],
|
||||
]);
|
||||
$editor->save();
|
||||
$this->resetAll();
|
||||
$this->drupalGet($url);
|
||||
$this->assertTrue($this->cssSelect('input[type=text][name="attributes[src]"]'), 'Image uploads disabled: input[type=text][name="attributes[src]"] is present.');
|
||||
$this->assertFalse($this->cssSelect('input[type=file]'), 'Image uploads disabled: input[type=file] is absent.');
|
||||
$session->statusCodeEquals(200);
|
||||
|
||||
// With image upload settings, expect a 200, and now there should be an
|
||||
// input[type=file].
|
||||
$editor->setImageUploadSettings(['status' => TRUE] + $editor->getImageUploadSettings())
|
||||
->save();
|
||||
$this->resetAll();
|
||||
$this->drupalGet($url);
|
||||
$this->assertFalse($this->cssSelect('input[type=text][name="attributes[src]"]'), 'Image uploads enabled: input[type=text][name="attributes[src]"] is absent.');
|
||||
$this->assertTrue($this->cssSelect('input[type=file]'), 'Image uploads enabled: input[type=file] is present.');
|
||||
$session->statusCodeEquals(200);
|
||||
}
|
||||
|
||||
}
|
|
@ -50,8 +50,8 @@ class EditorUploadImageScaleTest extends WebTestBase {
|
|||
'directory' => 'inline-images',
|
||||
'max_size' => '',
|
||||
'max_dimensions' => [
|
||||
'width' => '',
|
||||
'height' => ''
|
||||
'width' => NULL,
|
||||
'height' => NULL
|
||||
],
|
||||
]
|
||||
])->save();
|
||||
|
@ -71,9 +71,10 @@ class EditorUploadImageScaleTest extends WebTestBase {
|
|||
// Case 1: no max dimensions set: uploaded image not scaled.
|
||||
$test_image = $testing_image_list[0];
|
||||
list($image_file_width, $image_file_height) = $this->getTestImageInfo($test_image->uri);
|
||||
$max_width = '';
|
||||
$max_height = '';
|
||||
$max_width = NULL;
|
||||
$max_height = NULL;
|
||||
$this->setMaxDimensions($max_width, $max_height);
|
||||
$this->assertSavedMaxDimensions($max_width, $max_height);
|
||||
list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri);
|
||||
$this->assertEqual($uploaded_image_file_width, $image_file_width);
|
||||
$this->assertEqual($uploaded_image_file_height, $image_file_height);
|
||||
|
@ -85,6 +86,7 @@ class EditorUploadImageScaleTest extends WebTestBase {
|
|||
$max_width = $image_file_width - 5;
|
||||
$max_height = $image_file_height;
|
||||
$this->setMaxDimensions($max_width, $max_height);
|
||||
$this->assertSavedMaxDimensions($max_width, $max_height);
|
||||
list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri);
|
||||
$this->assertEqual($uploaded_image_file_width, $max_width);
|
||||
$this->assertEqual($uploaded_image_file_height, $uploaded_image_file_height * ($uploaded_image_file_width / $max_width));
|
||||
|
@ -96,6 +98,7 @@ class EditorUploadImageScaleTest extends WebTestBase {
|
|||
$max_width = $image_file_width;
|
||||
$max_height = $image_file_height - 5;
|
||||
$this->setMaxDimensions($max_width, $max_height);
|
||||
$this->assertSavedMaxDimensions($max_width, $max_height);
|
||||
list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri);
|
||||
$this->assertEqual($uploaded_image_file_width, $uploaded_image_file_width * ($uploaded_image_file_height / $max_height));
|
||||
$this->assertEqual($uploaded_image_file_height, $max_height);
|
||||
|
@ -107,10 +110,37 @@ class EditorUploadImageScaleTest extends WebTestBase {
|
|||
$max_width = $image_file_width + 5;
|
||||
$max_height = $image_file_height + 5;
|
||||
$this->setMaxDimensions($max_width, $max_height);
|
||||
$this->assertSavedMaxDimensions($max_width, $max_height);
|
||||
list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri);
|
||||
$this->assertEqual($uploaded_image_file_width, $image_file_width);
|
||||
$this->assertEqual($uploaded_image_file_height, $image_file_height);
|
||||
$this->assertNoRaw(t('The image was resized to fit within the maximum allowed dimensions of %dimensions pixels.', ['%dimensions' => $max_width . 'x' . $max_height]));
|
||||
|
||||
// Case 5: only max width dimension was provided and it was smaller than
|
||||
// uploaded image: image scaled down.
|
||||
$test_image = $testing_image_list[4];
|
||||
list($image_file_width, $image_file_height) = $this->getTestImageInfo($test_image->uri);
|
||||
$max_width = $image_file_width - 5;
|
||||
$max_height = NULL;
|
||||
$this->setMaxDimensions($max_width, $max_height);
|
||||
$this->assertSavedMaxDimensions($max_width, $max_height);
|
||||
list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri);
|
||||
$this->assertEqual($uploaded_image_file_width, $max_width);
|
||||
$this->assertEqual($uploaded_image_file_height, $uploaded_image_file_height * ($uploaded_image_file_width / $max_width));
|
||||
$this->assertRaw(t('The image was resized to fit within the maximum allowed width of %width pixels.', ['%width' => $max_width]));
|
||||
|
||||
// Case 6: only max height dimension was provided and it was smaller than
|
||||
// uploaded image: image scaled down.
|
||||
$test_image = $testing_image_list[5];
|
||||
list($image_file_width, $image_file_height) = $this->getTestImageInfo($test_image->uri);
|
||||
$max_width = NULL;
|
||||
$max_height = $image_file_height - 5;
|
||||
$this->setMaxDimensions($max_width, $max_height);
|
||||
$this->assertSavedMaxDimensions($max_width, $max_height);
|
||||
list($uploaded_image_file_width, $uploaded_image_file_height) = $this->uploadImage($test_image->uri);
|
||||
$this->assertEqual($uploaded_image_file_width, $uploaded_image_file_width * ($uploaded_image_file_height / $max_height));
|
||||
$this->assertEqual($uploaded_image_file_height, $max_height);
|
||||
$this->assertRaw(t('The image was resized to fit within the maximum allowed height of %height pixels.', ['%height' => $max_height]));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -169,4 +199,25 @@ class EditorUploadImageScaleTest extends WebTestBase {
|
|||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts whether the saved maximum dimensions equal the ones provided.
|
||||
*
|
||||
* @param string $width
|
||||
* The expected width of the uploaded image.
|
||||
* @param string $height
|
||||
* The expected height of the uploaded image.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function assertSavedMaxDimensions($width, $height) {
|
||||
$image_upload_settings = Editor::load('basic_html')->getImageUploadSettings();
|
||||
$expected = [
|
||||
'width' => $image_upload_settings['max_dimensions']['width'],
|
||||
'height' => $image_upload_settings['max_dimensions']['height'],
|
||||
];
|
||||
$same_width = $this->assertEqual($width, $expected['width'], 'Actual width of "' . $width . '" equals the expected width of "' . $expected['width'] . '"');
|
||||
$same_height = $this->assertEqual($height, $expected['height'], 'Actual height of "' . $height . '" equals the expected width of "' . $expected['height'] . '"');
|
||||
return $same_width && $same_height;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -102,7 +102,7 @@ class QuickEditIntegrationLoadingTest extends WebTestBase {
|
|||
// Ensure the text is transformed.
|
||||
$this->assertRaw('<p>Do you also love Drupal?</p><figure role="group" class="caption caption-img"><img src="druplicon.png" /><figcaption>Druplicon</figcaption></figure>');
|
||||
|
||||
$response = $this->drupalPost('editor/' . 'node/1/body/en/full', 'application/vnd.drupal-ajax', array());
|
||||
$response = $this->drupalPost('editor/' . 'node/1/body/en/full', '', [], ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax']]);
|
||||
$this->assertResponse(200);
|
||||
$ajax_commands = Json::decode($response);
|
||||
$this->assertIdentical(1, count($ajax_commands), 'The untransformed text POST request results in one AJAX command.');
|
||||
|
|
|
@ -76,20 +76,23 @@ class EditorFileReferenceFilterTest extends KernelTestBase {
|
|||
|
||||
$this->pass('One data-entity-uuid attribute.');
|
||||
$input = '<img src="llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$expected_output = '<img src="/' . $this->siteDirectory . '/files/llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$output = $test($input);
|
||||
$this->assertIdentical($input, $output->getProcessedText());
|
||||
$this->assertIdentical($expected_output, $output->getProcessedText());
|
||||
$this->assertEqual($cache_tag, $output->getCacheTags());
|
||||
|
||||
$this->pass('One data-entity-uuid attribute with odd capitalization.');
|
||||
$input = '<img src="llama.jpg" data-entity-type="file" DATA-entity-UUID = "' . $uuid . '" />';
|
||||
$expected_output = '<img src="/' . $this->siteDirectory . '/files/llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$output = $test($input);
|
||||
$this->assertIdentical($input, $output->getProcessedText());
|
||||
$this->assertIdentical($expected_output, $output->getProcessedText());
|
||||
$this->assertEqual($cache_tag, $output->getCacheTags());
|
||||
|
||||
$this->pass('One data-entity-uuid attribute on a non-image tag.');
|
||||
$input = '<video src="llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$expected_output = '<video src="/' . $this->siteDirectory . '/files/llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '"></video>';
|
||||
$output = $test($input);
|
||||
$this->assertIdentical($input, $output->getProcessedText());
|
||||
$this->assertIdentical($expected_output, $output->getProcessedText());
|
||||
$this->assertEqual($cache_tag, $output->getCacheTags());
|
||||
|
||||
$this->pass('One data-entity-uuid attribute with an invalid value.');
|
||||
|
@ -101,15 +104,19 @@ class EditorFileReferenceFilterTest extends KernelTestBase {
|
|||
$this->pass('Two different data-entity-uuid attributes.');
|
||||
$input = '<img src="llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$input .= '<img src="alpaca.jpg" data-entity-type="file" data-entity-uuid="' . $uuid_2 . '" />';
|
||||
$expected_output = '<img src="/' . $this->siteDirectory . '/files/llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$expected_output .= '<img src="/' . $this->siteDirectory . '/files/alpaca.jpg" data-entity-type="file" data-entity-uuid="' . $uuid_2 . '" />';
|
||||
$output = $test($input);
|
||||
$this->assertIdentical($input, $output->getProcessedText());
|
||||
$this->assertIdentical($expected_output, $output->getProcessedText());
|
||||
$this->assertEqual(Cache::mergeTags($cache_tag, $cache_tag_2), $output->getCacheTags());
|
||||
|
||||
$this->pass('Two identical data-entity-uuid attributes.');
|
||||
$input = '<img src="llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$input .= '<img src="llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$expected_output = '<img src="/' . $this->siteDirectory . '/files/llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$expected_output .= '<img src="/' . $this->siteDirectory . '/files/llama.jpg" data-entity-type="file" data-entity-uuid="' . $uuid . '" />';
|
||||
$output = $test($input);
|
||||
$this->assertIdentical($input, $output->getProcessedText());
|
||||
$this->assertIdentical($expected_output, $output->getProcessedText());
|
||||
$this->assertEqual($cache_tag, $output->getCacheTags());
|
||||
}
|
||||
|
||||
|
|
|
@ -17,11 +17,11 @@ use Drupal\node\Entity\NodeType;
|
|||
class EditorImageDialogTest extends EntityKernelTestBase {
|
||||
|
||||
/**
|
||||
* Filter format for testing.
|
||||
* Text editor config entity for testing.
|
||||
*
|
||||
* @var \Drupal\filter\FilterFormatInterface
|
||||
* @var \Drupal\editor\EditorInterface
|
||||
*/
|
||||
protected $format;
|
||||
protected $editor;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
|
@ -42,7 +42,7 @@ class EditorImageDialogTest extends EntityKernelTestBase {
|
|||
$this->installConfig(['node']);
|
||||
|
||||
// Add text formats.
|
||||
$this->format = FilterFormat::create([
|
||||
$format = FilterFormat::create([
|
||||
'format' => 'filtered_html',
|
||||
'name' => 'Filtered HTML',
|
||||
'weight' => 0,
|
||||
|
@ -51,7 +51,7 @@ class EditorImageDialogTest extends EntityKernelTestBase {
|
|||
'filter_caption' => ['status' => TRUE],
|
||||
],
|
||||
]);
|
||||
$this->format->save();
|
||||
$format->save();
|
||||
|
||||
// Set up text editor.
|
||||
$editor = Editor::create([
|
||||
|
@ -65,6 +65,7 @@ class EditorImageDialogTest extends EntityKernelTestBase {
|
|||
],
|
||||
]);
|
||||
$editor->save();
|
||||
$this->editor = $editor;
|
||||
|
||||
// Create a node type for testing.
|
||||
$type = NodeType::create(['type' => 'page', 'name' => 'page']);
|
||||
|
@ -104,7 +105,7 @@ class EditorImageDialogTest extends EntityKernelTestBase {
|
|||
$form_state = (new FormState())
|
||||
->setRequestMethod('POST')
|
||||
->setUserInput($input)
|
||||
->addBuildInfo('args', [$this->format]);
|
||||
->addBuildInfo('args', [$this->editor]);
|
||||
|
||||
$form_builder = $this->container->get('form_builder');
|
||||
$form_object = new EditorImageDialog(\Drupal::entityManager()->getStorage('file'));
|
||||
|
|
|
@ -121,7 +121,9 @@ class QuickEditIntegrationTest extends QuickEditTestBase {
|
|||
* Returns the selected in-place editor.
|
||||
*/
|
||||
protected function getSelectedEditor($entity_id, $field_name, $view_mode = 'default') {
|
||||
$entity = entity_load('entity_test', $entity_id, TRUE);
|
||||
$storage = $this->container->get('entity_type.manager')->getStorage('entity_test');
|
||||
$storage->resetCache([$entity_id]);
|
||||
$entity = $storage->load($entity_id);
|
||||
$items = $entity->get($field_name);
|
||||
$options = entity_get_display('entity_test', 'entity_test', $view_mode)->getComponent($field_name);
|
||||
return $this->editorSelector->getEditor($options['type'], $items);
|
||||
|
@ -172,7 +174,7 @@ class QuickEditIntegrationTest extends QuickEditTestBase {
|
|||
$entity->{$this->fieldName}->value = 'Test';
|
||||
$entity->{$this->fieldName}->format = 'full_html';
|
||||
$entity->save();
|
||||
$entity = entity_load('entity_test', $entity->id());
|
||||
$entity = EntityTest::load($entity->id());
|
||||
|
||||
// Verify metadata.
|
||||
$items = $entity->get($this->fieldName);
|
||||
|
@ -209,7 +211,7 @@ class QuickEditIntegrationTest extends QuickEditTestBase {
|
|||
$entity->{$this->fieldName}->value = 'Test';
|
||||
$entity->{$this->fieldName}->format = 'full_html';
|
||||
$entity->save();
|
||||
$entity = entity_load('entity_test', $entity->id());
|
||||
$entity = EntityTest::load($entity->id());
|
||||
|
||||
// Verify AJAX response.
|
||||
$controller = new EditorController();
|
||||
|
|
Reference in a new issue