diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-79858-TSFE-relatedPropertiesAndMethods.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-79858-TSFE-relatedPropertiesAndMethods.rst new file mode 100644 index 0000000000000000000000000000000000000000..7d2ec9d024f4d25179631d189952cb844aec073c --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-79858-TSFE-relatedPropertiesAndMethods.rst @@ -0,0 +1,71 @@ +.. include:: ../../Includes.txt + +========================================================= +Deprecation: #79858 - TSFE-related properties and methods +========================================================= + +See :issue:`79858` + +Description +=========== + +The following properties within TypoScriptFrontendController have been marked as deprecated: + +`$compensateFieldWidth` +`$excludeCHashVars` +`$scriptParseTime` + +The following methods have been marked as deprecated: + +`TypoScriptFrontendController->generatePage_whichScript()` (used via :ts:`config.pageGenScript`) +`TypoScriptFrontendController->encryptEmail()` +`TypoScriptFrontendController->encryptCharcode()` +`PageGenerator::pagegenInit()` + +The following TypoScript properties have been marked as deprecated: + +`config.pageGenScript` +`config.compensateFieldWidth` + + +Impact +====== + +Calling any of the PHP methods will trigger a deprecation log entry. + +All properties and options are still callable with the according output, however there are +alternatives to achieve the same. + + +Affected Installations +====================== + +Any TYPO3 installation working with custom extensions that use any of these functionalities, methods +or properties. + + +Migration +========= + +All of the functionality is obsolete or outdated and should be handled differently from now on: + +1. The `compensateFieldWidth` option was used for forms built with TYPO3 4.x (before TYPO3 4.6), +instead, any other form framework should be used for forms and for field width calculations, where +styling of form fields are also handled via CSS. + +2. An alternative `config.pageGenScript` can be used and set via hooks in PHP classes nowadays and +executed, instead of configuring this functionality on a high-end TypoScript level to execute include +spaghetti PHP code within a file. + +3. `PageGenerator::pagegenInit()` is solely working on public properties of the TSFE PHP class, which +belongs to the TSFE object itself (thus, the logic is copied to `$TSFE->preparePageContentGeneration()`) + +4. Calculating the debug parse time for the web page is not part of the controller logic but more +certainly belongs to the request handling itself, where it is handled in a cleaner way for PHP, +waiting for further refactorings in TYPO3 v9. + +5. The methods `TypoScriptFrontendController->encryptEmail()` and `encryptCharcode()` have been moved +to ContentObjectRenderer. + + +.. index:: Frontend, TypoScript \ No newline at end of file diff --git a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php index 82e19002ec691b655de8348bc25a678e9cb50271..9beda03eb6cc38de5a2c3fc1ea028f688a5a0189 100644 --- a/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php +++ b/typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php @@ -6450,20 +6450,16 @@ class ContentObjectRenderer $originalMailToUrl = 'mailto:' . $mailAddress; $mailToUrl = $this->processUrl(UrlProcessorInterface::CONTEXT_MAIL, $originalMailToUrl); - $tsfe = $this->getTypoScriptFrontendController(); - // no processing happened, therefore + // no processing happened, therefore, the default processing kicks in if ($mailToUrl === $originalMailToUrl) { + $tsfe = $this->getTypoScriptFrontendController(); if ($tsfe->spamProtectEmailAddresses) { - if ($tsfe->spamProtectEmailAddresses === 'ascii') { - $mailToUrl = $tsfe->encryptEmail($mailToUrl); - } else { - $mailToUrl = 'javascript:linkTo_UnCryptMailto(' . GeneralUtility::quoteJSvalue($tsfe->encryptEmail($mailToUrl)) . ');'; + $mailToUrl = $this->encryptEmail($mailToUrl, $tsfe->spamProtectEmailAddresses); + if ($tsfe->spamProtectEmailAddresses !== 'ascii') { + $mailToUrl = 'javascript:linkTo_UnCryptMailto(' . GeneralUtility::quoteJSvalue($mailToUrl) . ');'; } - $atLabel = ''; - if ($tsfe->config['config']['spamProtectEmailAddresses_atSubst']) { - $atLabel = trim($tsfe->config['config']['spamProtectEmailAddresses_atSubst']); - } - $spamProtectedMailAddress = str_replace('@', $atLabel ? $atLabel : '(at)', htmlspecialchars($mailAddress)); + $atLabel = trim($tsfe->config['config']['spamProtectEmailAddresses_atSubst']) ?: '(at)'; + $spamProtectedMailAddress = str_replace('@', $atLabel, htmlspecialchars($mailAddress)); if ($tsfe->config['config']['spamProtectEmailAddresses_lastDotSubst']) { $lastDotLabel = trim($tsfe->config['config']['spamProtectEmailAddresses_lastDotSubst']); $lastDotLabel = $lastDotLabel ? $lastDotLabel : '(dot)'; @@ -6476,6 +6472,105 @@ class ContentObjectRenderer return [$mailToUrl, $linktxt]; } + /** + * Encryption of email addresses for <A>-tags See the spam protection setup in TS 'config.' + * + * @param string $string Input string to en/decode: "mailto:blabla@bla.com + * @param mixed $type - either "ascii" or a number between -10 and 10, taken from config.spamProtectEmailAddresses + * @return string encoded version of $string + */ + protected function encryptEmail($string, $type) + { + $out = ''; + // obfuscates using the decimal HTML entity references for each character + if ($type === 'ascii') { + $stringLength = strlen($string); + for ($a = 0; $a < $stringLength; $a++) { + $out .= '&#' . ord(substr($string, $a, 1)) . ';'; + } + } else { + // like str_rot13() but with a variable offset and a wider character range + $len = strlen($string); + $offset = (int)$type; + for ($i = 0; $i < $len; $i++) { + $charValue = ord($string[$i]); + // 0-9 . , - + / : + if ($charValue >= 43 && $charValue <= 58) { + $out .= $this->encryptCharcode($charValue, 43, 58, $offset); + } elseif ($charValue >= 64 && $charValue <= 90) { + // A-Z @ + $out .= $this->encryptCharcode($charValue, 64, 90, $offset); + } elseif ($charValue >= 97 && $charValue <= 122) { + // a-z + $out .= $this->encryptCharcode($charValue, 97, 122, $offset); + } else { + $out .= $string[$i]; + } + } + } + return $out; + } + + /** + * Decryption of email addresses for <A>-tags See the spam protection setup in TS 'config.' + * + * @param string $string Input string to en/decode: "mailto:blabla@bla.com + * @param mixed $type - either "ascii" or a number between -10 and 10 taken from config.spamProtectEmailAddresses + * @return string decoded version of $string + */ + protected function decryptEmail($string, $type) + { + $out = ''; + // obfuscates using the decimal HTML entity references for each character + if ($type === 'ascii') { + $stringLength = strlen($string); + for ($a = 0; $a < $stringLength; $a++) { + $out .= '&#' . ord(substr($string, $a, 1)) . ';'; + } + } else { + // like str_rot13() but with a variable offset and a wider character range + $len = strlen($string); + $offset = (int)$type * -1; + for ($i = 0; $i < $len; $i++) { + $charValue = ord($string[$i]); + // 0-9 . , - + / : + if ($charValue >= 43 && $charValue <= 58) { + $out .= $this->encryptCharcode($charValue, 43, 58, $offset); + } elseif ($charValue >= 64 && $charValue <= 90) { + // A-Z @ + $out .= $this->encryptCharcode($charValue, 64, 90, $offset); + } elseif ($charValue >= 97 && $charValue <= 122) { + // a-z + $out .= $this->encryptCharcode($charValue, 97, 122, $offset); + } else { + $out .= $string[$i]; + } + } + } + return $out; + } + + /** + * Encryption (or decryption) of a single character. + * Within the given range the character is shifted with the supplied offset. + * + * @param int $n Ordinal of input character + * @param int $start Start of range + * @param int $end End of range + * @param int $offset Offset + * @return string encoded/decoded version of character + */ + protected function encryptCharcode($n, $start, $end, $offset) + { + $n = $n + $offset; + if ($offset > 0 && $n > $end) { + $n = $start + ($n - $end - 1); + } elseif ($offset < 0 && $n < $start) { + $n = $end - ($start - $n - 1); + } + return chr($n); + } + /** * Gets the query arguments and assembles them for URLs. * Arguments may be removed or set, depending on configuration. diff --git a/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php b/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php index caff67f60eda99d4c57cda7a2a30a46ea0b4a502..cc5ccf59fa7f8733b95b101e1bf56d93f8771f82 100644 --- a/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php +++ b/typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php @@ -488,6 +488,7 @@ class TypoScriptFrontendController /** * Factor for form-field widths compensation + * @deprecated since TYPO3 v8, will be removed in TYPO3 v9 * @var string */ public $compensateFieldWidth = ''; @@ -531,6 +532,7 @@ class TypoScriptFrontendController * A string set with a comma list of additional GET vars which should NOT be * included in the cHash calculation. These vars should otherwise be detected * and involved in caching, eg. through a condition in TypoScript. + * @deprecatd since TYPO3 v8, will be removed in TYPO3 v9, this is taken care of via TYPO3_CONF_VARS nowadays * @var string */ public $excludeCHashVars = ''; @@ -703,6 +705,7 @@ class TypoScriptFrontendController /** * @var int + * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, use the calculations in setParseTime() directly */ public $scriptParseTime = 0; @@ -3230,15 +3233,175 @@ class TypoScriptFrontendController $this->no_cacheBeforePageGen = $this->no_cache; } + /** + * Previously located in static method in PageGenerator::init. Is solely used to set up TypoScript + * config. options and set properties in $TSFE for that. + */ + public function preparePageContentGeneration() + { + if ($this->page['content_from_pid'] > 0) { + // make REAL copy of TSFE object - not reference! + $temp_copy_TSFE = clone $this; + // Set ->id to the content_from_pid value - we are going to evaluate this pid as was it a given id for a page-display! + $temp_copy_TSFE->id = $this->page['content_from_pid']; + $temp_copy_TSFE->MP = ''; + $temp_copy_TSFE->getPageAndRootlineWithDomain($this->config['config']['content_from_pid_allowOutsideDomain'] ? 0 : $this->domainStartPage); + $this->contentPid = (int)$temp_copy_TSFE->id; + unset($temp_copy_TSFE); + } + if ($this->config['config']['MP_defaults']) { + $temp_parts = GeneralUtility::trimExplode('|', $this->config['config']['MP_defaults'], true); + foreach ($temp_parts as $temp_p) { + list($temp_idP, $temp_MPp) = explode(':', $temp_p, 2); + $temp_ids = GeneralUtility::intExplode(',', $temp_idP); + foreach ($temp_ids as $temp_id) { + $this->MP_defaults[$temp_id] = $temp_MPp; + } + } + } + // Global vars... + $this->indexedDocTitle = $this->page['title']; + $this->debug = !empty($this->config['config']['debug']); + // Base url: + if (isset($this->config['config']['baseURL'])) { + $this->baseUrl = $this->config['config']['baseURL']; + } + // Internal and External target defaults + $this->intTarget = '' . $this->config['config']['intTarget']; + $this->extTarget = '' . $this->config['config']['extTarget']; + $this->fileTarget = '' . $this->config['config']['fileTarget']; + if ($this->config['config']['spamProtectEmailAddresses'] === 'ascii') { + $this->spamProtectEmailAddresses = 'ascii'; + } else { + $this->spamProtectEmailAddresses = MathUtility::forceIntegerInRange($this->config['config']['spamProtectEmailAddresses'], -10, 10, 0); + } + // calculate the absolute path prefix + if (!empty($this->config['config']['absRefPrefix'])) { + $absRefPrefix = trim($this->config['config']['absRefPrefix']); + if ($absRefPrefix === 'auto') { + $this->absRefPrefix = GeneralUtility::getIndpEnv('TYPO3_SITE_PATH'); + } else { + $this->absRefPrefix = $absRefPrefix; + } + } else { + $this->absRefPrefix = ''; + } + if ($this->type && $this->config['config']['frameReloadIfNotInFrameset']) { + $this->logDeprecatedTyposcript( + 'config.frameReloadIfNotInFrameset', + 'frameReloadIfNotInFrameset has been marked as deprecated since TYPO3 v8, ' . + 'and will be removed in TYPO3 v9.' + ); + $tdlLD = $this->tmpl->linkData($this->page, '_top', $this->no_cache, ''); + $this->additionalJavaScript['JSCode'] .= 'if(!parent.' . trim($this->sPre) . ' && !parent.view_frame) top.location.href="' . $this->baseUrlWrap($tdlLD['totalURL']) . '"'; + } + $this->compensateFieldWidth = '' . $this->config['config']['compensateFieldWidth']; + $this->lockFilePath = '' . $this->config['config']['lockFilePath']; + $this->lockFilePath = $this->lockFilePath ?: $GLOBALS['TYPO3_CONF_VARS']['BE']['fileadminDir']; + if (isset($this->config['config']['noScaleUp'])) { + $this->logDeprecatedTyposcript( + 'config.noScaleUp', + 'The TypoScript property "config.noScaleUp" is deprecated since TYPO3 v8 and will be removed in TYPO3 v9. ' . + 'Please use the global TYPO3 configuration setting "GFX/processor_allowUpscaling" instead.' + ); + } + $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_allowUpscaling'] = (bool)(isset($this->config['config']['noScaleUp']) ? !$this->config['config']['noScaleUp'] : $GLOBALS['TYPO3_CONF_VARS']['GFX']['processor_allowUpscaling']); + $this->ATagParams = trim($this->config['config']['ATagParams']) ? ' ' . trim($this->config['config']['ATagParams']) : ''; + if ($this->config['config']['setJS_mouseOver']) { + $this->setJS('mouseOver'); + } + if ($this->config['config']['setJS_openPic']) { + $this->setJS('openPic'); + } + $this->initializeSearchWordDataInTsfe(); + // linkVars + $this->calculateLinkVars(); + // dtdAllowsFrames indicates whether to use the target attribute in links + $this->dtdAllowsFrames = false; + if ($this->config['config']['doctype']) { + if (in_array( + (string)$this->config['config']['doctype'], + ['xhtml_trans', 'xhtml_frames', 'xhtml_basic', 'html5'], + true) + ) { + $this->dtdAllowsFrames = true; + } + } else { + $this->dtdAllowsFrames = true; + } + // Setting XHTML-doctype from doctype + if (!$this->config['config']['xhtmlDoctype']) { + $this->config['config']['xhtmlDoctype'] = $this->config['config']['doctype']; + } + if ($this->config['config']['xhtmlDoctype']) { + $this->xhtmlDoctype = $this->config['config']['xhtmlDoctype']; + // Checking XHTML-docytpe + switch ((string)$this->config['config']['xhtmlDoctype']) { + case 'xhtml_trans': + case 'xhtml_strict': + $this->xhtmlVersion = 100; + break; + case 'xhtml_frames': + $this->logDeprecatedTyposcript( + 'config.xhtmlDoctype=frames', + 'xhtmlDoctype = xhtml_frames and doctype = xhtml_frames have been marked as deprecated since TYPO3 v8, ' . + 'and will be removed in TYPO3 v9.' + ); + $this->xhtmlVersion = 100; + break; + case 'xhtml_basic': + $this->xhtmlVersion = 105; + break; + case 'xhtml_11': + case 'xhtml+rdfa_10': + $this->xhtmlVersion = 110; + break; + default: + $this->pageRenderer->setRenderXhtml(false); + $this->xhtmlDoctype = ''; + $this->xhtmlVersion = 0; + } + } else { + $this->pageRenderer->setRenderXhtml(false); + } + + // Global content object + $this->newCObj(); + } + + /** + * Fills the sWordList property and builds the regular expression in TSFE that can be used to split + * strings by the submitted search words. + * + * @see sWordList + * @see sWordRegEx + */ + protected function initializeSearchWordDataInTsfe() + { + $this->sWordRegEx = ''; + $this->sWordList = GeneralUtility::_GP('sword_list'); + if (is_array($this->sWordList)) { + $space = !empty($this->config['config']['sword_standAlone']) ? '[[:space:]]' : ''; + foreach ($this->sWordList as $val) { + if (trim($val) !== '') { + $this->sWordRegEx .= $space . preg_quote($val, '/') . $space . '|'; + } + } + $this->sWordRegEx = rtrim($this->sWordRegEx, '|'); + } + } + /** * Determines to include custom or pagegen.php script * returns script-filename if a TypoScript (config) script is defined and should be included instead of pagegen.php * * @return string|NULL The relative filepath of "config.pageGenScript" if found and allowed + * @deprecated since TYPO3 v8, will be removed in TYPO3 v9 */ public function generatePage_whichScript() { if (!$GLOBALS['TYPO3_CONF_VARS']['FE']['noPHPscriptInclude'] && $this->config['config']['pageGenScript']) { + GeneralUtility::logDeprecatedFunction(); return $this->tmpl->getFileName($this->config['config']['pageGenScript']); } return null; @@ -3681,9 +3844,11 @@ class TypoScriptFrontendController * * @return void * @access private + * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, as the Request Handler is taking care of that now */ public function setParseTime() { + GeneralUtility::logDeprecatedFunction(); // Compensates for the time consumed with Back end user initialization. $microtime_start = isset($GLOBALS['TYPO3_MISC']['microtime_start']) ? $GLOBALS['TYPO3_MISC']['microtime_start'] : null; $microtime_end = isset($GLOBALS['TYPO3_MISC']['microtime_end']) ? $GLOBALS['TYPO3_MISC']['microtime_end'] : null; @@ -3779,9 +3944,11 @@ class TypoScriptFrontendController * @param int $end End of range * @param int $offset Offset * @return string encoded/decoded version of character + * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, this functionality has been moved to ContentObjectRenderer */ public function encryptCharcode($n, $start, $end, $offset) { + GeneralUtility::logDeprecatedFunction(); $n = $n + $offset; if ($offset > 0 && $n > $end) { $n = $start + ($n - $end - 1); @@ -3797,9 +3964,11 @@ class TypoScriptFrontendController * @param string $string Input string to en/decode: "mailto:blabla@bla.com * @param bool $back If set, the process is reversed, effectively decoding, not encoding. * @return string encoded/decoded version of $string + * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, this functionality has been moved to ContentObjectRenderer */ public function encryptEmail($string, $back = false) { + GeneralUtility::logDeprecatedFunction(); $out = ''; // obfuscates using the decimal HTML entity references for each character if ($this->spamProtectEmailAddresses === 'ascii') { diff --git a/typo3/sysext/frontend/Classes/Http/RequestHandler.php b/typo3/sysext/frontend/Classes/Http/RequestHandler.php index 1a50dea4e81154009ca8387ea5b7e7f14632d8cb..050e192f5d820631d52296e95dfb9c63d2104205 100644 --- a/typo3/sysext/frontend/Classes/Http/RequestHandler.php +++ b/typo3/sysext/frontend/Classes/Http/RequestHandler.php @@ -206,9 +206,7 @@ class RequestHandler implements RequestHandlerInterface if ($temp_theScript) { include $temp_theScript; } else { - PageGenerator::pagegenInit(); - // Global content object - $this->controller->newCObj(); + $this->controller->preparePageContentGeneration(); // Content generation if (!$this->controller->isINTincScript()) { PageGenerator::renderContent(); @@ -217,9 +215,7 @@ class RequestHandler implements RequestHandlerInterface } $this->controller->generatePage_postProcessing(); } elseif ($this->controller->isINTincScript()) { - PageGenerator::pagegenInit(); - // Global content object - $this->controller->newCObj(); + $this->controller->preparePageContentGeneration(); } $this->controller->releaseLocks(); $this->timeTracker->pull(); @@ -243,14 +239,15 @@ class RequestHandler implements RequestHandlerInterface $this->controller->storeSessionData(); // Statistics $GLOBALS['TYPO3_MISC']['microtime_end'] = microtime(true); - $this->controller->setParseTime(); - if (isset($this->controller->config['config']['debug'])) { - $debugParseTime = (bool)$this->controller->config['config']['debug']; - } else { - $debugParseTime = !empty($GLOBALS['TYPO3_CONF_VARS']['FE']['debug']); - } - if ($this->controller->isOutputting() && $debugParseTime) { - $this->controller->content .= LF . '<!-- Parsetime: ' . $this->controller->scriptParseTime . 'ms -->'; + if ($this->controller->isOutputting()) { + if (isset($this->controller->config['config']['debug'])) { + $debugParseTime = (bool)$this->controller->config['config']['debug']; + } else { + $debugParseTime = !empty($GLOBALS['TYPO3_CONF_VARS']['FE']['debug']); + } + if ($debugParseTime) { + $this->controller->content .= LF . '<!-- Parsetime: ' . $this->getParseTime() . 'ms -->'; + } } $this->controller->redirectToExternalUrl(); // Preview info @@ -361,4 +358,22 @@ class RequestHandler implements RequestHandlerInterface // This is a dirty workaround and bypasses the protected access modifier of the controller member. $GLOBALS['TSFE'] = &$this->controller; } + + /** + * Calculates the parsetime of the page and returns it. + * + * @return int the parse time of the page + */ + protected function getParseTime() + { + // Compensates for the time consumed with Back end user initialization. + $processStart = isset($GLOBALS['TYPO3_MISC']['microtime_start']) ? $GLOBALS['TYPO3_MISC']['microtime_start'] : null; + $processEnd = isset($GLOBALS['TYPO3_MISC']['microtime_end']) ? $GLOBALS['TYPO3_MISC']['microtime_end'] : null; + $beUserInitializationStart = isset($GLOBALS['TYPO3_MISC']['microtime_BE_USER_start']) ? $GLOBALS['TYPO3_MISC']['microtime_BE_USER_start'] : null; + $beUserInitializationEnd = isset($GLOBALS['TYPO3_MISC']['microtime_BE_USER_end']) ? $GLOBALS['TYPO3_MISC']['microtime_BE_USER_end'] : null; + return $this->timeTracker->getMilliseconds($processStart) + - $this->timeTracker->getMilliseconds($processEnd) + - ($this->timeTracker->getMilliseconds($beUserInitializationStart) + - $this->timeTracker->getMilliseconds($beUserInitializationEnd)); + } } diff --git a/typo3/sysext/frontend/Classes/Page/PageGenerator.php b/typo3/sysext/frontend/Classes/Page/PageGenerator.php index bf6c61a9147d4202d82c873a7c75313c8172c606..73c8d19ec94759dbd5faf835c2431cb1f11c4cf9 100644 --- a/typo3/sysext/frontend/Classes/Page/PageGenerator.php +++ b/typo3/sysext/frontend/Classes/Page/PageGenerator.php @@ -41,10 +41,12 @@ class PageGenerator /** * Setting some vars in TSFE, primarily based on TypoScript config settings. * + * @deprecated since TYPO3 v8, will be removed in TYPO3 v9 * @return void */ public static function pagegenInit() { + GeneralUtility::logDeprecatedFunction(); /** @var TypoScriptFrontendController $tsfe */ $tsfe = $GLOBALS['TSFE']; if ($tsfe->page['content_from_pid'] > 0) { @@ -95,7 +97,7 @@ class PageGenerator $tsfe->absRefPrefix = ''; } if ($tsfe->type && $tsfe->config['config']['frameReloadIfNotInFrameset']) { - \TYPO3\CMS\Core\Utility\GeneralUtility::deprecationLog( + GeneralUtility::deprecationLog( 'frameReloadIfNotInFrameset has been marked as deprecated since TYPO3 v8, ' . 'and will be removed in TYPO3 v9.' ); @@ -145,7 +147,7 @@ class PageGenerator $tsfe->xhtmlVersion = 100; break; case 'xhtml_frames': - \TYPO3\CMS\Core\Utility\GeneralUtility::deprecationLog( + GeneralUtility::deprecationLog( 'xhtmlDoctype = xhtml_frames and doctype = xhtml_frames have been marked as deprecated since TYPO3 v8, ' . 'and will be removed in TYPO3 v9.' ); @@ -873,7 +875,7 @@ class PageGenerator } // Header complete, now add content if ($tsfe->pSetup['frameSet.']) { - \TYPO3\CMS\Core\Utility\GeneralUtility::deprecationLog( + GeneralUtility::deprecationLog( 'frameSet, FRAME and FRAMESET have been marked as deprecated since TYPO3 v8 ' . 'and will be removed in TYPO3 v9.' );