Issue #3103529 by alexpott, mcdruid, Chris Burge, greg.1.anderson, rfay, catch, anavarre, Gábor Hojtsy, jungle: Drupal 8.8.1+ and 9 can fail to install in the web browser due to cache pollution
parent
c5676652c4
commit
a965449714
|
@ -621,6 +621,20 @@ class DrupalKernel implements DrupalKernelInterface, TerminableInterface {
|
|||
// Retrieve enabled modules and register their namespaces.
|
||||
if (!isset($this->moduleList)) {
|
||||
$extensions = $this->getConfigStorage()->read('core.extension');
|
||||
// If core.extension configuration does not exist and we're not in the
|
||||
// installer itself, then we need to put the kernel into a pre-installer
|
||||
// mode. The container should not be dumped because Drupal is yet to be
|
||||
// installed. The installer service provider is registered to ensure that
|
||||
// cache and other automatically created tables are not created if
|
||||
// database settings are available. None of this is required when the
|
||||
// installer is running because the installer has its own kernel and
|
||||
// manages the addition of its own service providers.
|
||||
// @see install_begin_request()
|
||||
if ($extensions === FALSE && !InstallerKernel::installationAttempted()) {
|
||||
$this->allowDumping = FALSE;
|
||||
$this->containerNeedsDumping = FALSE;
|
||||
$GLOBALS['conf']['container_service_providers']['InstallerServiceProvider'] = 'Drupal\Core\Installer\InstallerServiceProvider';
|
||||
}
|
||||
$this->moduleList = isset($extensions['module']) ? $extensions['module'] : [];
|
||||
}
|
||||
$module_filenames = $this->getModuleFileNames();
|
||||
|
|
|
@ -216,6 +216,9 @@ EOD;
|
|||
if (file_exists($directory . '/settings.testing.php')) {
|
||||
Settings::initialize(DRUPAL_ROOT, $site_path, $class_loader);
|
||||
}
|
||||
// Set the module list upfront to avoid setting the kernel into the
|
||||
// pre-installer mode.
|
||||
$this->kernel->updateModules([], []);
|
||||
$this->kernel->boot();
|
||||
|
||||
// Ensure database install tasks have been run.
|
||||
|
@ -231,6 +234,9 @@ EOD;
|
|||
// prevents any services created during the first boot from having stale
|
||||
// database connections, for example, \Drupal\Core\Config\DatabaseStorage.
|
||||
$this->kernel->shutdown();
|
||||
// Set the module list upfront to avoid setting the kernel into the
|
||||
// pre-installer mode.
|
||||
$this->kernel->updateModules([], []);
|
||||
$this->kernel->boot();
|
||||
|
||||
// Save the original site directory path, so that extensions in the
|
||||
|
|
|
@ -54,6 +54,17 @@ class InstallerExistingSettingsTest extends InstallerTestBase {
|
|||
mkdir($this->settings['settings']['config_sync_directory']->value, 0777, TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Visits the interactive installer.
|
||||
*/
|
||||
protected function visitInstaller() {
|
||||
// Should redirect to the installer.
|
||||
$this->drupalGet($GLOBALS['base_url']);
|
||||
// Ensure no database tables have been created yet.
|
||||
$this->assertSame([], Database::getConnection()->schema()->findTables('%'));
|
||||
$this->assertSession()->addressEquals($GLOBALS['base_url'] . '/core/install.php');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
|
|
@ -348,11 +348,12 @@ abstract class KernelTestBase extends TestCase implements ServiceProviderInterfa
|
|||
// Bootstrap the kernel. Do not use createFromRequest() to retain Settings.
|
||||
$kernel = new DrupalKernel('testing', $this->classLoader, FALSE);
|
||||
$kernel->setSitePath($this->siteDirectory);
|
||||
// Boot a new one-time container from scratch. Ensure to set the module list
|
||||
// upfront to avoid a subsequent rebuild.
|
||||
if ($modules && $extensions = $this->getExtensionsForModules($modules)) {
|
||||
$kernel->updateModules($extensions, $extensions);
|
||||
}
|
||||
// Boot a new one-time container from scratch. Set the module list upfront
|
||||
// to avoid a subsequent rebuild or setting the kernel into the
|
||||
// pre-installer mode.
|
||||
$extensions = $modules ? $this->getExtensionsForModules($modules) : [];
|
||||
$kernel->updateModules($extensions, $extensions);
|
||||
|
||||
// DrupalKernel::boot() is not sufficient as it does not invoke preHandle(),
|
||||
// which is required to initialize legacy global variables.
|
||||
$request = Request::create('/');
|
||||
|
|
Loading…
Reference in New Issue