Commit b986c827 authored by catch's avatar catch

Issue #2368987 by Wim Leers, Berdir, Schnitzel, epari.siva, bircher,...

Issue #2368987 by Wim Leers, Berdir, Schnitzel, epari.siva, bircher, vijaycs85, likin: Move internal page caching to a module to avoid relying on config get on runtime
parent d4431a10
......@@ -300,7 +300,7 @@ services:
arguments: ['@request_stack', '@url_generator']
form_cache:
class: Drupal\Core\Form\FormCache
arguments: ['@app.root', '@keyvalue.expirable', '@module_handler', '@current_user', '@csrf_token', '@logger.channel.form', '@config.factory', '@request_stack', '@page_cache_request_policy']
arguments: ['@app.root', '@keyvalue.expirable', '@module_handler', '@current_user', '@csrf_token', '@logger.channel.form', '@request_stack', '@page_cache_request_policy']
public: false # Private to form_builder
keyvalue:
class: Drupal\Core\KeyValueStore\KeyValueFactory
......@@ -584,11 +584,6 @@ services:
arguments: ['@settings']
tags:
- { name: http_middleware, priority: 300 }
http_middleware.page_cache:
class: Drupal\Core\StackMiddleware\PageCache
arguments: ['@cache.render', '@page_cache_request_policy', '@page_cache_response_policy']
tags:
- { name: http_middleware, priority: 200 }
http_middleware.kernel_pre_handle:
class: Drupal\Core\StackMiddleware\KernelPreHandle
arguments: ['@kernel']
......
......@@ -10,7 +10,6 @@
use Drupal\Component\Utility\Crypt;
use Drupal\Component\Utility\SafeMarkup;
use Drupal\Core\Access\CsrfTokenGenerator;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\KeyValueStore\KeyValueExpirableFactoryInterface;
use Drupal\Core\PageCache\RequestPolicyInterface;
......@@ -104,20 +103,17 @@ class FormCache implements FormCacheInterface {
* The CSRF token generator.
* @param \Psr\Log\LoggerInterface $logger
* A logger instance.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The configuration factory.
* @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
* The request stack.
* @param \Drupal\Core\PageCache\RequestPolicyInterface $request_policy
* A policy rule determining the cacheability of a request.
*/
public function __construct($root, KeyValueExpirableFactoryInterface $key_value_expirable_factory, ModuleHandlerInterface $module_handler, AccountInterface $current_user, CsrfTokenGenerator $csrf_token, LoggerInterface $logger, ConfigFactoryInterface $config_factory, RequestStack $request_stack, RequestPolicyInterface $request_policy) {
public function __construct($root, KeyValueExpirableFactoryInterface $key_value_expirable_factory, ModuleHandlerInterface $module_handler, AccountInterface $current_user, CsrfTokenGenerator $csrf_token, LoggerInterface $logger, RequestStack $request_stack, RequestPolicyInterface $request_policy) {
$this->root = $root;
$this->keyValueExpirableFactory = $key_value_expirable_factory;
$this->moduleHandler = $module_handler;
$this->currentUser = $current_user;
$this->logger = $logger;
$this->configFactory = $config_factory;
$this->csrfToken = $csrf_token;
$this->requestStack = $request_stack;
$this->requestPolicy = $request_policy;
......@@ -210,11 +206,6 @@ public function setCache($form_build_id, $form, FormStateInterface $form_state)
$this->keyValueExpirableFactory->get('form')->setWithExpire($form_build_id, $form, $expire);
}
// Cache form state.
if ($this->configFactory->get('system.performance')->get('cache.page.use_internal') && $this->isPageCacheable()) {
$form_state->addBuildInfo('immutable', TRUE);
}
// Store the known list of safe strings for form re-use.
// @todo Ensure we are not storing an excessively large string list in:
// https://www.drupal.org/node/2295823
......@@ -225,14 +216,4 @@ public function setCache($form_build_id, $form, FormStateInterface $form_state)
}
}
/**
* Checks if the page is cacheable.
*
* @return bool
* TRUE is the page is cacheable, FALSE if not.
*/
protected function isPageCacheable() {
return ($this->requestPolicy->check($this->requestStack->getCurrentRequest()) === RequestPolicyInterface::ALLOW);
}
}
......@@ -32,7 +32,6 @@ class BasicAuthTest extends WebTestBase {
public function testBasicAuth() {
// Enable page caching.
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
......
......@@ -313,7 +313,6 @@ public function testBlockCacheTags() {
// Enable page caching.
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
......
......@@ -51,19 +51,6 @@ public function testPrivateFileTransferWithoutPageCache() {
$this->doPrivateFileTransferTest();
}
/**
* Test the private file transfer system with page cache.
*/
public function testPrivateFileTransferWithPageCache() {
// Turn on page caching and rerun the test.
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
$this->doPrivateFileTransferTest();
}
/**
* Test the private file transfer system.
*/
......
......@@ -78,22 +78,6 @@ function testImageStyleUrlAndPathPrivateUnclean() {
$this->doImageStyleUrlAndPathTests('private', FALSE);
}
/**
* Tests an image style URL using the "public://" scheme and page cache.
*/
public function testImageStyleUrlAndPathPublicWithPageCache() {
$this->enablePageCache();
$this->doImageStyleUrlAndPathTests('public');
}
/**
* Tests an image style URL using the "private://" scheme and page cache.
*/
public function testImageStyleUrlAndPathPrivateWithPageCache() {
$this->enablePageCache();
$this->doImageStyleUrlAndPathTests('private');
}
/**
* Tests an image style URL with a file URL that has an extra slash in it.
*/
......@@ -242,15 +226,4 @@ function doImageStyleUrlAndPathTests($scheme, $clean_url = TRUE, $extra_slash =
$this->assertResponse(200, 'Image was accessible at the URL with a missing token.');
}
/**
* Turn on page caching.
*/
protected function enablePageCache() {
// Turn on page caching and rerun the test.
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
}
}
......@@ -188,20 +188,7 @@ protected function negotiateLanguage($type, $method_id) {
$method = $this->negotiatorManager->getDefinition($method_id);
if (!isset($method['types']) || in_array($type, $method['types'])) {
// Check for a cache mode force from settings.php.
if ($this->settings->get('page_cache_without_database')) {
$cache_enabled = TRUE;
}
else {
$cache_enabled = $this->configFactory->get('system.performance')->get('cache.page.use_internal');
}
// If the language negotiation method has no cache preference or this is
// satisfied we can execute the callback.
if ($cache = !isset($method['cache']) || $this->currentUser->isAuthenticated() || $method['cache'] == $cache_enabled) {
$langcode = $this->getNegotiationMethodInstance($method_id)->getLangcode($this->requestStack->getCurrentRequest());
}
$langcode = $this->getNegotiationMethodInstance($method_id)->getLangcode($this->requestStack->getCurrentRequest());
}
$languages = $this->languageManager->getLanguages();
......
......@@ -35,16 +35,16 @@ class LanguageNegotiationBrowser extends LanguageNegotiationMethodBase {
public function getLangcode(Request $request = NULL) {
$langcode = NULL;
// Whenever browser-based language negotiation is used, the page cannot be
// cached by reverse proxies.
// @todo Solve more elegantly in https://www.drupal.org/node/2430335.
\Drupal::service('page_cache_kill_switch')->trigger();
if ($this->languageManager && $request && $request->server->get('HTTP_ACCEPT_LANGUAGE')) {
$http_accept_language = $request->server->get('HTTP_ACCEPT_LANGUAGE');
$langcodes = array_keys($this->languageManager->getLanguages());
$mappings = $this->config->get('language.mappings')->get('map');
$langcode = UserAgent::getBestMatchingLangcode($http_accept_language, $langcodes, $mappings);
// Internal page cache with multiple languages and browser negotiation
// could lead to wrong cached sites. Therefore disabling the internal
// page cache.
// @todo Solve more elegantly in https://www.drupal.org/node/2430335.
\Drupal::service('page_cache_kill_switch')->trigger();
}
return $langcode;
......
......@@ -14,7 +14,6 @@ process:
'css/preprocess': preprocess_css
'js/preprocess': preprocess_js
'cache/page/max_age': cache_lifetime
'cache/page/use_internal': cache
'response/gzip': page_compression
destination:
plugin: config
......
......@@ -40,8 +40,6 @@ public function testSystemPerformance() {
$this->assertIdentical(FALSE, $config->get('css.preprocess'));
$this->assertIdentical(FALSE, $config->get('js.preprocess'));
$this->assertIdentical(0, $config->get('cache.page.max_age'));
$this->assertIdentical(TRUE, $config->get('cache.page.use_internal'));
$this->assertIdentical(TRUE, $config->get('response.gzip'));
}
}
name: Internal page cache
type: module
description: 'Caches pages for anonymous users. Works well for small to medium-sized websites.'
package: Core
version: VERSION
core: 8.x
<?php
/**
* @file
* Caches responses for anonymous users, request and response policies allowing.
*/
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\PageCache\RequestPolicyInterface;
use Drupal\Core\Routing\RouteMatchInterface;
/**
* Implements hook_help().
*/
function page_cache_help($route_name, RouteMatchInterface $route_match) {
switch ($route_name) {
case 'help.page.page_cache':
$output = '<h3>' . t('About') . '</h3>';
$output .= '<p>' . t('The Internal page cache module caches pages for anonymous users in the database.') . '</p>';
$output .= '<h3>' . t('Uses') . '</h3>';
$output .= '<dl>';
$output .= '<dt>' . t('Speeding up your site') . '</dt>';
$output .= '<dd>';
$output .= '<p>' . t('Pages requested by anonymous users are stored the first time they are requested and then reused; depending on your site configuration and the amount of your web traffic tied to anonymous visitors, the caching system may significantly increase the speed of your site.');
$output .= '<p>' . t('(For authenticated users, pages need to be assembled for each user individually, but anonymous users all get the exact same version of each page.)') . '</p>';
$output .= '</dd>';
$output .= '<dt>' . t('Configuring Internal page cache') . '</dt>';
$output .= '<dd>';
$output .= '<p>' . t('On the <a href="@cache-settings">Performance settings page</a>, you can configure how long browsers and proxies may cache pages, that setting is also respected by the Internal page cache module. There is no other configuration.', array('@cache-settings' => \Drupal::url('system.performance_settings'))) . '</p>';
$output .= '</dd>';
$output .= '</dl>';
return $output;
}
}
/**
* Implements hook_form_alter().
*/
function page_cache_form_alter(&$form, FormStateInterface $form_state, $form_id) {
// If the page that's being built is cacheable, set the 'immutable' flag, to
// ensure that when the form is used, a new form build ID is generated when
// appropriate, to prevent information disclosure.
$request_policy = \Drupal::service('page_cache_request_policy');
$request = \Drupal::requestStack()->getCurrentRequest();
$request_is_cacheable = $request_policy->check($request) === RequestPolicyInterface::ALLOW;
if ($request_is_cacheable) {
$form_state->addBuildInfo('immutable', TRUE);
}
}
services:
http_middleware.page_cache:
class: Drupal\page_cache\StackMiddleware\PageCache
arguments: ['@cache.render', '@page_cache_request_policy', '@page_cache_response_policy']
tags:
- { name: http_middleware, priority: 200 }
......@@ -2,11 +2,12 @@
/**
* @file
* Contains \Drupal\Core\StackMiddleware\PageCache.
* Contains \Drupal\page_cache\StackMiddleware\PageCache.
*/
namespace Drupal\Core\StackMiddleware;
namespace Drupal\page_cache\StackMiddleware;
use Drupal\Component\Utility\UserAgent;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\PageCache\RequestPolicyInterface;
......@@ -52,7 +53,7 @@ class PageCache implements HttpKernelInterface {
protected $responsePolicy;
/**
* Constructs a ReverseProxyMiddleware object.
* Constructs a PageCache object.
*
* @param \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel
* The decorated kernel.
......@@ -74,20 +75,8 @@ public function __construct(HttpKernelInterface $http_kernel, CacheBackendInterf
* {@inheritdoc}
*/
public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) {
if ($type !== static::MASTER_REQUEST) {
// Only allow page caching on master request.
$cache_enabled = FALSE;
}
elseif (Settings::get('page_cache_without_database')) {
// Check for a cache mode force from settings.php.
$cache_enabled = TRUE;
}
else {
$config = $this->config('system.performance');
$cache_enabled = $config->get('cache.page.use_internal');
}
if ($cache_enabled && $this->requestPolicy->check($request) === RequestPolicyInterface::ALLOW) {
// Only allow page caching on master request.
if ($type === static::MASTER_REQUEST && $this->requestPolicy->check($request) === RequestPolicyInterface::ALLOW) {
$response = $this->lookup($request, $type, $catch);
}
else {
......@@ -232,20 +221,6 @@ protected function fetch(Request $request, $type = self::MASTER_REQUEST, $catch
return $response;
}
// Check if the current page may be compressed.
if (extension_loaded('zlib') && !$response->headers->get('Content-Encoding') && $this->config('system.performance')->get('response.gzip')) {
$content = $response->getContent();
if ($content) {
$response->setContent(gzencode($content, 9, FORCE_GZIP));
$response->headers->set('Content-Encoding', 'gzip');
}
// When page compression is enabled, ensure that proxy caches will record
// and deliver different versions of a page depending on whether the
// client supports gzip or not.
$response->setVary('Accept-Encoding', FALSE);
}
// Use the actual timestamp from an Expires header, if available.
$date = $response->getExpires();
$expire = ($date > (new \DateTime())) ? $date->getTimestamp() : Cache::PERMANENT;
......@@ -326,16 +301,4 @@ protected function getCacheId(Request $request) {
return implode(':', $cid_parts);
}
/**
* Wraps Drupal::config().
*
* Config factory is not injected into this class in order to prevent
* premature initialization of config storage (database).
*
* @see \Drupal::config()
*/
protected function config($name) {
return \Drupal::config($name);
}
}
......@@ -2,19 +2,20 @@
/**
* @file
* Contains \Drupal\system\Tests\Cache\PageCacheTagsIntegrationTest.
* Contains \Drupal\page_cache\Tests\PageCacheTagsIntegrationTest.
*/
namespace Drupal\system\Tests\Cache;
namespace Drupal\page_cache\Tests;
use Drupal\Core\Language\LanguageInterface;
use Drupal\simpletest\WebTestBase;
use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait;
/**
* Enables the page cache and tests its cache tags in various scenarios.
*
* @group Cache
* @see \Drupal\system\Tests\Bootstrap\PageCacheTest
* @see \Drupal\page_cache\Tests\PageCacheTest
* @see \Drupal\node\Tests\NodePageCacheTest
* @see \Drupal\menu_ui\Tests\MenuTest::testMenuBlockPageCacheTags()
*/
......
......@@ -2,13 +2,12 @@
/**
* @file
* Definition of Drupal\system\Tests\Bootstrap\PageCacheTest.
* Contains \Drupal\page_cache\Tests\PageCacheTest.
*/
namespace Drupal\system\Tests\Bootstrap;
namespace Drupal\page_cache\Tests;
use Drupal\Component\Datetime\DateTimePlus;
use Drupal\Core\Routing\RequestContext;
use Drupal\Core\Url;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\simpletest\WebTestBase;
......@@ -19,7 +18,7 @@
/**
* Enables the page cache and tests it with various HTTP requests.
*
* @group Bootstrap
* @group page_cache
*/
class PageCacheTest extends WebTestBase {
......@@ -32,6 +31,9 @@ class PageCacheTest extends WebTestBase {
*/
public static $modules = array('test_page_test', 'system_test', 'entity_test');
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
......@@ -49,7 +51,6 @@ protected function setUp() {
*/
function testPageCacheTags() {
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
......@@ -82,24 +83,21 @@ function testPageCacheTags() {
*/
function testAcceptHeaderRequests() {
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
$url_generator = \Drupal::urlGenerator();
$url_generator->setContext(new RequestContext());
$accept_header_cache_uri = $url_generator->getPathFromRoute('system_test.page_cache_accept_header');
$accept_header_cache_url = Url::fromRoute('system_test.page_cache_accept_header');
$json_accept_header = array('Accept: application/json');
$this->drupalGet($accept_header_cache_uri);
$this->drupalGet($accept_header_cache_url);
$this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'HTML page was not yet cached.');
$this->drupalGet($accept_header_cache_uri);
$this->drupalGet($accept_header_cache_url);
$this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'HTML page was cached.');
$this->assertRaw('<p>oh hai this is html.</p>', 'The correct HTML response was returned.');
$this->drupalGet($accept_header_cache_uri, array(), $json_accept_header);
$this->drupalGet($accept_header_cache_url, array(), $json_accept_header);
$this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Json response was not yet cached.');
$this->drupalGet($accept_header_cache_uri, array(), $json_accept_header);
$this->drupalGet($accept_header_cache_url, array(), $json_accept_header);
$this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Json response was cached.');
$this->assertRaw('{"content":"oh hai this is json"}', 'The correct Json response was returned.');
......@@ -153,7 +151,6 @@ function testAcceptHeaderRequests() {
*/
function testConditionalRequests() {
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
......@@ -198,7 +195,6 @@ function testConditionalRequests() {
*/
function testPageCache() {
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->set('response.gzip', 1);
$config->save();
......@@ -258,9 +254,8 @@ function testPageCache() {
* This test verifies that, and it verifies that it does not happen for other
* roles.
*/
function testPageCacheAnonymousRolePermissions() {
public function testPageCacheAnonymousRolePermissions() {
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
......@@ -359,7 +354,6 @@ function testPageCacheAnonymous403404() {
*/
public function testPageCacheWithoutVaryCookie() {
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
......@@ -373,58 +367,33 @@ public function testPageCacheWithoutVaryCookie() {
$this->drupalGet('');
$this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Page was not cached.');
$this->assertTrue(strpos($this->drupalGetHeader('Vary'), 'Cookie') === FALSE, 'Vary: Cookie header was not sent.');
$this->assertEqual($this->drupalGetHeader('Cache-Control'), 'max-age=300, public', 'Cache-Control header was sent.');
// Check cache.
$this->drupalGet('');
$this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
$this->assertTrue(strpos($this->drupalGetHeader('Vary'), 'Cookie') === FALSE, 'Vary: Cookie header was not sent.');
$this->assertEqual($this->drupalGetHeader('Cache-Control'), 'max-age=300, public', 'Cache-Control header was sent.');
}
/**
* Tests page compression.
*
* The test should pass even if zlib.output_compression is enabled in php.ini,
* .htaccess or similar, or if compression is done outside PHP, e.g. by the
* mod_deflate Apache module.
* Test the setting of forms to be immutable.
*/
function testPageCompression() {
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->set('response.gzip', 1);
$config->save();
// Fill the cache and verify that output is compressed.
$this->drupalGet('', array(), array('Accept-Encoding: gzip,deflate'));
$this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Page was not cached.');
$this->setRawContent(gzinflate(substr($this->getRawContent(), 10, -8)));
$this->assertRaw('</html>', 'Page was gzip compressed.');
public function testFormImmutability() {
// Install the module that provides the test form.
$this->container->get('module_installer')
->install(['page_cache_form_test']);
\Drupal::service('router.builder')->rebuild();
// Verify that cached output is compressed.
$this->drupalGet('', array(), array('Accept-Encoding: gzip,deflate'));
$this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
$this->assertEqual($this->drupalGetHeader('Content-Encoding'), 'gzip', 'A Content-Encoding header was sent.');
$this->setRawContent(gzinflate(substr($this->getRawContent(), 10, -8)));
$this->assertRaw('</html>', 'Page was gzip compressed.');
$this->drupalGet('page_cache_form_test_immutability');
// Verify that a client without compression support gets an uncompressed page.
$this->drupalGet('');
$this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Page was cached.');
$this->assertFalse($this->drupalGetHeader('Content-Encoding'), 'A Content-Encoding header was not sent.');
$this->assertTitle(t('Test page | @site-name', array('@site-name' => $this->config('system.site')->get('name'))), 'Site title matches.');
$this->assertRaw('</html>', 'Page was not compressed.');
$this->assertText("Immutable: TRUE", "Form is immutable.");
// Disable compression mode.
$config->set('response.gzip', 0);
$config->save();
// Uninstall the page_cache module, verify the flag is not set.
$this->container->get('module_installer')->uninstall(['page_cache']);
// Verify if cached page is still available for a client with compression support.
$this->drupalGet('', array(), array('Accept-Encoding: gzip,deflate'));
$this->setRawContent(gzinflate(substr($this->getRawContent(), 10, -8)));
$this->assertRaw('</html>', 'Page was delivered after compression mode is changed (compression support enabled).');
$this->drupalGet('page_cache_form_test_immutability');
// Verify if cached page is still available for a client without compression support.
$this->drupalGet('');
$this->assertRaw('</html>', 'Page was delivered after compression mode is changed (compression support disabled).');
$this->assertText("Immutable: FALSE", "Form is not immutable,");
}
}
name: 'Page Cache Form Test'
type: module
description: 'Support module for the Page Cache module tests.'
core: 8.x
package: Testing
version: VERSION
<?php
/**
* @file
*
* Install hooks for page_cache_form_test.
*/
function page_cache_form_test_install() {
// Set an explicit module weight, to ensure that the form alter hook is
// always called after page_cache_form_alter().
module_set_weight('page_cache_form_test', 10);
}
<?php
/**
* @file
* Provides functionality for testing form caching.
*/
use Drupal\Core\Form\FormStateInterface;
/**
* Implements hook_form_FORM_ID_alter().
*/
function page_cache_form_test_form_page_cache_form_test_alter(&$form, FormStateInterface $form_state, $form_id) {
if (isset($form_state->getBuildInfo()['immutable']) && $form_state->getBuildInfo()['immutable']) {
$form['#suffix'] = 'Immutable: TRUE';
}
else {
$form['#suffix'] = 'Immutable: FALSE';
}
}
page_cache_form_test.test_immutability:
path: '/page_cache_form_test_immutability'
defaults:
_form: '\Drupal\page_cache_form_test\Form\TestForm'
requirements:
_access: 'TRUE'
<?php
/**
* @file
* Contains \Drupal\page_cache_form_test\Form\TestForm.
*/
namespace Drupal\page_cache_form_test\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class TestForm extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'page_cache_form_test';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form['#prefix'] = '<p>Llamas are awesome, but kittens are pretty cool too!</p>';
return $form;
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) { }
}
......@@ -39,13 +39,6 @@ class SearchPageCacheTagsTest extends SearchTestBase {
protected function setUp() {
parent::setUp();
// Enable the page cache.
// @todo Remove in https://www.drupal.org/node/606840.
$config = $this->config('system.performance');
$config->set('cache.page.use_internal', 1);
$config->set('cache.page.max_age', 300);
$config->save();
// Create user.
$this->searchingUser = $this->drupalCreateUser(array('search content', 'access user profiles'));
......
cache:
page:
use_internal: false
max_age: 0
css:
preprocess: true
......@@ -13,6 +12,4 @@ fast_404:
js:
preprocess: true
gzip: true
response:
gzip: false
stale_file_threshold: 2592000
......@@ -155,14 +155,11 @@ system.performance:
mapping:
page:
type: mapping
label: 'Page cache'
label: 'Page caching'
mapping:
use_internal:
type: boolean