Drupal 8  8.0.2
Todo List
Class AcceptNegotiation406
fix or replace this in https://www.drupal.org/node/2364011
Class AccessTest
It probably make sense to split the test up by one for role/perm/none and the two generic ones.
Global AccessTest::testStaticAccessPlugin ()
Test abstract access plugin.
Class ActionInterface
WARNING: The action API is going to receive some additions before release. The following additions are likely to happen:
  • The way configuration is handled and configuration forms are built is likely to change in order for the plugin to be of use for Rules.
  • Actions are going to become context-aware in https://www.drupal.org/node/2011038, what will deprecated the 'type' annotation.
  • Instead of action implementations saving entities, support for marking required context as to be saved by the execution manager will be added as part of https://www.drupal.org/node/2347017.
  • Actions will receive a data processing API that allows for token replacements to happen outside of the action plugin implementations, see https://www.drupal.org/node/2347023.
Global ActiveLinkResponseFilter::setLinkActiveClass ($html_markup, $current_path, $is_front, $url_language, array $query)
Once a future version of PHP supports parsing HTML5 properly (i.e. doesn't fail on https://www.drupal.org/comment/7938201#comment-7938201) then we can get rid of this manual parsing and use DOMDocument instead.
Global AjaxRenderer::drupalRenderRoot (&$elements)
Remove as part of https://www.drupal.org/node/2182149.
Global AnonymousUserSessionTest::testUserGetRoles ()
Move roles constants to a class/interface
Class AttachmentsInterface
If in Drupal 9, we remove attachments other than assets (libraries + drupalSettings), then we can look into unifying this with .
Global BaseFieldDefinition::getFieldItemClass ()
: Remove once getClass() adds in defaults. See https://www.drupal.org/node/2116341.
Class BlockManager
Add documentation to this class.
Class BlockPluginInterface
Add detailed documentation here explaining the block system's architecture and the relationships between the various objects, including brief references to the important components that are not coupled to the interface.
Global BlockPluginInterface::label ()
Provide other specific label-related methods in https://www.drupal.org/node/2025649.
Global BlockPluginInterface::setConfigurationValue ($key, $value)

This doesn't belong here. Move this into a new base class in https://www.drupal.org/node/1764380.

This does not set a value in ::config(), so the name is confusing.

Global BookNavigationBlock::getCacheMaxAge ()
Make cacheable in https://www.drupal.org/node/2483181
Global BrowserTestBase::rebuildContainer ()
Fix https://www.drupal.org/node/2021959 so that module enable/disable changes are immediately reflected in ::getContainer(). Until then, tests can invoke this workaround when requiring services from newly enabled modules to be immediately available in the same request.
Global ChainedFastBackend::reset ()
Document in https://www.drupal.org/node/2311945.
Class Comment
: replace numbers with constants.
Class ConditionInterface

Replace the dependency on with a new interface from https://www.drupal.org/node/2006248.

WARNING: The condition API is going to receive some additions before release. The following additions are likely to happen:

  • The way configuration is handled and configuration forms are built is likely to change in order for the plugin to be of use for Rules.
  • Conditions will receive a data processing API that allows for token replacements to happen outside of the plugin implementations, see https://www.drupal.org/node/2347023.
  • Conditions will have to implement access control for checking who is allowed to configure or perform the action at https://www.drupal.org/node/2172017.
Global ConfigImporter::importInvokeOwner ($collection, $op, $name)
Add support for other extension types; e.g., themes etc.
Global ConfigManagerInterface::diff (StorageInterface $source_storage, StorageInterface $target_storage, $source_name, $target_name=NULL, $collection=StorageInterface::DEFAULT_COLLECTION)
Make renderer injectable
Global ConfigMapperInterface::populateFromRouteMatch (RouteMatchInterface $route_match)
Replace $request with RouteMatch https://www.drupal.org/node/2295255.
Global ConfigStorageTestBase::testCRUD ()
Coverage: Trigger PDOExceptions / Database exceptions.
Class ConfigTestStorage
Global ConnectionTest::testEscapeMethods ($expected, $name)
Separate test method for each escape method?
Global ConnectionUnitTest::testOpenClose ()
getConnectionID() executes a query.
Class ContainerBuilder
Submit upstream patches to Symfony to not require these overrides.
Global ContainerBuilder::set ($id, $service, $scope=self::SCOPE_CONTAINER)
Restrict this to synthetic services only. Ideally, the upstream ContainerBuilder class should be fixed to allow setting synthetic services in a frozen builder.
Global ContentEntityBase::__get ($name)
: A lot of code still uses non-fields (e.g. $entity->content in view builders) by reference. Clean that up.
Class ContentEntityDeleteForm
Re-evaluate and streamline the entity deletion form class hierarchy in https://www.drupal.org/node/2491057.
Global ContextAwarePluginManagerInterface::getDefinitionsForContexts (array $contexts=array())
Use context definition objects after https://www.drupal.org/node/2281635.
Class ContextDefinitionInterface
WARNING: This interface is going to receive some additions as part of https://www.drupal.org/node/2346999.
Global ContextHandlerInterface::checkRequirements (array $contexts, array $requirements)
Use context definition objects after https://www.drupal.org/node/2281635.
Global ContextHandlerInterface::filterPluginDefinitionsByContexts (array $contexts, array $definitions)
Use context definition objects after https://www.drupal.org/node/2281635.
Global ContextHandlerInterface::getMatchingContexts (array $contexts, ContextDefinitionInterface $definition)
Use context definition objects after https://www.drupal.org/node/2281635.
Global DatabaseStorage::delete ($name)
Ignore replica targets for data manipulation operations.
Global DataDefinition::offsetExists ($offset)
: Remove in https://www.drupal.org/node/1928868.
Global DataDefinition::offsetGet ($offset)
: Remove in https://www.drupal.org/node/1928868.
Global DataDefinition::offsetSet ($offset, $value)
: Remove in https://www.drupal.org/node/1928868.
Global DataDefinition::offsetUnset ($offset)
: Remove in https://www.drupal.org/node/1928868.
Class DbDumpCommand
This command is currently only compatible with MySQL. Making it backend-agnostic will require support the ability to retrieve table schema information. Note that using a raw SQL dump file here (eg, generated from mysqldump or pg_dump) is not an option since these tend to still be database-backend specific.
See Also
Global DbDumpCommand::getTableSchema (Connection $connection, $table)
This implementation is hard-coded for MySQL.
Global DefaultExceptionSubscriber::onJson (GetResponseForExceptionEvent $event)
This should probably check the error reporting level.
Class Diff
document DifferenceEngine
Global Display::getFormState (ViewEntityInterface $view, $display_id, $js)
Remove this and switch all usage of $form_state->get('section') to $form_state->get('type').
Global DisplayPluginBase::__construct (array $configuration, $plugin_id, $plugin_definition)
Replace DisplayPluginBase::$display with DisplayPluginBase::$configuration to standardize with other plugins.
Global DisplayPluginInterface::renderFilters ()
This function no longer seems to be used.
Class DisplayVariant
: Revise description when/if Displays are added to core: https://www.drupal.org/node/2292733
Global DrupalKernel::initializeRequestGlobals (Request $request)
D8: Eliminate this entirely in favor of Request object.
Global DrupalKernel::updateModules (array $module_list, array $module_filenames=array())
Remove obsolete $module_list parameter. Only $module_filenames is needed.
Global DynamicPageCacheSubscriber::responseToRenderArray (CacheableResponseInterface $response)
Refactor/remove once https://www.drupal.org/node/2551419 lands.
Class EarlyRenderingControllerWrapperSubscriber
Remove in Drupal 9.0.0, by disallowing early rendering.
Global EditEntityFieldAccessCheck::access (EntityInterface $entity, $field_name, $langcode, AccountInterface $account)
Use the $account argument: https://www.drupal.org/node/2266809.
Class Embed
: Wait until annotations/plugins support access methods. no_ui => !::config('views.settings')->get('ui.show.display_embed'),
Class EntityBundleListenerInterface
Convert to Symfony events: https://www.drupal.org/node/2332935
Global EntityDefinitionUpdateManagerInterface::getFieldStorageDefinition ($name, $entity_type_id)
Make this return a mutable storage definition interface when we have one. See https://www.drupal.org/node/2346329.
Global EntityDisplayBase::CUSTOM_MODE
Prevent creation of a mode with this ID https://www.drupal.org/node/2410727
Global EntityFieldManagerInterface::useCaches ($use_caches=FALSE)
Remove in https://www.drupal.org/node/2549143.
Global EntityForm::actions (array $form, FormStateInterface $form_state)
Consider introducing a 'preview' action here, since it is used by many entity types.
Global EntityFormInterface::setEntityManager (EntityManagerInterface $entity_manager)
Remove this set call in https://www.drupal.org/node/2603542.
Global EntityInterface::preSave (EntityStorageInterface $storage)
Adjust existing implementations and the documentation according to https://www.drupal.org/node/2577609 to have a consistent API.
Global EntityListBuilder::render ()
Add a link to add a new item to the #empty text.
Class EntityManager
Enforce the deprecation of each method once https://www.drupal.org/node/2578361 is in.
Class EntityRouteAlterSubscriber
Matching on parameter name is not ideal, because it breaks encapsulation: parameter names are local to the controller and route, and controllers and routes can't be expected to know what all possible entity types might exist across all modules in order to pick names that don't conflict. Instead, the 'type' should be determined from introspecting what kind of PHP variable (e.g., a type hinted interface) the controller requires: https://www.drupal.org/node/2041907.
Global EntityStorageInterface::loadUnchanged ($id)
Remove this method once we have a reliable way to retrieve the unchanged entity from the entity object.
Global EntityTypeInterface::getBaseTable ()
Used by SqlContentEntityStorage only.
Global EntityTypeInterface::getDataTable ()
Used by SqlContentEntityStorage only.
Global EntityTypeInterface::getLabelCallback ()
Remove usages of label_callback https://www.drupal.org/node/2450793.
Global EntityTypeInterface::getRevisionDataTable ()
Used by SqlContentEntityStorage only.
Global EntityTypeInterface::getRevisionTable ()
Used by SqlContentEntityStorage only.
Global EntityTypeInterface::isPersistentlyCacheable ()
Used by ContentEntityStorageBase only.
Global EntityTypeRepositoryInterface::clearCachedDefinitions ()
Remove in https://www.drupal.org/node/2549143.
Global ExceptionTestSiteSubscriber::on500 (GetResponseForExceptionEvent $event)
The $headers array appears to not actually get used at all in the original code. It's quite possible that this entire method is now vestigial and can be removed.
Global ExecutablePluginBase::getConfig ()
: This needs to go into an interface.
Global ExecutablePluginBase::getConfigDefinition ($key)
: This needs to go into an interface.
Global ExecutablePluginBase::getConfigDefinitions ()
: This needs to go into an interface.
Global ExecutablePluginBase::setConfig ($key, $value)

This doesn't belong here. Move this into a new base class in https://www.drupal.org/node/1764380.

This does not set a value in ::config(), so the name is confusing.

Class Field
Rename the class https://www.drupal.org/node/2408667
Global FieldableEntity::getFieldValues ($entity_type, $field, $entity_id, $revision_id=NULL)
Support multilingual field values.
Global FieldableEntityInterface::bundleFieldDefinitions (EntityTypeInterface $entity_type, $bundle, array $base_field_definitions)
WARNING: This method will be changed in https://www.drupal.org/node/2346347.
Class FieldAttachOtherTest
move this to the Entity module
Class FieldAttachStorageTest
move this to the Entity module
Global FieldConfigBase::__sleep ()
Investigate in https://www.drupal.org/node/2074253.
Global FieldItemList::getValue ($include_computed=FALSE)
Revisit the need when all entity types are converted to NG entities.
Class FieldModuleUninstallValidator
Remove this once we support field purging for base fields. See https://www.drupal.org/node/2282119.
Global FieldStorageConfig::__sleep ()
Investigate in https://www.drupal.org/node/2074253.
Class FieldStorageDefinition
Provide and make use of a proper FieldStorageDefinition class instead: https://www.drupal.org/node/2280639.
Global FileCache::reset ()
Replace this once https://www.drupal.org/node/2260187 is in.
Class FileManagedFileElementTest
Create a FileTestBase class and move FileFieldTestBase methods that aren't related to fields into it.
Global FileSystemInterface::mkdir ($uri, $mode=NULL, $recursive=FALSE, $context=NULL)
Update with open_basedir compatible recursion logic from ::ensureDirectory().
Global FilterInterface::tips ($long=FALSE)
Split into getSummaryItem() and buildGuidelines().
Global FilterPluginCollection::getAll ()
Refactor text format administration to actually construct/create and destruct/remove actual filter plugin instances, using a library approach à la blocks.
Global FilterUnitTest::testHtmlCorrectorFilter ()
This test could really use some validity checking function.
Global FilterUnitTest::testHtmlFilter ()

This is for functions like filter_filter and check_markup, whose functionality is not completely focused on filtering. Some ideas: restricting formats according to user permissions, proper cache handling, defaults – allowed tags/attributes/protocols.

It is possible to add script, iframe etc. to allowed tags, but this makes HTML filter completely ineffective.

Class, id, name and xmlns should be added to disallowed attributes, or better a whitelist approach should be used for that too.

Global FormBuilderInterface::AJAX_FORM_REQUEST
Re-evaluate the need for this constant after https://www.drupal.org/node/2502785 and https://www.drupal.org/node/2503429.
Class FormController
Make this a trait in PHP 5.4.
Global GroupByTest::testGroupBySave ()
This should check the change of the settings as well.
Global HandlerFilterPermissionTest::testFilterPermission ()
Fix the different commented out tests by fixing the many to one handler handling with the NOT operator.
Class HandlerTestBase
Global hook_entity_base_field_info_alter (&$fields, $entity_type)
WARNING: This hook will be changed in https://www.drupal.org/node/2346329.
Global hook_entity_bundle_field_info ( $entity_type, $bundle, array $base_field_definitions)
WARNING: This hook will be changed in https://www.drupal.org/node/2346347.
Global hook_entity_bundle_field_info_alter (&$fields, $entity_type, $bundle)
WARNING: This hook will be changed in https://www.drupal.org/node/2346347.
Global hook_language_types_info ()
Rename the 'fixed' key to something more meaningful, for instance 'negotiation settings'. See https://www.drupal.org/node/2166879.
Global hook_theme ($existing, $type, $theme, $path)
@param array $suggestions
An array of theme suggestions.
@param array $variables
An array of variables passed to the theme hook. Note that this hook is
invoked before any preprocessing.
@see hook_theme_suggestions_HOOK()
function hook_theme_suggestions_HOOK_alter(array &$suggestions, array $variables) {
if (empty($variables['header'])) {
$suggestions[] = 'hookname__' . 'no_header';
function hook_themes_installed($theme_list) {
foreach ($theme_list as $theme) {
function hook_themes_uninstalled(array $themes) {
// Remove some state entries depending on the theme.
foreach ($themes as $theme) {
\Drupal::state()->delete('example.' . $theme);
function hook_extension() {
// Extension for template base names in Twig.
return '.html.twig';
function hook_render_template($template_file, $variables) {
$twig_service = \Drupal::service('twig');
return $twig_service->loadTemplate($template_file)->render($variables);
function hook_element_info_alter(array &$types) {
// Decrease the default size of textfields.
if (isset($types['textfield']['#size'])) {
$types['textfield']['#size'] = 40;
function hook_js_alter(&$javascript, \Drupal\Core\Asset\AttachedAssetsInterface $assets) {
// Swap out jQuery to use an updated version of the library.
$javascript['core/assets/vendor/jquery/jquery.min.js']['data'] = drupal_get_path('module', 'jquery_update') . '/jquery.js';
function hook_library_info_build() {
$libraries = [];
// Add a library whose information changes depending on certain conditions.
$libraries['mymodule.zombie'] = [
'dependencies' => [
if (Drupal::moduleHandler()->moduleExists('minifyzombies')) {
$libraries['mymodule.zombie'] += [
'js' => [
'mymodule.zombie.min.js' => [],
'css' => [
'base' => [
'mymodule.zombie.min.css' => [],
else {
$libraries['mymodule.zombie'] += [
'js' => [
'mymodule.zombie.js' => [],
'css' => [
'base' => [
'mymodule.zombie.css' => [],
// Add a library only if a certain condition is met. If code wants to
// integrate with this library it is safe to (try to) load it unconditionally
// without reproducing this check. If the library definition does not exist
// the library (of course) not be loaded but no notices or errors will be
// triggered.
if (Drupal::moduleHandler()->moduleExists('vampirize')) {
$libraries['mymodule.vampire'] = [
'js' => [
'js/vampire.js' => [],
'css' => [
'base' => [
'dependencies' => [
return $libraries;
function hook_js_settings_build(array &$settings, \Drupal\Core\Asset\AttachedAssetsInterface $assets) {
// Manipulate settings.
if (isset($settings['dialog'])) {
$settings['dialog']['autoResize'] = FALSE;
function hook_js_settings_alter(array &$settings, \Drupal\Core\Asset\AttachedAssetsInterface $assets) {
// Add settings.
$settings['user']['uid'] = \Drupal::currentUser();
// Manipulate settings.
if (isset($settings['dialog'])) {
$settings['dialog']['autoResize'] = FALSE;
function hook_library_info_alter(&$libraries, $extension) {
// Update Farbtastic to version 2.0.
if ($extension == 'core' && isset($libraries['jquery.farbtastic'])) {
// Verify existing version is older than the one we are updating to.
if (version_compare($libraries['jquery.farbtastic']['version'], '2.0', '<')) {
// Update the existing Farbtastic to version 2.0.
$libraries['jquery.farbtastic']['version'] = '2.0';
// To accurately replace library files, the order of files and the options
// of each file have to be retained; e.g., like this:
$old_path = 'assets/vendor/farbtastic';
// Since the replaced library files are no longer located in a directory
// relative to the original extension, specify an absolute path (relative
// to DRUPAL_ROOT / base_path()) to the new location.
$new_path = '/' . drupal_get_path('module', 'farbtastic_update') . '/js';
$new_js = array();
$replacements = array(
$old_path . '/farbtastic.js' => $new_path . '/farbtastic-2.0.js',
foreach ($libraries['jquery.farbtastic']['js'] as $source => $options) {
if (isset($replacements[$source])) {
$new_js[$replacements[$source]] = $options;
else {
$new_js[$source] = $options;
$libraries['jquery.farbtastic']['js'] = $new_js;
function hook_css_alter(&$css, \Drupal\Core\Asset\AttachedAssetsInterface $assets) {
// Remove defaults.css file.
unset($css[drupal_get_path('module', 'system') . '/defaults.css']);
function hook_page_attachments(array &$attachments) {
// Unconditionally attach an asset to the page.
$attachments['#attached']['library'][] = 'core/domready';
// Conditionally attach an asset to the page.
if (!\Drupal::currentUser()->hasPermission('may pet kittens')) {
$attachments['#attached']['library'][] = 'core/jquery';
function hook_page_attachments_alter(array &$attachments) {
// Conditionally remove an asset.
if (in_array('core/jquery', $attachments['#attached']['library'])) {
$index = array_search('core/jquery', $attachments['#attached']['library']);
function hook_page_top(array &$page_top) {
$page_top['mymodule'] = ['#markup' => 'This is the top.'];
function hook_page_bottom(array &$page_bottom) {
$page_bottom['mymodule'] = ['#markup' => 'This is the bottom.'];
  • preprocess functions: A list of functions used to preprocess this data. Ordinarily this won't be used; it's automatically filled in. By default, for a module this will be filled in as template_preprocess_HOOK. For a theme this will be filled in as twig_preprocess and twig_preprocess_HOOK as well as themename_preprocess and themename_preprocess_HOOK.
  • override preprocess functions: Set to TRUE when a theme does NOT want the standard preprocess functions to run. This can be used to give a theme FULL control over how variables are set. For example, if a theme wants total control over how certain variables in the page.html.twig are set, this can be set to true. Please keep in mind that when this is used by a theme, that theme becomes responsible for making sure necessary variables are set.
  • type: (automatically derived) Where the theme hook is defined: 'module', 'theme_engine', or 'theme'.
  • theme path: (automatically derived) The directory path of the theme or module, so that it doesn't need to be looked up.
Global hook_theme_suggestions_alter (array &$suggestions, array $variables, $hook)
@param array $variables
An array of variables passed to the theme hook. Note that this hook is
invoked before any preprocessing.
@return array
An array of theme suggestions.
@see hook_theme_suggestions_HOOK_alter()
function hook_theme_suggestions_HOOK(array $variables) {
$suggestions = array();
$suggestions[] = 'node__' . $variables['elements']['#langcode'];
return $suggestions;
File https.php
Fix this to use a new request rather than modifying server variables, see http.php.
Global Image::chmod ($uri, $mode=NULL)
Remove when https://www.drupal.org/node/2050759 is in.
Global ImageStyle::fileDefaultScheme ()
: Convert file_default_scheme() into a proper injectable service.
Global ImageStyle::fileUriScheme ($uri)
: Remove when https://www.drupal.org/node/2050759 is in.
Global ImageStyle::fileUriTarget ($uri)
: Convert file_uri_target() into a proper injectable service.
Global InstallerExistingDatabaseSettingsTest::setUpSettings ()
The database settings form is not supposed to appear if settings.php contains a valid database connection already (but e.g. no config directories yet).
Global InstallerRouteBuilder::getRouteDefinitions ()
Convert installer steps into routes; add an installer.routing.yml.
Global InstallStorage::getFilePath ($name)
Improve this when figuring out how we want to handle configuration in installation profiles. For instance, a config object actually has to be searched in the profile first (whereas the profile is never the owner); only afterwards check for a corresponding module or theme.
Class KeyValueEntityStorage

Entities that depend on auto-incrementing serial IDs need to explicitly provide an ID until a generic wrapper around the functionality provided by ::nextId() is added and used.

Revisions are currently not supported.

Global KeyValueStoreInterface::getMultiple (array $keys)
What's returned for non-existing keys?
Global LanguageBlock::getCacheMaxAge ()
Make cacheable in https://www.drupal.org/node/2232375.
Class LanguageItem
Define the AllowedValues constraint via an options provider once https://www.drupal.org/node/2329937 is completed.
Class LengthConstraint
: Move this below the TypedData core component.
Global LinkBase::currentUser ()
: https://www.drupal.org/node/2105123 put this method in instead.
File LinkSeparateFormatter.php
Merge into 'link' formatter once there is a #type like 'item' that can render a compound label and content outside of a form context.
See Also
Global LocalStream::getDirectoryPath ()
Review this method name in D8 per https://www.drupal.org/node/701358.
Class LocalTaskIntegrationTestBase
Add tests for access checking and url building, https://www.drupal.org/node/2112245.
Global ManageFieldsTest::createField ()
Assert properties can bet set in the form and read back in $field_storage and $fields.
Class ManyToOneHelper
This requires extensive documentation on how this class is to be used. For now, look at the arguments and filters that use it. Lots of stuff is just pass-through but there are definitely some interesting areas where they interact.
Class MemoryCounterBackend
On the longrun this backend should be replaced by phpunit mock objects.
Group menu

Derivatives will probably be defined for these; when they are, add documentation here.

Derivatives are in flux for these; when they are more stable, add documentation here.

Derivatives are in flux for these; when they are more stable, add documentation here.

Derivatives are in flux for these; when they are more stable, add documentation here.

Global MenuLinkInterface::getFormClass ()
Add a code example. https://www.drupal.org/node/2302849
Global MigrateDestinationInterface::fields (MigrationInterface $migration=NULL)
Review the cases where we need the Migration parameter, can we avoid that? To be resolved with https://www.drupal.org/node/2543568.
Global MigrateIdMapInterface::getQualifiedMapTableName ()
Remove this as this is SQL only and so doesn't belong to the interface.
Global MigratePassword::getCountLog2 ($setting)
: Revisit this whole alternate password service: https://www.drupal.org/node/2540594.
Class NegotiationMiddleware
This is a temporary solution, remove this in https://www.drupal.org/node/2364011
Class Node
: replace numbers with constants.
Class NodeAccessTest
Cover hook_node_access in a separate test class.
Class NodeRevision
: replace numbers with constants.
Global OpmlFeedAdd::parseOpml ($opml)
Move this to a parser in https://www.drupal.org/node/1963540.
Class PathProcessorDecode
Revisit whether or not this logic is appropriate for here or if controllers should be required to implement this logic themselves. If we decide to keep this code, remove this TODO.
Class PathProcessorFront
- remove ::processOutbound() when we remove UrlGenerator::fromPath().
Class PluginTestBase
Class PoItem
: This class contains some really old legacy code.
See Also
Global QueryAggregateInterface::aggregate ($field, $function, $langcode=NULL, &$alias=NULL)
What about GROUP_CONCAT support?
Class QueryFactory
https://www.drupal.org/node/2389335 remove entity.query service and replace with using the entity storage's getQuery() method.
Class RangeConstraint
: Move this below the TypedData core component.
Class RebuildTest
Add tests for other aspects of form rebuilding.
Class RecursiveExtensionFilterIterator
Use RecursiveCallbackFilterIterator instead of the $acceptTests parameter forwarding once PHP 5.4 is available.
Global RedirectFormBlock::getCacheMaxAge ()
Make cacheable once https://www.drupal.org/node/2351015 lands.
Class Registry
Replace local $registry variables in methods with $this->registry.
Global RendererPlaceholdersTest::providerPlaceholders ()
Case A5 is not yet supported by core. So that makes for only 14 permutations currently, instead of 16. That will be done in https://www.drupal.org/node/2559847
Global RequestCloseSubscriber::onTerminate (PostResponseEvent $event)
The body of this function has just been copied almost verbatim from drupal_page_footer(). There's probably a lot in here that needs to get removed/changed. Also, if possible, do more light-weight shutdowns on AJAX requests.
Class RequestContext
: Remove once the upstream RequestContext provides fromRequestStack(): https://github.com/symfony/symfony/issues/12057
Group routing
Fix https://www.drupal.org/node/2075889 to actually get this behaviour.
  • The 'defaults' section tells how to build the main content of the route, and can also give other information, such as the page title and additional arguments for the route controller method. There are several possibilities for how to build the main content, including:
  • The 'requirements' section is used in Drupal to give access permission instructions (it has other uses in the Symfony framework). Most routes have a simple permission-based access scheme, as shown in this example. See the Permission system topic for more information about permissions.
Global Schema::addIndex ($table, $name, $fields, array $spec)
remove the $spec argument whenever schema introspection is added.
Global Select::processSelect (&$element, FormStateInterface $form_state, &$complete_form)
Address the above issue in Drupal 8.
  • If #required is not TRUE and this value is set (most commonly to an empty string), then an extra option (see #empty_option above) representing a "non-selection" is added with this as its value.
    \Drupal\Core\Form\FormStateInterface$form_stateThe current state of the form.
    array$complete_formThe complete form structure.
Class SessionManager
In fact the NativeSessionStorage class already implements all of the functionality required by a typical Symfony application. Normally it is not necessary to subclass it at all. In order to reach the point where Drupal can use the Symfony session management unmodified, the code implemented here needs to be extracted either into a dedicated session handler proxy (e.g. sid-hashing) or relocated to the authentication subsystem.
Global SqlContentEntityStorageSchema::installedStorageSchema ()
Inject this dependency in the constructor once this class can be instantiated as a regular entity handler: https://www.drupal.org/node/2332857.
Global SystemController::themesPage ()
Move into ThemeController.
Class SystemMenuBlockTest
Expand test coverage to all SystemMenuBlock functionality, including block_menu_delete().
Class Term
Support term_relation, term_synonym table if possible.
Global TestDiscovery::getTestClasses ($extension=NULL)
Remove singular grouping; retain list of groups in 'group' key.
See Also
Add base class groups 'Kernel' + 'Web', complementing 'PHPUnit'.
Global TestDiscovery::scanDirectory ($namespace_prefix, $path)
Limit to '*Test.php' files (~10% less files to reflect/introspect).
See Also
Global TestParser::parse (FeedInterface $feed)
Actually test this.
Global TextFieldRdfaTest::testAllFormatters ()
Check for the summary mapping.
Group theme_render
Check these links. Some are for Drupal 7, and might need updates for Drupal 8.
Global ThemeInitialization::prepareStylesheetsRemove (Extension $theme, $base_themes)
Remove in Drupal 9.0.x.
Global ThemeInitialization::resolveStyleSheetPlaceholders ($css_file)
Remove in Drupal 9.0.x.
Global ThemeManager::alterForTheme (ActiveTheme $theme, $type, &$data, &$context1=NULL, &$context2=NULL)
Should we cache some of these information?
Global TwigExtension::escapeFilter ( $env, $arg, $strategy= 'html', $charset=NULL, $autoescape=FALSE)
Refactor this to keep it in sync with theme_render_and_autoescape() in https://www.drupal.org/node/2575065
Global TwigExtension::getUrl ($name, $parameters=array(), $options=array())
Add an option for scheme-relative URLs.
Global TypedData::__construct ($definition, $name=NULL, TypedDataInterface $parent=NULL)
When has been fixed to use class-based definitions, type-hint $definition to DataDefinitionInterface. https://www.drupal.org/node/1928868
Global TypedDataInterface::createInstance ($definition, $name=NULL, TraversableTypedDataInterface $parent=NULL)
When has been fixed to use class-based definitions, type-hint $definition to DataDefinitionInterface. https://www.drupal.org/node/1928868
Global UpdateContribTest::testUpdateShowDisabledThemes ()
https://www.drupal.org/node/2338175 extensions can not be hidden and base themes have to be installed.
Global Updater::getProjectName ($directory)
It would be nice, if projects contained an info file which could provide their canonical name.
Global Updater::makeBackup (FileTransfer $filetransfer, $from, $to)
Not implemented: https://www.drupal.org/node/2474355
Global Url::__construct ($route_name, $route_parameters=array(), $options=array())
Update this documentation for non-routed URIs in https://www.drupal.org/node/2346787
Global UrlHelper::buildQuery (array $query, $parent= '')
Remove this function once PHP 5.4 is required as we can use just http_build_query() directly.
Class UserPicture
Support default picture?
Class UserPictureInstance
Support default picture?
Class Users
: replace numbers with constants.
Class UserSession
: Change all properties to protected.
Global UserSessionTest::testUserGetRoles ()
Move roles constants to a class/interface
Class UserTestBase
Global UserTrackerTab::currentUser ()
: https://www.drupal.org/node/2105123 put this method in instead.
Global ViewExecutable::_build ($key)
Some filter needs this function, even it is internal.
Global ViewFormBase::getDisplayLabel (ViewUI $view, $display_id, $check_changed=TRUE)
Remove this function once editing the display title is possible.
Group views_plugins

Document specific options on the appropriate plugin base classes.

Add examples.

Global ViewsFormInterface::getForm (ViewEntityInterface $view, $display_id, $js)
When https://www.drupal.org/node/1843224 is in, this will return instead of the array of AJAX commands.
Global WebTestBase::drupalPlaceBlock ($plugin_id, array $settings=array())
Add support for creating custom block instances.
Global WebTestBase::rebuildContainer ()
Fix https://www.drupal.org/node/2021959 so that module enable/disable changes are immediately reflected in ::getContainer(). Until then, tests can invoke this workaround when requiring services from newly enabled modules to be immediately available in the same request.