diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index fdf1632d6..eb0438a68 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -2270,11 +2270,12 @@ class Context * Returns the list of javascripts that matches the given type. * * @param string $type Added position. (head:
.., body:..) + * @param bool $finalize (optional) * @return array Returns javascript file list. Array contains file, targetie. */ - public static function getJsFile($type = 'head') + public static function getJsFile($type = 'head', $finalize = false) { - return self::$_instance->oFrontEndFileHandler->getJsFileList($type); + return self::$_instance->oFrontEndFileHandler->getJsFileList($type, $finalize); } /** @@ -2322,11 +2323,12 @@ class Context /** * Return a list of css files * + * @param bool $finalize (optional) * @return array Returns css file list. Array contains file, media, targetie. */ - public static function getCSSFile() + public static function getCSSFile($finalize = false) { - return self::$_instance->oFrontEndFileHandler->getCssFileList(); + return self::$_instance->oFrontEndFileHandler->getCssFileList($finalize); } /** diff --git a/classes/frontendfile/FrontEndFileHandler.class.php b/classes/frontendfile/FrontEndFileHandler.class.php index e2c69ac95..2f2c27408 100644 --- a/classes/frontendfile/FrontEndFileHandler.class.php +++ b/classes/frontendfile/FrontEndFileHandler.class.php @@ -359,9 +359,10 @@ class FrontEndFileHandler extends Handler /** * Get css file list * + * @param bool $finalize (optional) * @return array Returns css file list. Array contains file, media, targetie. */ - public function getCssFileList() + public function getCssFileList($finalize = false) { $map = &$this->cssMap; $mapIndex = &$this->cssMapIndex; @@ -370,25 +371,28 @@ class FrontEndFileHandler extends Handler $this->_sortMap($map, $mapIndex); // Minify all scripts, and compile LESS/SCSS into CSS. - foreach ($map as $indexedMap) + if ($finalize) { - foreach ($indexedMap as $file) + foreach ($map as $indexedMap) { - $minify_this_file = !$file->isMinified && !$file->isExternalURL && !$file->isCachedScript && (($file->isCommon && $minify !== 'none') || $minify === 'all'); - if ($file->fileExtension === 'css') + foreach ($indexedMap as $file) { - $this->proc_CSS_JS($file, $minify_this_file); - } - else - { - $this->proc_LESS_SCSS($file, $minify_this_file); + $minify_this_file = !$file->isMinified && !$file->isExternalURL && !$file->isCachedScript && (($file->isCommon && $minify !== 'none') || $minify === 'all'); + if ($file->fileExtension === 'css') + { + $this->proc_CSS_JS($file, $minify_this_file); + } + else + { + $this->proc_LESS_SCSS($file, $minify_this_file); + } } } } // Add all files to the final result. $result = array(); - if ($concat && count($concat_list = $this->_concatMap($map))) + if ($concat && $finalize && count($concat_list = $this->_concatMap($map))) { foreach ($concat_list as $concat_fileset) { @@ -436,6 +440,18 @@ class FrontEndFileHandler extends Handler } } } + + // Enable HTTP/2 server push for CSS resources. + if ($finalize && config('view.server_push') && strncmp($_SERVER['SERVER_PROTOCOL'], 'HTTP/2', 6) === 0) + { + foreach ($result as $resource) + { + if ($resource['file'][0] === '/' && $resource['file'][1] !== '/') + { + header(sprintf('Link: <%s>; rel=preload; as=style', $resource['file']), false); + } + } + } return $result; } @@ -443,9 +459,10 @@ class FrontEndFileHandler extends Handler * Get javascript file list * * @param string $type Type of javascript. head, body + * @param bool $finalize (optional) * @return array Returns javascript file list. Array contains file, targetie. */ - public function getJsFileList($type = 'head') + public function getJsFileList($type = 'head', $finalize = false) { if($type == 'head') { @@ -463,20 +480,23 @@ class FrontEndFileHandler extends Handler $this->_sortMap($map, $mapIndex); // Minify all scripts. - foreach ($map as $indexedMap) + if ($finalize) { - foreach ($indexedMap as $file) + foreach ($map as $indexedMap) { - if (!$file->isMinified && !$file->isExternalURL && !$file->isCachedScript && (($file->isCommon && $minify !== 'none') || $minify === 'all')) + foreach ($indexedMap as $file) { - $this->proc_CSS_JS($file, true); + if (!$file->isMinified && !$file->isExternalURL && !$file->isCachedScript && (($file->isCommon && $minify !== 'none') || $minify === 'all')) + { + $this->proc_CSS_JS($file, true); + } } } } // Add all files to the final result. $result = array(); - if ($concat && $type === 'head' && count($concat_list = $this->_concatMap($map))) + if ($concat && $finalize && $type === 'head' && count($concat_list = $this->_concatMap($map))) { foreach ($concat_list as $concat_fileset) { @@ -524,6 +544,18 @@ class FrontEndFileHandler extends Handler } } } + + // Enable HTTP/2 server push for JS resources. + if ($type === 'head' && $finalize && config('view.server_push') && strncmp($_SERVER['SERVER_PROTOCOL'], 'HTTP/2', 6) === 0) + { + foreach ($result as $resource) + { + if ($resource['file'][0] === '/' && $resource['file'][1] !== '/') + { + header(sprintf('Link: <%s>; rel=preload; as=script', $resource['file']), false); + } + } + } return $result; } diff --git a/common/defaults/config.php b/common/defaults/config.php index 05c9426dd..6e614bf75 100644 --- a/common/defaults/config.php +++ b/common/defaults/config.php @@ -74,6 +74,7 @@ return array( 'view' => array( 'minify_scripts' => 'common', 'concat_scripts' => 'none', + 'server_push' => false, 'use_gzip' => false, ), 'admin' => array( diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index d2859c612..cb70b9c19 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -15,14 +15,14 @@{$lang->about_concat_scripts}
+