MDL-38055 course: fixed double encoding of title properties
MDL-37942 Images with non-alphanumeric chars in file name won't export
MDL-38361: Fixed typos in mod/assign/locallib.php
MDL-37844 SCORM: fix js error and highlight selected node in TOC.
MDL-35840 SCORM TOC: fixed a typo, improvements on getting the focus
MDL-39080 theme_formal_white: modified "Main menu" block look to resemble the "Navigation" one
MDL-39029 quiz password: autofocus feature added
MDL-39064 changed sequence of directives to separate course content and course listings
MDL-39064 Course listings CSS ported from base to bootstrap theme
MDL-38880 Imported Cloze questions lose embedded images or other media
MDL-38678 SCORM: Runtime Environment (RTE) checks not required in case of SCO Assets
MDL-39087 Clarify plugininfo_base::get_uninstall_url() return value

The method now returns null if there should be no 'Uninstall' link at
the Plugins management screen. For non-standard add-ons the method now
returns URL to a general uninstall tool.

Plugin info subclasses can still override the method to provide URL to
their own UI for uninstalling. If the plugin type wants to use the
general uninstall tool also for standard plugins, it should override
this method and explicitly return $this->get_default_uninstall_url().
Otherwise, the 'Uninstall' link will be provided for add-ons only.
MDL-39087 Implement a common interface for uninstalling general plugin

Plugins may use this general tool for uninstallation and eventually
removal of the deployed source code. At the moment, this is implemented
as a wrapper for the core function uninstall_plugin() with an extra hook
in the relevant plugin info subclass.

For non-standard add-ons, the tool can remove the deployed plugin source
code as well, if the web server has required write permissions. Ideally,
all add-ons installed via the new tool_installaddon should be removable
via the web interface as well.
MDL-39087 Purge all caches at the end of uninstall_plugin()

This is necessary now as many plugins management related features
started to use MUC intensively recently. During the development of this
issue, we realized that the plugin was still considered as installed if
caches were not purged.
MDL-39087 Delete all component files in uninstall_plugin()
MDL-39087 Fix missing cronlib inclusion in file_storage::cron()

This is not actually related to MDL-38259 but it was discovered while
running unit tests for file_storage. When running the tests for this
class separately, the cronlib.php was not included (it is included
when this method is normally called during cron execution).
MDL-39087 Fix plugin_manager::plugin_name() implementation

This is not directly related to the issue. However, it turned out that
if this method was called on plugin_manager without loaded plugins, it
would throw an error. This new implementation uses cleaner access to the
plugininfo subclass.
MDL-39087 Add missing unit tests for the plugin_manager

This patch improves and adds unit tests for the plugin_manager class.
These unit tests cover the existing functionalities. Tests for the
new features related directly with MDL-38259 will be added in a separate
commit (to make it clear what's related to it).
MDL-39087 Offer deleting for standard plugins if possible, too

The plugin_manager::is_plugin_folder_removable() method should do just
one thing and do it well. Also, as was raised during the peer-review,
there should not be technical differences between standard plugins and
add-ons.
MDL-39087 Add new helper methods to the plugin_manager API

These are mainly intended for callers that had to iterate over
get_plugins() result manually.