/** * Tests the configurable text editor manager. */ public function testManager() { $this->editorManager = $this->container->get('plugin.manager.editor'); // Case 1: no text editor available: // - listOptions() should return an empty list of options // - getAttachments() should return an empty #attachments array (and not // a JS settings structure that is empty) $this->assertIdentical(array(), $this->editorManager->listOptions(), 'When no text editor is enabled, the manager works correctly.'); $this->assertIdentical(array(), $this->editorManager->getAttachments(array()), 'No attachments when no text editor is enabled and retrieving attachments for zero text formats.'); $this->assertIdentical(array(), $this->editorManager->getAttachments(array('filtered_html', 'full_html')), 'No attachments when no text editor is enabled and retrieving attachments for multiple text formats.'); // Enable the Text Editor Test module, which has the Unicorn Editor and // clear the editor manager's cache so it is picked up. $this->enableModules(array('editor_test')); $this->editorManager = $this->container->get('plugin.manager.editor'); $this->editorManager->clearCachedDefinitions(); // Case 2: a text editor available. $this->assertIdentical('Unicorn Editor', (string) $this->editorManager->listOptions()['unicorn'], 'When some text editor is enabled, the manager works correctly.'); // Case 3: a text editor available & associated (but associated only with // the 'Full HTML' text format). $unicorn_plugin = $this->editorManager->createInstance('unicorn'); $editor = entity_create('editor', array('format' => 'full_html', 'editor' => 'unicorn')); $editor->save(); $this->assertIdentical(array(), $this->editorManager->getAttachments(array()), 'No attachments when one text editor is enabled and retrieving attachments for zero text formats.'); $expected = array('library' => array(0 => 'editor_test/unicorn'), 'drupalSettings' => ['editor' => ['formats' => ['full_html' => ['format' => 'full_html', 'editor' => 'unicorn', 'editorSettings' => $unicorn_plugin->getJSSettings($editor), 'editorSupportsContentFiltering' => TRUE, 'isXssSafe' => FALSE]]]]); $this->assertIdentical($expected, $this->editorManager->getAttachments(array('filtered_html', 'full_html')), 'Correct attachments when one text editor is enabled and retrieving attachments for multiple text formats.'); // Case 4: a text editor available associated, but now with its JS settings // being altered via hook_editor_js_settings_alter(). \Drupal::state()->set('editor_test_js_settings_alter_enabled', TRUE); $expected['drupalSettings']['editor']['formats']['full_html']['editorSettings']['ponyModeEnabled'] = FALSE; $this->assertIdentical($expected, $this->editorManager->getAttachments(array('filtered_html', 'full_html')), 'hook_editor_js_settings_alter() works correctly.'); }
/** * {@inheritdoc} */ public function purgeConfiguration() { // Ensure that we are getting the defined package assignment information. // An invocation of \Drupal\Core\Extension\ModuleHandler::install() or // \Drupal\Core\Extension\ModuleHandler::uninstall() could invalidate the // cached information. $this->assignerManager->clearCachedDefinitions(); $this->featuresManager->reset(); }
/** * {@inheritdoc} */ function updateConfiguration(array $types) { // Ensure that we are getting the defined language negotiation information. // An invocation of \Drupal\Core\Extension\ModuleHandler::install() or // \Drupal\Core\Extension\ModuleHandler::uninstall() could invalidate the // cached information. $this->negotiatorManager->clearCachedDefinitions(); $this->languageManager->reset(); $language_types = array(); $language_types_info = $this->languageManager->getDefinedLanguageTypesInfo(); $method_definitions = $this->getNegotiationMethods(); foreach ($language_types_info as $type => $info) { $configurable = in_array($type, $types); // The default language negotiation settings, if available, are stored in // $info['fixed']. $has_default_settings = !empty($info['fixed']); // Check whether the language type is unlocked. Only the status of // unlocked language types can be toggled between configurable and // non-configurable. if (empty($info['locked'])) { if (!$configurable && !$has_default_settings) { // If we have an unlocked non-configurable language type without // default language negotiation settings, we use the values // negotiated for the interface language which, should always be // available. $method_weights = array(LanguageNegotiationUI::METHOD_ID); $method_weights = array_flip($method_weights); $this->saveConfiguration($type, $method_weights); } } else { // The language type is locked. Locked language types with default // settings are always considered non-configurable. In turn if default // settings are missing, the language type is always considered // configurable. // If the language type is locked we can just store its default language // negotiation settings if it has some, since it is not configurable. if ($has_default_settings) { $method_weights = array(); // Default settings are in $info['fixed']. foreach ($info['fixed'] as $weight => $method_id) { if (isset($method_definitions[$method_id])) { $method_weights[$method_id] = $weight; } } $this->saveConfiguration($type, $method_weights); } else { // It was missing default settings, so force it to be configurable. $configurable = TRUE; } } // Accumulate information for each language type so it can be saved later. $language_types[$type] = $configurable; } // Store the language type configuration. $config = array('configurable' => array_keys(array_filter($language_types)), 'all' => array_keys($language_types)); $this->languageManager->saveLanguageTypesConfiguration($config); }
/** * Tests the enabling of plugins. */ function testEnabledPlugins() { $this->manager = $this->container->get('plugin.manager.ckeditor.plugin'); $editor = Editor::load('filtered_html'); // Case 1: no CKEditor plugins. $definitions = array_keys($this->manager->getDefinitions()); sort($definitions); $this->assertIdentical(array('drupalimage', 'drupalimagecaption', 'drupallink', 'internal', 'language', 'stylescombo'), $definitions, 'No CKEditor plugins found besides the built-in ones.'); $enabled_plugins = array('drupalimage' => drupal_get_path('module', 'ckeditor') . '/js/plugins/drupalimage/plugin.js', 'drupallink' => drupal_get_path('module', 'ckeditor') . '/js/plugins/drupallink/plugin.js'); $this->assertIdentical($enabled_plugins, $this->manager->getEnabledPluginFiles($editor), 'Only built-in plugins are enabled.'); $this->assertIdentical(array('internal' => NULL) + $enabled_plugins, $this->manager->getEnabledPluginFiles($editor, TRUE), 'Only the "internal" plugin is enabled.'); // Enable the CKEditor Test module, which has the Llama plugin (plus four // variations of it, to cover all possible ways a plugin can be enabled) and // clear the editor manager's cache so it is picked up. $this->enableModules(array('ckeditor_test')); $this->manager = $this->container->get('plugin.manager.ckeditor.plugin'); $this->manager->clearCachedDefinitions(); // Case 2: CKEditor plugins are available. $plugin_ids = array_keys($this->manager->getDefinitions()); sort($plugin_ids); $this->assertIdentical(array('drupalimage', 'drupalimagecaption', 'drupallink', 'internal', 'language', 'llama', 'llama_button', 'llama_contextual', 'llama_contextual_and_button', 'llama_css', 'stylescombo'), $plugin_ids, 'Additional CKEditor plugins found.'); $this->assertIdentical($enabled_plugins, $this->manager->getEnabledPluginFiles($editor), 'Only the internal plugins are enabled.'); $this->assertIdentical(array('internal' => NULL) + $enabled_plugins, $this->manager->getEnabledPluginFiles($editor, TRUE), 'Only the "internal" plugin is enabled.'); // Case 3: enable each of the newly available plugins, if possible: // a. Llama: cannot be enabled, since it does not implement // CKEditorPluginContextualInterface nor CKEditorPluginButtonsInterface. // b. LlamaContextual: enabled by adding the 'Strike' button, which is // part of another plugin! // c. LlamaButton: automatically enabled by adding its 'Llama' button. // d. LlamaContextualAndButton: enabled by either b or c. // e. LlamaCSS: automatically enabled by add its 'LlamaCSS' button. // Below, we will first enable the "Llama" button, which will cause the // LlamaButton and LlamaContextualAndButton plugins to be enabled. Then we // will remove the "Llama" button and add the "Strike" button, which will // cause the LlamaContextual and LlamaContextualAndButton plugins to be // enabled. Then we will add the "Strike" button back again, which would // cause LlamaButton, LlamaContextual and LlamaContextualAndButton to be // enabled. Finally, we will add the "LlamaCSS" button which would cause // all four plugins to be enabled. $settings = $editor->getSettings(); $original_toolbar = $settings['toolbar']; $settings['toolbar']['rows'][0][0]['items'][] = 'Llama'; $editor->setSettings($settings); $editor->save(); $file = array(); $file['b'] = drupal_get_path('module', 'ckeditor_test') . '/js/llama_button.js'; $file['c'] = drupal_get_path('module', 'ckeditor_test') . '/js/llama_contextual.js'; $file['cb'] = drupal_get_path('module', 'ckeditor_test') . '/js/llama_contextual_and_button.js'; $file['css'] = drupal_get_path('module', 'ckeditor_test') . '/js/llama_css.js'; $expected = $enabled_plugins + array('llama_button' => $file['b'], 'llama_contextual_and_button' => $file['cb']); $this->assertIdentical($expected, $this->manager->getEnabledPluginFiles($editor), 'The LlamaButton and LlamaContextualAndButton plugins are enabled.'); $this->assertIdentical(array('internal' => NULL) + $expected, $this->manager->getEnabledPluginFiles($editor, TRUE), 'The LlamaButton and LlamaContextualAndButton plugins are enabled.'); $settings['toolbar'] = $original_toolbar; $settings['toolbar']['rows'][0][0]['items'][] = 'Strike'; $editor->setSettings($settings); $editor->save(); $expected = $enabled_plugins + array('llama_contextual' => $file['c'], 'llama_contextual_and_button' => $file['cb']); $this->assertIdentical($expected, $this->manager->getEnabledPluginFiles($editor), 'The LLamaContextual and LlamaContextualAndButton plugins are enabled.'); $this->assertIdentical(array('internal' => NULL) + $expected, $this->manager->getEnabledPluginFiles($editor, TRUE), 'The LlamaContextual and LlamaContextualAndButton plugins are enabled.'); $settings['toolbar']['rows'][0][0]['items'][] = 'Llama'; $editor->setSettings($settings); $editor->save(); $expected = $enabled_plugins + array('llama_button' => $file['b'], 'llama_contextual' => $file['c'], 'llama_contextual_and_button' => $file['cb']); $this->assertIdentical($expected, $this->manager->getEnabledPluginFiles($editor), 'The LlamaButton, LlamaContextual and LlamaContextualAndButton plugins are enabled.'); $this->assertIdentical(array('internal' => NULL) + $expected, $this->manager->getEnabledPluginFiles($editor, TRUE), 'The LLamaButton, LlamaContextual and LlamaContextualAndButton plugins are enabled.'); $settings['toolbar']['rows'][0][0]['items'][] = 'LlamaCSS'; $editor->setSettings($settings); $editor->save(); $expected = $enabled_plugins + array('llama_button' => $file['b'], 'llama_contextual' => $file['c'], 'llama_contextual_and_button' => $file['cb'], 'llama_css' => $file['css']); $this->assertIdentical($expected, $this->manager->getEnabledPluginFiles($editor), 'The LlamaButton, LlamaContextual, LlamaContextualAndButton and LlamaCSS plugins are enabled.'); $this->assertIdentical(array('internal' => NULL) + $expected, $this->manager->getEnabledPluginFiles($editor, TRUE), 'The LLamaButton, LlamaContextual, LlamaContextualAndButton and LlamaCSS plugins are enabled.'); }