public function test_js_files() { global $CFG; $testfile1 = "{$CFG->tempdir}/test1.js"; $testfile2 = "{$CFG->tempdir}/test2.js"; $testfile3 = "{$CFG->tempdir}/test3.js"; $js1 = "\nfunction hm()\n{\n}\n"; $js2 = "function oh(){}"; file_put_contents($testfile1, $js1); file_put_contents($testfile2, $js2); $files = array($testfile1, $testfile2); $this->assertSame("function hm(){};\nfunction oh(){}", core_minify::js_files($files)); $files = array($testfile1, $testfile2, $testfile3); $this->assertStringStartsWith("function hm(){};\nfunction oh(){};\n\n\n// Cannot read JS file ", @core_minify::js_files($files)); unlink($testfile1); unlink($testfile2); }
/** * Minify JavaScript files. * * @deprecated since 2.6 * * @param array $files * @return string */ function js_minify($files) { debugging('js_minify() is deprecated, use core_minify::js_files() or core_minify::js() instead.'); return core_minify::js_files($files); }
/** * Allow setting of the config function described in {@see set_config_function} from a file. * The contents of this file are then passed to set_config_function. * * When jsrev is positive, the function is minified and stored in a MUC cache for subsequent uses. * * @param $file The path to the JavaScript function used for YUI configuration. * @return String the name of the function to use in the group pattern configuration. */ public function set_config_source($file) { global $CFG; $cache = cache::make('core', 'yuimodules'); // Attempt to get the metadata from the cache. $keyname = 'configfn_' . $file; $fullpath = $CFG->dirroot . '/' . $file; if (!isset($CFG->jsrev) || $CFG->jsrev == -1) { $cache->delete($keyname); $configfn = file_get_contents($fullpath); } else { $configfn = $cache->get($keyname); if ($configfn === false) { require_once $CFG->libdir . '/jslib.php'; $configfn = core_minify::js_files(array($fullpath)); $cache->set($keyname, $configfn); } } return $this->set_config_function($configfn); }
if ($rev > 0 and file_exists($candidate)) { if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) || !empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { // we do not actually need to verify the etag value because our files // never change in cache because we increment the rev parameter js_send_unmodified(filemtime($candidate), $etag); } js_send_cached($candidate, $etag); } //================================================================================= // ok, now we need to start normal moodle script, we need to load all libs and $DB define('ABORT_AFTER_CONFIG_CANCEL', true); define('NO_MOODLE_COOKIES', true); // Session not used here define('NO_UPGRADE_CHECK', true); // Ignore upgrade check require "{$CFG->dirroot}/lib/setup.php"; $theme = theme_config::load($themename); $themerev = theme_get_revision(); if ($themerev <= 0 or $rev != $themerev) { // Do not send caching headers if they do not request current revision, // we do not want to pollute browser caches with outdated JS. js_send_uncached($theme->javascript_content($type)); } make_localcache_directory('theme', false); js_write_cache_file_content($candidate, core_minify::js_files($theme->javascript_files($type))); // Verify nothing failed in cache file creation. clearstatcache(); if (file_exists($candidate)) { js_send_cached($candidate, $etag); } js_send_uncached($theme->javascript_content($type));
// If-Modified-Since requests so there is no need to handle them specially. header('Expires: ' . date('r', time() + 365 * 24 * 3600)); header('Cache-Control: max-age=' . 365 * 24 * 3600); // Pragma is set to no-cache by default so must be overridden. header('Pragma:'); } // Get the right MIME type. $mimetype = mimeinfo('type', $file); // For JS files, these can be minified and stored in cache. if ($mimetype === 'application/x-javascript' && $allowcache) { // The cached file is stored without version number etc. This is okay // because $CFG->cachedir is cleared each time there is a plugin update, // such as a new version of a tinymce plugin. // Flatten filename and include cache location. $cache = $CFG->cachedir . '/editor_tinymce/pluginjs'; $cachefile = $cache . '/' . $tinymceplugin . str_replace('/', '_', $innerpath); // If it doesn't exist, minify it and save to that location. if (!file_exists($cachefile)) { $content = core_minify::js_files(array($file)); js_write_cache_file_content($cachefile, $content); } $file = $cachefile; } else { if ($mimetype === 'text/html') { header('X-UA-Compatible: IE=edge'); } } // Serve file. header('Content-Length: ' . filesize($file)); header('Content-Type: ' . $mimetype); readfile($file);
$jsfiles[] = $jsfile; } if (!$jsfiles) { // bad luck - no valid files die; } $etag = sha1($rev . implode(',', $jsfiles)); // Use the caching only for meaningful revision numbers which prevents future cache poisoning. if ($rev > 0 and $rev < time() + 60 * 60) { $candidate = $CFG->localcachedir . '/js/' . $etag; if (file_exists($candidate)) { if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) || !empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { // we do not actually need to verify the etag value because our files // never change in cache because we increment the rev parameter js_send_unmodified(filemtime($candidate), $etag); } js_send_cached($candidate, $etag); } else { js_write_cache_file_content($candidate, core_minify::js_files($jsfiles)); // verify nothing failed in cache file creation clearstatcache(); if (file_exists($candidate)) { js_send_cached($candidate, $etag); } } } $content = ''; foreach ($jsfiles as $jsfile) { $content .= file_get_contents($jsfile) . "\n"; } js_send_uncached($content, $etag);