Merge pull request #7310 from owncloud/no-css-js-delivery-via-php
No css js delivery via php
This commit is contained in:
commit
079d64ce75
|
@ -264,6 +264,9 @@ $CONFIG = array(
|
|||
/* whether usage of the instance should be restricted to admin users only */
|
||||
'singleuser' => false,
|
||||
|
||||
/* all css and js files will be served by the web server statically in one js file and ons css file*/
|
||||
'asset-pipeline.enabled' => false,
|
||||
|
||||
/* where mount.json file should be stored, defaults to data/mount.json */
|
||||
'mount_file' => '',
|
||||
);
|
||||
|
|
|
@ -25,11 +25,11 @@ OC.Tags= {
|
|||
});
|
||||
self.deleteButton = {
|
||||
text: t('core', 'Delete'),
|
||||
click: function() {self._deleteTags(self, type, self._selectedIds())},
|
||||
click: function() {self._deleteTags(self, type, self._selectedIds())}
|
||||
};
|
||||
self.addButton = {
|
||||
text: t('core', 'Add'),
|
||||
click: function() {self._addTag(self, type, self.$taginput.val())},
|
||||
click: function() {self._addTag(self, type, self.$taginput.val())}
|
||||
};
|
||||
|
||||
self._fillTagList(type, self.$taglist);
|
||||
|
@ -349,5 +349,5 @@ OC.Tags= {
|
|||
console.warn(response);
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
<?php
|
||||
session_write_close();
|
||||
|
||||
OC_App::loadApps();
|
||||
|
||||
if ($service == 'core.css') {
|
||||
$minimizer = new OC_Minimizer_CSS();
|
||||
$files = OC_TemplateLayout::findStylesheetFiles(OC_Util::$coreStyles);
|
||||
$minimizer->output($files, $service);
|
||||
}
|
||||
else if ($service == 'core.js') {
|
||||
$minimizer = new OC_Minimizer_JS();
|
||||
$files = OC_TemplateLayout::findJavascriptFiles(OC_Util::$coreScripts);
|
||||
$minimizer->output($files, $service);
|
||||
}
|
|
@ -100,9 +100,6 @@ $this->create('core_avatar_post_cropped', '/avatar/cropped')
|
|||
->action('OC\Core\Avatar\Controller', 'postCroppedAvatar');
|
||||
|
||||
// Not specifically routed
|
||||
$this->create('app_css', '/apps/{app}/{file}')
|
||||
->requirements(array('file' => '.*.css'))
|
||||
->action('OC', 'loadCSSFile');
|
||||
$this->create('app_index_script', '/apps/{app}/')
|
||||
->defaults(array('file' => 'index.php'))
|
||||
//->requirements(array('file' => '.*.php'))
|
||||
|
|
22
lib/base.php
22
lib/base.php
|
@ -284,10 +284,6 @@ class OC {
|
|||
if (self::needUpgrade()) {
|
||||
if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
|
||||
OC_Config::setValue('theme', '');
|
||||
$minimizerCSS = new OC_Minimizer_CSS();
|
||||
$minimizerCSS->clearCache();
|
||||
$minimizerJS = new OC_Minimizer_JS();
|
||||
$minimizerJS->clearCache();
|
||||
OC_Util::addScript('config'); // needed for web root
|
||||
OC_Util::addScript('update');
|
||||
$tmpl = new OC_Template('', 'update.admin', 'guest');
|
||||
|
@ -725,11 +721,6 @@ class OC {
|
|||
$app = OC::$REQUESTEDAPP;
|
||||
$file = OC::$REQUESTEDFILE;
|
||||
$param = array('app' => $app, 'file' => $file);
|
||||
// Handle app css files
|
||||
if (substr($file, -3) == 'css') {
|
||||
self::loadCSSFile($param);
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle redirect URL for logged in users
|
||||
if (isset($_REQUEST['redirect_url']) && OC_User::isLoggedIn()) {
|
||||
|
@ -796,19 +787,6 @@ class OC {
|
|||
return false;
|
||||
}
|
||||
|
||||
public static function loadCSSFile($param) {
|
||||
$app = $param['app'];
|
||||
$file = $param['file'];
|
||||
$app_path = OC_App::getAppPath($app);
|
||||
if (file_exists($app_path . '/' . $file)) {
|
||||
$app_web_path = OC_App::getAppWebPath($app);
|
||||
$filepath = $app_web_path . '/' . $file;
|
||||
$minimizer = new OC_Minimizer_CSS();
|
||||
$info = array($app_path, $app_web_path, $file);
|
||||
$minimizer->output(array($info), $filepath);
|
||||
}
|
||||
}
|
||||
|
||||
protected static function handleLogin() {
|
||||
OC_App::loadApps(array('prelogin'));
|
||||
$error = array();
|
||||
|
|
|
@ -69,17 +69,6 @@ class OC_App{
|
|||
}
|
||||
ob_end_clean();
|
||||
|
||||
if (!defined('DEBUG') || !DEBUG) {
|
||||
if (is_null($types)
|
||||
&& empty(OC_Util::$coreScripts)
|
||||
&& empty(OC_Util::$coreStyles)) {
|
||||
OC_Util::$coreScripts = OC_Util::$scripts;
|
||||
OC_Util::$scripts = array();
|
||||
OC_Util::$coreStyles = OC_Util::$styles;
|
||||
OC_Util::$styles = array();
|
||||
}
|
||||
}
|
||||
// return
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
<?php
|
||||
|
||||
abstract class OC_Minimizer {
|
||||
public function generateETag($files) {
|
||||
$fullpath_files = array();
|
||||
foreach($files as $file_info) {
|
||||
$fullpath_files[] = $file_info[0] . '/' . $file_info[2];
|
||||
}
|
||||
return OC_Cache::generateCacheKeyFromFiles($fullpath_files);
|
||||
}
|
||||
|
||||
abstract public function minimizeFiles($files);
|
||||
|
||||
public function output($files, $cache_key) {
|
||||
header('Content-Type: '.$this->contentType);
|
||||
OC_Response::enableCaching();
|
||||
$etag = $this->generateETag($files);
|
||||
$cache_key .= '-'.$etag;
|
||||
|
||||
$gzout = false;
|
||||
$cache = OC_Cache::getGlobalCache();
|
||||
if (!OC_Request::isNoCache() && (!defined('DEBUG') || !DEBUG)) {
|
||||
OC_Response::setETagHeader($etag);
|
||||
$gzout = $cache->get($cache_key.'.gz');
|
||||
}
|
||||
|
||||
if (!$gzout) {
|
||||
$out = $this->minimizeFiles($files);
|
||||
$gzout = gzencode($out);
|
||||
$cache->set($cache_key.'.gz', $gzout);
|
||||
OC_Response::setETagHeader($etag);
|
||||
}
|
||||
// on some systems (e.g. SLES 11, but not Ubuntu) mod_deflate and zlib compression will compress the output twice.
|
||||
// This results in broken core.css and core.js. To avoid it, we switch off zlib compression.
|
||||
// Since mod_deflate is still active, Apache will compress what needs to be compressed, i.e. no disadvantage.
|
||||
if(function_exists('apache_get_modules') && ini_get('zlib.output_compression') && in_array('mod_deflate', apache_get_modules())) {
|
||||
ini_set('zlib.output_compression', 'Off');
|
||||
}
|
||||
if ($encoding = OC_Request::acceptGZip()) {
|
||||
header('Content-Encoding: '.$encoding);
|
||||
$out = $gzout;
|
||||
} else {
|
||||
$out = gzdecode($gzout);
|
||||
}
|
||||
header('Content-Length: '.strlen($out));
|
||||
echo $out;
|
||||
}
|
||||
|
||||
public function clearCache() {
|
||||
$cache = OC_Cache::getGlobalCache();
|
||||
$cache->clear('core.css');
|
||||
$cache->clear('core.js');
|
||||
}
|
||||
}
|
||||
|
||||
if (!function_exists('gzdecode')) {
|
||||
function gzdecode($data, $maxlength=null, &$filename='', &$error='')
|
||||
{
|
||||
if (strcmp(substr($data, 0, 9),"\x1f\x8b\x8\0\0\0\0\0\0")) {
|
||||
return null; // Not the GZIP format we expect (See RFC 1952)
|
||||
}
|
||||
return gzinflate(substr($data, 10, -8));
|
||||
}
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
<?php
|
||||
|
||||
require_once 'mediawiki/CSSMin.php';
|
||||
|
||||
class OC_Minimizer_CSS extends OC_Minimizer
|
||||
{
|
||||
protected $contentType = 'text/css';
|
||||
|
||||
public function minimizeFiles($files) {
|
||||
$css_out = '';
|
||||
$webroot = (string) OC::$WEBROOT;
|
||||
foreach($files as $file_info) {
|
||||
$file = $file_info[0] . '/' . $file_info[2];
|
||||
$css_out .= '/* ' . $file . ' */' . "\n";
|
||||
$css = file_get_contents($file);
|
||||
|
||||
$in_root = false;
|
||||
foreach(OC::$APPSROOTS as $app_root) {
|
||||
if(strpos($file, $app_root['path'].'/') === 0) {
|
||||
$in_root = rtrim($webroot.$app_root['url'], '/');
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($in_root !== false) {
|
||||
$css = str_replace('%appswebroot%', $in_root, $css);
|
||||
$css = str_replace('%webroot%', $webroot, $css);
|
||||
}
|
||||
$remote = $file_info[1];
|
||||
$remote .= '/';
|
||||
$remote .= dirname($file_info[2]);
|
||||
$css_out .= CSSMin::remap($css, dirname($file), $remote, true);
|
||||
}
|
||||
if (!defined('DEBUG') || !DEBUG) {
|
||||
$css_out = CSSMin::minify($css_out);
|
||||
}
|
||||
return $css_out;
|
||||
}
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
<?php
|
||||
|
||||
require_once 'mediawiki/JavaScriptMinifier.php';
|
||||
|
||||
class OC_Minimizer_JS extends OC_Minimizer
|
||||
{
|
||||
protected $contentType = 'application/javascript';
|
||||
|
||||
public function minimizeFiles($files) {
|
||||
$js_out = '';
|
||||
foreach($files as $file_info) {
|
||||
$file = $file_info[0] . '/' . $file_info[2];
|
||||
$js_out .= '/* ' . $file . ' */' . "\n";
|
||||
$js_out .= file_get_contents($file);
|
||||
}
|
||||
if (!defined('DEBUG') || !DEBUG) {
|
||||
$js_out = JavaScriptMinifier::minify($js_out);
|
||||
}
|
||||
return $js_out;
|
||||
}
|
||||
}
|
|
@ -179,33 +179,6 @@ class OC_Request {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check if this is a no-cache request
|
||||
* @return boolean true for no-cache
|
||||
*/
|
||||
static public function isNoCache() {
|
||||
if (!isset($_SERVER['HTTP_CACHE_CONTROL'])) {
|
||||
return false;
|
||||
}
|
||||
return $_SERVER['HTTP_CACHE_CONTROL'] == 'no-cache';
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check if the requestor understands gzip
|
||||
* @return false|string true for gzip encoding supported
|
||||
*/
|
||||
static public function acceptGZip() {
|
||||
if (!isset($_SERVER['HTTP_ACCEPT_ENCODING'])) {
|
||||
return false;
|
||||
}
|
||||
$HTTP_ACCEPT_ENCODING = $_SERVER["HTTP_ACCEPT_ENCODING"];
|
||||
if( strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false )
|
||||
return 'x-gzip';
|
||||
else if( strpos($HTTP_ACCEPT_ENCODING, 'gzip') !== false )
|
||||
return 'gzip';
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Check if the requester sent along an mtime
|
||||
* @return false or an mtime
|
||||
|
|
|
@ -97,8 +97,6 @@ class OC_Setup {
|
|||
$appConfig = \OC::$server->getAppConfig();
|
||||
$appConfig->setValue('core', 'installedat', microtime(true));
|
||||
$appConfig->setValue('core', 'lastupdatedat', microtime(true));
|
||||
$appConfig->setValue('core', 'remote_core.css', '/core/minimizer.php');
|
||||
$appConfig->setValue('core', 'remote_core.js', '/core/minimizer.php');
|
||||
|
||||
OC_Group::createGroup('admin');
|
||||
OC_Group::addToGroup($username, 'admin');
|
||||
|
|
|
@ -22,7 +22,7 @@ class CSSResourceLocator extends ResourceLocator {
|
|||
$app = substr($style, 0, strpos($style, '/'));
|
||||
$style = substr($style, strpos($style, '/')+1);
|
||||
$app_path = \OC_App::getAppPath($app);
|
||||
$app_url = $this->webroot . '/index.php/apps/' . $app;
|
||||
$app_url = \OC_App::getAppWebPath($app);
|
||||
if ($this->appendIfExist($app_path, $style.$this->form_factor.'.css', $app_url)
|
||||
|| $this->appendIfExist($app_path, $style.'.css', $app_url)
|
||||
) {
|
||||
|
|
|
@ -1,4 +1,11 @@
|
|||
<?php
|
||||
use Assetic\Asset\AssetCollection;
|
||||
use Assetic\Asset\FileAsset;
|
||||
use Assetic\Asset\GlobAsset;
|
||||
use Assetic\AssetManager;
|
||||
use Assetic\AssetWriter;
|
||||
use Assetic\Filter\CssRewriteFilter;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
|
@ -57,35 +64,38 @@ class OC_TemplateLayout extends OC_Template {
|
|||
} else {
|
||||
parent::__construct('core', 'layout.base');
|
||||
}
|
||||
|
||||
$versionParameter = '?v=' . md5(implode(OC_Util::getVersion()));
|
||||
// Add the js files
|
||||
$jsfiles = self::findJavascriptFiles(OC_Util::$scripts);
|
||||
$this->assign('jsfiles', array(), false);
|
||||
if (OC_Config::getValue('installed', false) && $renderas!='error') {
|
||||
$useAssetPipeline = OC_Config::getValue('asset-pipeline.enabled', false);
|
||||
if ($useAssetPipeline) {
|
||||
|
||||
$this->append( 'jsfiles', OC_Helper::linkToRoute('js_config') . $versionParameter);
|
||||
}
|
||||
if (!empty(OC_Util::$coreScripts)) {
|
||||
$this->append( 'jsfiles', OC_Helper::linkToRemoteBase('core.js', false) . $versionParameter);
|
||||
}
|
||||
foreach($jsfiles as $info) {
|
||||
$root = $info[0];
|
||||
$web = $info[1];
|
||||
$file = $info[2];
|
||||
$this->append( 'jsfiles', $web.'/'.$file . $versionParameter);
|
||||
}
|
||||
|
||||
// Add the css files
|
||||
$cssfiles = self::findStylesheetFiles(OC_Util::$styles);
|
||||
$this->assign('cssfiles', array());
|
||||
if (!empty(OC_Util::$coreStyles)) {
|
||||
$this->append( 'cssfiles', OC_Helper::linkToRemoteBase('core.css', false) . $versionParameter);
|
||||
}
|
||||
foreach($cssfiles as $info) {
|
||||
$root = $info[0];
|
||||
$web = $info[1];
|
||||
$file = $info[2];
|
||||
$this->generateAssets();
|
||||
|
||||
$this->append( 'cssfiles', $web.'/'.$file . $versionParameter);
|
||||
} else {
|
||||
|
||||
// Add the js files
|
||||
$jsfiles = self::findJavascriptFiles(OC_Util::$scripts);
|
||||
$this->assign('jsfiles', array(), false);
|
||||
if (OC_Config::getValue('installed', false) && $renderas!='error') {
|
||||
$this->append( 'jsfiles', OC_Helper::linkToRoute('js_config') . $versionParameter);
|
||||
}
|
||||
foreach($jsfiles as $info) {
|
||||
$web = $info[1];
|
||||
$file = $info[2];
|
||||
$this->append( 'jsfiles', $web.'/'.$file . $versionParameter);
|
||||
}
|
||||
|
||||
// Add the css files
|
||||
$cssfiles = self::findStylesheetFiles(OC_Util::$styles);
|
||||
$this->assign('cssfiles', array());
|
||||
foreach($cssfiles as $info) {
|
||||
$web = $info[1];
|
||||
$file = $info[2];
|
||||
|
||||
$this->append( 'cssfiles', $web.'/'.$file . $versionParameter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -116,4 +126,57 @@ class OC_TemplateLayout extends OC_Template {
|
|||
$locator->find($scripts);
|
||||
return $locator->getResources();
|
||||
}
|
||||
|
||||
public function generateAssets()
|
||||
{
|
||||
$jsFiles = self::findJavascriptFiles(OC_Util::$scripts);
|
||||
$jsHash = self::hashScriptNames($jsFiles);
|
||||
|
||||
if (!file_exists("assets/$jsHash.js")) {
|
||||
$jsFiles = array_map(function ($item) {
|
||||
$root = $item[0];
|
||||
$file = $item[2];
|
||||
return new FileAsset($root . '/' . $file, array(), $root, $file);
|
||||
}, $jsFiles);
|
||||
$jsCollection = new AssetCollection($jsFiles);
|
||||
$jsCollection->setTargetPath("assets/$jsHash.js");
|
||||
|
||||
$writer = new AssetWriter(\OC::$SERVERROOT);
|
||||
$writer->writeAsset($jsCollection);
|
||||
}
|
||||
|
||||
$cssFiles = self::findStylesheetFiles(OC_Util::$styles);
|
||||
$cssHash = self::hashScriptNames($cssFiles);
|
||||
|
||||
if (!file_exists("assets/$cssHash.css")) {
|
||||
$cssFiles = array_map(function ($item) {
|
||||
$root = $item[0];
|
||||
$file = $item[2];
|
||||
$assetPath = $root . '/' . $file;
|
||||
$sourceRoot = \OC::$SERVERROOT;
|
||||
$sourcePath = substr($assetPath, strlen(\OC::$SERVERROOT));
|
||||
return new FileAsset($assetPath, array(new CssRewriteFilter()), $sourceRoot, $sourcePath);
|
||||
}, $cssFiles);
|
||||
$cssCollection = new AssetCollection($cssFiles);
|
||||
$cssCollection->setTargetPath("assets/$cssHash.css");
|
||||
|
||||
$writer = new AssetWriter(\OC::$SERVERROOT);
|
||||
$writer->writeAsset($cssCollection);
|
||||
}
|
||||
|
||||
$this->append('jsfiles', OC_Helper::linkTo('assets', "$jsHash.js"));
|
||||
$this->append('cssfiles', OC_Helper::linkTo('assets', "$cssHash.css"));
|
||||
}
|
||||
|
||||
private static function hashScriptNames($files)
|
||||
{
|
||||
$files = array_map(function ($item) {
|
||||
$root = $item[0];
|
||||
$file = $item[2];
|
||||
return $root . '/' . $file;
|
||||
}, $files);
|
||||
|
||||
sort($files);
|
||||
return hash('md5', implode('', $files));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,8 +11,6 @@ class OC_Util {
|
|||
public static $headers=array();
|
||||
private static $rootMounted=false;
|
||||
private static $fsSetup=false;
|
||||
public static $coreStyles=array();
|
||||
public static $coreScripts=array();
|
||||
|
||||
/**
|
||||
* @brief Can be set up
|
||||
|
|
Loading…
Reference in New Issue