Update to drupal 8.0.0-rc1. For more information, see https://www.drupal.org/node/2582663
This commit is contained in:
parent
eb34d130a8
commit
f32e58e4b1
8476 changed files with 211648 additions and 170042 deletions
|
@ -7,8 +7,7 @@
|
|||
|
||||
namespace Drupal\editor\Ajax;
|
||||
|
||||
use Drupal\Core\Ajax\CommandInterface;
|
||||
use Drupal\quickedit\Ajax\BaseCommand;
|
||||
use Drupal\Core\Ajax\BaseCommand;
|
||||
|
||||
/**
|
||||
* AJAX command to rerender a formatted text field without any transformation
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace Drupal\editor;
|
|||
use Drupal\editor\Entity\Editor;
|
||||
use Drupal\filter\Entity\FilterFormat;
|
||||
use Drupal\Component\Plugin\PluginManagerInterface;
|
||||
use Drupal\Core\Render\BubbleableMetadata;
|
||||
|
||||
/**
|
||||
* Defines a service for Text Editor's render elements.
|
||||
|
@ -93,7 +94,7 @@ class Element {
|
|||
$element['#attached']['library'][] = 'editor/drupal.editor';
|
||||
|
||||
// Attach attachments for all available editors.
|
||||
$element['#attached'] = drupal_merge_attached($element['#attached'], $this->pluginManager->getAttachments($format_ids));
|
||||
$element['#attached'] = BubbleableMetadata::mergeAttachments($element['#attached'], $this->pluginManager->getAttachments($format_ids));
|
||||
|
||||
// Apply XSS filters when editing content if necessary. Some types of text
|
||||
// editors cannot guarantee that the end user won't become a victim of XSS.
|
||||
|
|
|
@ -107,7 +107,7 @@ class Editor extends ConfigEntityBase implements EditorInterface {
|
|||
// config entity and dependency on provider is managed automatically.
|
||||
$definition = $this->editorPluginManager()->createInstance($this->editor)->getPluginDefinition();
|
||||
$this->addDependency('module', $definition['provider']);
|
||||
return $this->dependencies;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -63,12 +63,22 @@ class EditorImageDialog extends FormBase {
|
|||
* The filter format for which this dialog corresponds.
|
||||
*/
|
||||
public function buildForm(array $form, FormStateInterface $form_state, FilterFormat $filter_format = NULL) {
|
||||
// The default values are set directly from \Drupal::request()->request,
|
||||
// provided by the editor plugin opening the dialog.
|
||||
if (!$image_element = $form_state->get('image_element')) {
|
||||
$user_input = $form_state->getUserInput();
|
||||
$image_element = isset($user_input['editor_object']) ? $user_input['editor_object'] : [];
|
||||
// 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
|
||||
// receiving values from the form, instead of the values from the text
|
||||
// editor. If we don't cache it, this data will be lost.
|
||||
if (isset($form_state->getUserInput()['editor_object'])) {
|
||||
// By convention, the data that the text editor sends to any dialog is in
|
||||
// the 'editor_object' key. And the image dialog for text editors expects
|
||||
// that data to be the attributes for an <img> element.
|
||||
$image_element = $form_state->getUserInput()['editor_object'];
|
||||
$form_state->set('image_element', $image_element);
|
||||
$form_state->setCached(TRUE);
|
||||
}
|
||||
else {
|
||||
// Retrieve the image element's attributes from form state.
|
||||
$image_element = $form_state->get('image_element') ?: [];
|
||||
}
|
||||
|
||||
$form['#tree'] = TRUE;
|
||||
|
@ -143,41 +153,6 @@ class EditorImageDialog extends FormBase {
|
|||
'#default_value' => $alt,
|
||||
'#maxlength' => 2048,
|
||||
);
|
||||
$form['dimensions'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => $this->t('Image size'),
|
||||
'#attributes' => array('class' => array(
|
||||
'container-inline',
|
||||
'fieldgroup',
|
||||
'form-composite',
|
||||
)),
|
||||
);
|
||||
$form['dimensions']['width'] = array(
|
||||
'#title' => $this->t('Width'),
|
||||
'#title_display' => 'invisible',
|
||||
'#type' => 'number',
|
||||
'#default_value' => isset($image_element['width']) ? $image_element['width'] : '',
|
||||
'#size' => 8,
|
||||
'#maxlength' => 8,
|
||||
'#min' => 1,
|
||||
'#max' => 99999,
|
||||
'#placeholder' => $this->t('width'),
|
||||
'#field_suffix' => ' × ',
|
||||
'#parents' => array('attributes', 'width'),
|
||||
);
|
||||
$form['dimensions']['height'] = array(
|
||||
'#title' => $this->t('Height'),
|
||||
'#title_display' => 'invisible',
|
||||
'#type' => 'number',
|
||||
'#default_value' => isset($image_element['height']) ? $image_element['height'] : '',
|
||||
'#size' => 8,
|
||||
'#maxlength' => 8,
|
||||
'#min' => 1,
|
||||
'#max' => 99999,
|
||||
'#placeholder' => $this->t('height'),
|
||||
'#field_suffix' => $this->t('pixels'),
|
||||
'#parents' => array('attributes', 'height'),
|
||||
);
|
||||
|
||||
// When Drupal core's filter_align is being used, the text editor may
|
||||
// offer the ability to change the alignment.
|
||||
|
|
|
@ -61,7 +61,7 @@ class EditorManager extends DefaultPluginManager {
|
|||
* @return array
|
||||
* An array of attachments, for use with #attached.
|
||||
*
|
||||
* @see drupal_process_attached()
|
||||
* @see \Drupal\Core\Render\AttachmentsResponseProcessorInterface::processAttachments()
|
||||
*/
|
||||
public function getAttachments(array $format_ids) {
|
||||
$attachments = array('library' => array());
|
||||
|
|
|
@ -95,7 +95,7 @@ interface EditorPluginInterface extends PluginInspectionInterface {
|
|||
* An array of settings that will be added to the page for use by this text
|
||||
* editor's JavaScript integration.
|
||||
*
|
||||
* @see drupal_process_attached()
|
||||
* @see \Drupal\Core\Render\AttachmentsResponseProcessorInterface::processAttachments()
|
||||
* @see EditorManager::getAttachments()
|
||||
*/
|
||||
public function getJSSettings(Editor $editor);
|
||||
|
@ -114,7 +114,7 @@ interface EditorPluginInterface extends PluginInspectionInterface {
|
|||
* An array of libraries that will be added to the page for use by this text
|
||||
* editor.
|
||||
*
|
||||
* @see drupal_process_attached()
|
||||
* @see \Drupal\Core\Render\AttachmentsResponseProcessorInterface::processAttachments()
|
||||
* @see EditorManager::getAttachments()
|
||||
*/
|
||||
public function getLibraries(Editor $editor);
|
||||
|
|
134
core/modules/editor/src/Tests/EditorImageDialogTest.php
Normal file
134
core/modules/editor/src/Tests/EditorImageDialogTest.php
Normal file
|
@ -0,0 +1,134 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\editor\Tests\EditorImageDialogTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\editor\Tests;
|
||||
|
||||
use Drupal\Core\Form\FormInterface;
|
||||
use Drupal\Core\Form\FormState;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\Core\Render\Element\PathElement;
|
||||
use Drupal\Core\Url;
|
||||
use Drupal\editor\Entity\Editor;
|
||||
use Drupal\editor\Form\EditorImageDialog;
|
||||
use Drupal\filter\Entity\FilterFormat;
|
||||
use Drupal\node\Entity\NodeType;
|
||||
use Drupal\simpletest\KernelTestBase;
|
||||
use Drupal\system\Tests\Entity\EntityUnitTestBase;
|
||||
use Drupal\user\Entity\Role;
|
||||
use Drupal\user\Entity\User;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
/**
|
||||
* Tests EditorImageDialog validation and conversion functionality.
|
||||
*
|
||||
* @group editor
|
||||
*/
|
||||
class EditorImageDialogTest extends EntityUnitTestBase {
|
||||
|
||||
/**
|
||||
* Filter format for testing.
|
||||
*
|
||||
* @var \Drupal\filter\FilterFormatInterface
|
||||
*/
|
||||
protected $format;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['node', 'file', 'editor', 'editor_test', 'user', 'system'];
|
||||
|
||||
/**
|
||||
* Sets up the test.
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->installEntitySchema('file');
|
||||
$this->installSchema('system', ['router', 'key_value_expire']);
|
||||
$this->installSchema('node', array('node_access'));
|
||||
$this->installSchema('file', array('file_usage'));
|
||||
$this->installConfig(['node']);
|
||||
|
||||
// Add text formats.
|
||||
$this->format = FilterFormat::create([
|
||||
'format' => 'filtered_html',
|
||||
'name' => 'Filtered HTML',
|
||||
'weight' => 0,
|
||||
'filters' => [
|
||||
'filter_align' => ['status' => TRUE],
|
||||
'filter_caption' => ['status' => TRUE],
|
||||
],
|
||||
]);
|
||||
$this->format->save();
|
||||
|
||||
// Set up text editor.
|
||||
$editor = Editor::create([
|
||||
'format' => 'filtered_html',
|
||||
'editor' => 'unicorn',
|
||||
'image_upload' => [
|
||||
'max_size' => 100,
|
||||
'scheme' => 'public',
|
||||
'directory' => '',
|
||||
'status' => TRUE,
|
||||
],
|
||||
]);
|
||||
$editor->save();
|
||||
|
||||
// Create a node type for testing.
|
||||
$type = NodeType::create(['type' => 'page', 'name' => 'page']);
|
||||
$type->save();
|
||||
node_add_body_field($type);
|
||||
$this->installEntitySchema('user');
|
||||
\Drupal::service('router.builder')->rebuild();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that editor image dialog works as expected.
|
||||
*/
|
||||
public function testEditorImageDialog() {
|
||||
$input = [
|
||||
'editor_object' => [
|
||||
'src' => '/sites/default/files/inline-images/somefile.png',
|
||||
'alt' => 'fda',
|
||||
'width' => '',
|
||||
'height' => '',
|
||||
'data-entity-type' => 'file',
|
||||
'data-entity-uuid' => 'some-uuid',
|
||||
'data-align' => 'none',
|
||||
'hasCaption' => 'false',
|
||||
],
|
||||
'dialogOptions' => [
|
||||
'title' => 'Edit Image',
|
||||
'dialogClass' => 'editor-image-dialog',
|
||||
'autoResize' => 'true',
|
||||
],
|
||||
'_drupal_ajax' => '1',
|
||||
'ajax_page_state' => [
|
||||
'theme' => 'bartik',
|
||||
'theme_token' => 'some-token',
|
||||
'libraries' => '',
|
||||
],
|
||||
];
|
||||
$form_state = (new FormState())
|
||||
->setRequestMethod('POST')
|
||||
->setUserInput($input)
|
||||
->addBuildInfo('args', [$this->format]);
|
||||
|
||||
$form_builder = $this->container->get('form_builder');
|
||||
$form_object = new EditorImageDialog(\Drupal::entityManager()->getStorage('file'));
|
||||
$form_id = $form_builder->getFormId($form_object, $form_state);
|
||||
$form = $form_builder->retrieveForm($form_id, $form_state);
|
||||
$form_builder->prepareForm($form_id, $form, $form_state);
|
||||
$form_builder->processForm($form_id, $form, $form_state);
|
||||
|
||||
// Assert these two values are present and we don't get the 'not-this'
|
||||
// default back.
|
||||
$this->assertEqual(FALSE, $form_state->getValue(['attributes', 'hasCaption'], 'not-this'));
|
||||
}
|
||||
|
||||
}
|
|
@ -86,7 +86,7 @@ class QuickEditIntegrationLoadingTest extends WebTestBase {
|
|||
$this->drupalGet('node/1');
|
||||
|
||||
// Ensure the text is transformed.
|
||||
$this->assertRaw('<p>Do you also love Drupal?</p><figure class="caption caption-img"><img src="druplicon.png" /><figcaption>Druplicon</figcaption></figure>');
|
||||
$this->assertRaw('<p>Do you also love Drupal?</p><figure role="group" class="caption caption-img"><img src="druplicon.png" /><figcaption>Druplicon</figcaption></figure>');
|
||||
|
||||
// Retrieving the untransformed text should result in an empty 403 response.
|
||||
$response = $this->drupalPost('editor/' . 'node/1/body/en/full', '', array(), array('query' => array(MainContentViewSubscriber::WRAPPER_FORMAT => 'drupal_ajax')));
|
||||
|
@ -104,7 +104,7 @@ class QuickEditIntegrationLoadingTest extends WebTestBase {
|
|||
$this->drupalGet('node/1');
|
||||
|
||||
// Ensure the text is transformed.
|
||||
$this->assertRaw('<p>Do you also love Drupal?</p><figure class="caption caption-img"><img src="druplicon.png" /><figcaption>Druplicon</figcaption></figure>');
|
||||
$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());
|
||||
$this->assertResponse(200);
|
||||
|
|
|
@ -117,7 +117,7 @@ class QuickEditIntegrationTest extends QuickEditTestBase {
|
|||
*/
|
||||
protected function getSelectedEditor($entity_id, $field_name, $view_mode = 'default') {
|
||||
$entity = entity_load('entity_test', $entity_id, TRUE);
|
||||
$items = $entity->getTranslation(LanguageInterface::LANGCODE_NOT_SPECIFIED)->get($field_name);
|
||||
$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);
|
||||
}
|
||||
|
@ -170,7 +170,7 @@ class QuickEditIntegrationTest extends QuickEditTestBase {
|
|||
$entity = entity_load('entity_test', $entity->id());
|
||||
|
||||
// Verify metadata.
|
||||
$items = $entity->getTranslation(LanguageInterface::LANGCODE_NOT_SPECIFIED)->get($this->fieldName);
|
||||
$items = $entity->get($this->fieldName);
|
||||
$metadata = $this->metadataGenerator->generateFieldMetadata($items, 'default');
|
||||
$expected = array(
|
||||
'access' => TRUE,
|
||||
|
@ -209,7 +209,7 @@ class QuickEditIntegrationTest extends QuickEditTestBase {
|
|||
// Verify AJAX response.
|
||||
$controller = new EditorController();
|
||||
$request = new Request();
|
||||
$response = $controller->getUntransformedText($entity, $this->fieldName, LanguageInterface::LANGCODE_NOT_SPECIFIED, 'default');
|
||||
$response = $controller->getUntransformedText($entity, $this->fieldName, LanguageInterface::LANGCODE_DEFAULT, 'default');
|
||||
$expected = array(
|
||||
array(
|
||||
'command' => 'editorGetUntransformedText',
|
||||
|
|
75
core/modules/editor/src/Tests/Update/EditorUpdateTest.php
Normal file
75
core/modules/editor/src/Tests/Update/EditorUpdateTest.php
Normal file
|
@ -0,0 +1,75 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\editor\Tests\Update\EditorUpdateTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\editor\Tests\Update;
|
||||
|
||||
use Drupal\system\Tests\Update\UpdatePathTestBase;
|
||||
|
||||
/**
|
||||
* Tests Editor module database updates.
|
||||
*
|
||||
* @group editor
|
||||
*/
|
||||
class EditorUpdateTest extends UpdatePathTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setDatabaseDumpFiles() {
|
||||
$this->databaseDumpFiles = [
|
||||
__DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
|
||||
// Simulate an un-synchronized environment.
|
||||
__DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.editor-editor_update_8001.php',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests editor_update_8001().
|
||||
*
|
||||
* @see editor_update_8001()
|
||||
*/
|
||||
public function testEditorUpdate8001() {
|
||||
/** @var \Drupal\Core\Config\ConfigFactoryInterface $config_factory */
|
||||
$config_factory = $this->container->get('config.factory');
|
||||
|
||||
$format_basic_html = $config_factory->get('filter.format.basic_html');
|
||||
$editor_basic_html = $config_factory->get('editor.editor.basic_html');
|
||||
$format_full_html = $config_factory->get('filter.format.full_html');
|
||||
$editor_full_html = $config_factory->get('editor.editor.full_html');
|
||||
|
||||
// Checks if the 'basic_html' format and editor statuses differ.
|
||||
$this->assertTrue($format_basic_html->get('status'));
|
||||
$this->assertFalse($editor_basic_html->get('status'));
|
||||
$this->assertNotIdentical($format_basic_html->get('status'), $editor_basic_html->get('status'));
|
||||
|
||||
// Checks if the 'full_html' format and editor statuses differ.
|
||||
$this->assertFalse($format_full_html->get('status'));
|
||||
$this->assertTrue($editor_full_html->get('status'));
|
||||
$this->assertNotIdentical($format_full_html->get('status'), $editor_full_html->get('status'));
|
||||
|
||||
|
||||
// Run updates.
|
||||
$this->runUpdates();
|
||||
|
||||
// Reload text formats and editors.
|
||||
$format_basic_html = $config_factory->get('filter.format.basic_html');
|
||||
$editor_basic_html = $config_factory->get('editor.editor.basic_html');
|
||||
$format_full_html = $config_factory->get('filter.format.full_html');
|
||||
$editor_full_html = $config_factory->get('editor.editor.full_html');
|
||||
|
||||
// Checks if the 'basic_html' format and editor statuses are in sync.
|
||||
$this->assertTrue($format_basic_html->get('status'));
|
||||
$this->assertTrue($editor_basic_html->get('status'));
|
||||
$this->assertIdentical($format_basic_html->get('status'), $editor_basic_html->get('status'));
|
||||
|
||||
// Checks if the 'full_html' format and editor statuses are in sync.
|
||||
$this->assertFalse($format_full_html->get('status'));
|
||||
$this->assertFalse($editor_full_html->get('status'));
|
||||
$this->assertIdentical($format_full_html->get('status'), $editor_full_html->get('status'));
|
||||
}
|
||||
|
||||
}
|
Reference in a new issue