17 use Psr\Log\NullLogger;
35 $subject->setCharSet(
'utf-8');
36 $subject->setLanguage(
'default');
38 $prologueString = $expectedPrologueString =
'<?xml version="1.0" encoding="utf-8" ?>';
39 $subject->setXmlPrologAndDocType($prologueString);
41 $title = $this->getUniqueId(
'aTitle-');
42 $subject->setTitle($title);
43 $expectedTitleString =
'<title>' . $title .
'</title>';
46 $subject->setCharSet($charset);
47 $expectedCharsetString =
'<meta http-equiv="Content-Type" content="text/html; charset=' . $charset .
'" />';
49 $favouriteIcon =
'http://google.com/favicon.ico';
50 $subject->setFavIcon($favouriteIcon);
51 $expectedFavouriteIconPartOne =
'<link rel="shortcut icon" href="' . $favouriteIcon .
'" />';
53 $baseUrl =
'http://google.com/';
54 $subject->setBaseUrl($baseUrl);
55 $expectedBaseUrlString =
'<base href="' . $baseUrl .
'" />';
57 $subject->setMetaTag(
'property',
'og:type',
'foobar');
58 $subject->setMetaTag(
'name',
'author',
'husel');
59 $subject->setMetaTag(
'name',
'author',
'foobar');
60 $subject->setMetaTag(
'http-equiv',
'refresh',
'5');
61 $subject->setMetaTag(
'name',
'DC.Author',
'<evil tag>');
62 $subject->setMetaTag(
'property',
'og:image',
'/path/to/image1.jpg', [],
false);
63 $subject->setMetaTag(
'property',
'og:image',
'/path/to/image2.jpg', [],
false);
66 $subject->setMetaTag(
'NaMe',
'randomTag',
'foobar');
67 $subject->removeMetaTag(
'name',
'RanDoMtAg');
69 $inlineComment = $this->getUniqueId(
'comment');
70 $subject->addInlineComment($inlineComment);
71 $expectedInlineCommentString =
'<!-- ' . LF . $inlineComment .
'-->';
73 $headerData = $expectedHeaderData =
'<tag method="private" name="test" />';
74 $subject->addHeaderData($headerData);
76 $subject->addJsLibrary(
'test',
'fileadmin/test.js',
'text/javascript',
false,
false,
'wrapBeforeXwrapAfter',
false,
'X');
77 $expectedJsLibraryRegExp =
'#wrapBefore<script src="fileadmin/test\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>wrapAfter#';
79 $subject->addJsFile(
'fileadmin/test.js',
'text/javascript',
false,
false,
'wrapBeforeXwrapAfter',
false,
'X');
80 $expectedJsFileRegExp =
'#wrapBefore<script src="fileadmin/test\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>wrapAfter#';
82 $jsInlineCode = $expectedJsInlineCodeString =
'var x = "' . $this->getUniqueId(
'jsInline-') .
'"';
83 $subject->addJsInlineCode($this->getUniqueId(), $jsInlineCode);
85 $cssFile = $this->getUniqueId(
'cssFile-');
86 $expectedCssFileString =
'wrapBefore<link rel="stylesheet" type="text/css" href="' . $cssFile .
'" media="print" />wrapAfter';
87 $subject->addCssFile($cssFile,
'stylesheet',
'print',
'',
true,
false,
'wrapBeforeXwrapAfter',
false,
'X');
89 $expectedCssInlineBlockOnTopString =
'/*general3*/' . LF .
'h1 {margin:20px;}' . LF .
'/*general2*/' . LF .
'body {margin:20px;}';
90 $subject->addCssInlineBlock(
'general2',
'body {margin:20px;}');
91 $subject->addCssInlineBlock(
'general3',
'h1 {margin:20px;}',
null,
true);
94 $expectedJqueryRegExp =
'#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery\\.min\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
96 $expectedBodyContent = $this->getUniqueId(
'ABCDE-');
97 $subject->setBodyContent($expectedBodyContent);
99 $renderedString = $subject->render();
101 $this->assertContains($expectedPrologueString, $renderedString);
102 $this->assertContains($expectedTitleString, $renderedString);
103 $this->assertContains($expectedCharsetString, $renderedString);
104 $this->assertContains($expectedFavouriteIconPartOne, $renderedString);
105 $this->assertContains($expectedBaseUrlString, $renderedString);
106 $this->assertContains($expectedInlineCommentString, $renderedString);
107 $this->assertContains($expectedHeaderData, $renderedString);
108 $this->assertRegExp($expectedJsLibraryRegExp, $renderedString);
109 $this->assertRegExp($expectedJsFileRegExp, $renderedString);
110 $this->assertContains($expectedJsInlineCodeString, $renderedString);
111 $this->assertContains($expectedCssFileString, $renderedString);
112 $this->assertContains($expectedCssInlineBlockOnTopString, $renderedString);
113 $this->assertRegExp($expectedJqueryRegExp, $renderedString);
114 $this->assertContains($expectedBodyContent, $renderedString);
115 $this->assertContains(
'<meta property="og:type" content="foobar" />', $renderedString);
116 $this->assertContains(
'<meta name="author" content="foobar" />', $renderedString);
117 $this->assertContains(
'<meta http-equiv="refresh" content="5" />', $renderedString);
118 $this->assertContains(
'<meta name="dc.author" content="<evil tag>" />', $renderedString);
119 $this->assertNotContains(
'<meta name="randomtag" content="foobar">', $renderedString);
120 $this->assertNotContains(
'<meta name="randomtag" content="foobar" />', $renderedString);
121 $this->assertContains(
'<meta name="generator" content="TYPO3 CMS" />', $renderedString);
122 $this->assertContains(
'<meta property="og:image" content="/path/to/image1.jpg" />', $renderedString);
123 $this->assertContains(
'<meta property="og:image" content="/path/to/image2.jpg" />', $renderedString);
132 $subject->setCharSet(
'utf-8');
133 $subject->setLanguage(
'default');
135 $subject->enableMoveJsFromHeaderToFooter();
137 $footerData = $expectedFooterData =
'<tag method="private" name="test" />';
138 $subject->addFooterData($footerData);
140 $expectedJsFooterLibraryRegExp =
'#wrapBefore<script src="fileadmin/test\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>wrapAfter#';
141 $subject->addJsFooterLibrary(
'test',
'fileadmin/test.js',
'text/javascript',
false,
false,
'wrapBeforeXwrapAfter',
false,
'X');
143 $expectedJsFooterRegExp =
'#wrapBefore<script src="fileadmin/test\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>wrapAfter#';
144 $subject->addJsFooterFile(
'fileadmin/test.js',
'text/javascript',
false,
false,
'wrapBeforeXwrapAfter',
false,
'X');
146 $jsFooterInlineCode = $expectedJsFooterInlineCodeString =
'var x = "' . $this->getUniqueId(
'jsFooterInline-') .
'"';
147 $subject->addJsFooterInlineCode($this->getUniqueId(), $jsFooterInlineCode);
150 $subject->addInlineLanguageLabel(
'myKey',
'myValue');
151 $subject->addInlineLanguageLabelArray([
152 'myKeyArray1' =>
'myValueArray1',
153 'myKeyArray2' =>
'myValueArray2'
155 $subject->addInlineLanguageLabelArray([
156 'myKeyArray3' =>
'myValueArray3'
158 $expectedInlineLabelReturnValue =
'TYPO3.lang = {"myKey":"myValue","myKeyArray1":"myValueArray1","myKeyArray2":"myValueArray2","myKeyArray3":"myValueArray3"';
160 $subject->addInlineLanguageLabelFile(
'EXT:core/Resources/Private/Language/locallang_core.xlf');
161 $expectedLanguageLabel1 =
'labels.beUser';
162 $expectedLanguageLabel2 =
'labels.feUser';
165 $subject->addInlineSetting(
'myApp',
'myKey',
'myValue');
166 $subject->addInlineSettingArray(
'myApp', [
167 'myKey1' =>
'myValue1',
168 'myKey2' =>
'myValue2'
170 $subject->addInlineSettingArray(
'myApp', [
171 'myKey3' =>
'myValue3'
173 $expectedInlineSettingsReturnValue =
'TYPO3.settings = {"myApp":{"myKey":"myValue","myKey1":"myValue1","myKey2":"myValue2","myKey3":"myValue3"}';
177 $this->assertContains($expectedFooterData, $renderedString);
178 $this->assertRegExp($expectedJsFooterLibraryRegExp, $renderedString);
179 $this->assertRegExp($expectedJsFooterRegExp, $renderedString);
180 $this->assertContains($expectedJsFooterInlineCodeString, $renderedString);
181 $this->assertContains($expectedInlineLabelReturnValue, $renderedString);
182 $this->assertContains($expectedLanguageLabel1, $renderedString);
183 $this->assertContains($expectedLanguageLabel2, $renderedString);
184 $this->assertContains($expectedInlineSettingsReturnValue, $renderedString);
193 'Custom namespace falls back to "no conflict"' => [
194 'namespace' =>
'MyNameSpace',
195 'matchNoConflict' =>
true,
197 '"None" namespace is respected' => [
199 'matchNoConflict' =>
false,
214 $expectedRegExp =
'#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery\\.min\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
215 $noConflictStatement =
'jQuery.noConflict();';
216 $subject->loadJquery(
null,
null, $namespace,
true);
219 $out = $subject->render();
220 $this->assertRegExp($expectedRegExp, $out);
222 if ($matchNoConflict) {
223 $this->assertContains($noConflictStatement, $out);
225 $this->assertNotContains($noConflictStatement, $out);
236 $expectedRegExp =
'#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery\\.min\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
237 $expectedStatement =
'jQuery.noConflict();';
238 $subject->loadJquery(
null,
null,
'MyNameSpace',
true);
239 $out = $subject->render();
240 $this->assertRegExp($expectedRegExp, $out);
241 $this->assertContains($expectedStatement, $out);
242 $this->assertNotContains(
'var TYPO3 = TYPO3 || {}; TYPO3.', $out);
252 $expectedRegExp =
'#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery\\.min\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
254 $out = $subject->render();
255 $this->assertRegExp($expectedRegExp, $out);
256 $this->assertNotContains(
'jQuery.noConflict', $out);
266 $expectedRegExp =
'#<script src="typo3/sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery\\.(js|\\d+\\.js|js\\?\\d+)" type="text/javascript"></script>#';
267 $expectedStatement =
'jQuery.noConflict();';
268 $subject->loadJquery(
null,
null,
'MyNameSpace',
true);
269 $subject->enableDebugMode();
270 $out = $subject->render();
271 $this->assertRegExp($expectedRegExp, $out);
272 $this->assertContains($expectedStatement, $out);
281 'google with version number' => [
284 '#<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.js" type="text/javascript"></script>#'
286 'msn with version number' => [
289 '#<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.3.js" type="text/javascript"></script>#'
291 'jquery with version number' => [
294 '#<script src="https://code.jquery.com/jquery-1.6.3.js" type="text/javascript"></script>#'
296 'jquery with custom URL' => [
298 'https://my.cool.cdn/foo/jquery.js',
299 '#<script src="https://my.cool.cdn/foo/jquery.js" type="text/javascript"></script>#'
316 $subject->enableDebugMode();
317 $out = $subject->render();
318 $this->assertRegExp($regex, $out);
328 $expectedRegex =
'#<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js" type="text/javascript"></script>#';
330 $out = $subject->render();
331 $this->assertRegExp($expectedRegex, $out);
339 $GLOBALS[
'TYPO3_CONF_VARS'][
'SYS'][
'session'][
'BE'] = [
340 'backend' => DatabaseSessionBackend::class,
342 'table' =>
'be_sessions',
347 $GLOBALS[
'BE_USER']->user = [
'uid' => 1];
348 $GLOBALS[
'BE_USER']->setLogger(
new NullLogger());
350 $GLOBALS[
'LANG'] = GeneralUtility::makeInstance(LanguageService::class);
353 $subject->setCharSet(
'utf-8');
354 $subject->setLanguage(
'default');
359 'location' =>
'/typo3conf/ext/foo/Resources/Public/JavaScript/Contrib/foo',
364 'location' =>
'/typo3conf/ext/bar/Resources/Public/JavaScript/Contrib/bar',
369 foreach ($packages as $package) {
370 $subject->addRequireJsConfiguration([
371 'packages' => [$package]
375 $expectedConfiguration = json_encode([
'packages' => $packages]);
377 $expectedConfiguration = trim($expectedConfiguration,
'{}');
379 $renderedString = $subject->render();
380 self::assertStringContainsString($expectedConfiguration, $renderedString);