Skip to content
Snippets Groups Projects
Unverified Commit d85508bb authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3103529 by alexpott, mcdruid, Chris Burge, greg.1.anderson, rfay,...

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

(cherry picked from commit a9654497)
parent b080f524
No related branches found
No related tags found
No related merge requests found
......@@ -621,6 +621,20 @@ public function discoverServiceProviders() {
// 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 @@ protected function setUp() {
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 @@ protected function setUp() {
// 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 @@ protected function prepareEnvironment() {
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}
*/
......
......@@ -344,11 +344,12 @@ private function bootKernel() {
// 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('/');
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment