MDL-21193 finally fixed YUI3 laoding - now fully cached and working - yay!

This commit is contained in:
Petr Skoda 2009-12-28 23:08:55 +00:00
parent 7a82b2afc8
commit 945f19f77d
4 changed files with 90 additions and 60 deletions

View file

@ -25,54 +25,6 @@
*/
/**
* Initialise a {@link page_requirements_manager} with the bits of JavaScript that every
* Moodle page should have.
*
* @param page_requirements_manager $requires The page_requirements_manager to initialise.
*/
function setup_core_javascript(page_requirements_manager $requires) {
global $CFG, $OUTPUT, $PAGE;
// JavaScript should always work with $CFG->httpswwwroot rather than $CFG->wwwroot.
// Otherwise, in some situations, users will get warnings about insecure content
// on sercure pages from their web browser.
$config = array(
'wwwroot' => $CFG->httpswwwroot, // Yes, really. See above.
'sesskey' => sesskey(),
'loadingicon' => $OUTPUT->pix_url('i/loading_small', 'moodle')->out_raw(),
'themerev' => theme_get_revision(),
'theme' => $PAGE->theme->name,
);
if (debugging('', DEBUG_DEVELOPER)) {
$config['developerdebug'] = true;
}
$requires->data_for_js('moodle_cfg', $config)->in_head();
if (debugging('', DEBUG_DEVELOPER)) {
$requires->yui2_lib('logger');
}
// YUI3 init code
$requires->yui3_lib(array('cssreset', 'cssbase', 'cssfonts', 'cssgrids')); // full CSS reset
$requires->yui3_lib('yui'); // allows autoloading of everything else
$requires->skip_link_to('maincontent', get_string('tocontent', 'access'));
// Note that, as a short-cut, the code
// $js = "document.body.className += ' jsenabled';\n";
// is hard-coded in {@link page_requirements_manager::get_top_of_body_code)
$requires->yui2_lib('container');
$requires->yui2_lib('connection');
$requires->string_for_js('confirmation', 'admin');
$requires->string_for_js('cancel', 'moodle');
$requires->string_for_js('yes', 'moodle');
$requires->js_function_call('init_help_icons');
}
/**
* This class tracks all the things that are needed by the current page.
*
@ -110,16 +62,19 @@ class page_requirements_manager {
protected $headdone = false;
protected $topofbodydone = false;
/** YUI PHPLoader instance responsible for YUI3 laoding in page head only */
protected $yui3loader;
/** YUI PHPLoader instance responsible for YUI2 laoding */
/** YUI PHPLoader instance responsible for YUI2 loading from PHP only */
protected $yui2loader;
/** YUI PHPLoader instance responsible for YUI3 loading from PHP only */
protected $yui3loader;
/** YUI PHPLoader instance responsible for YUI3 loading from javascript */
protected $json_yui3loader;
/**
* Page requirements constructor.
*/
public function __construct() {
global $CFG;
require_once("$CFG->libdir/yui/phploader/phploader/loader.php");
$this->yui3loader = new YAHOO_util_Loader($CFG->yui3version);
@ -136,18 +91,84 @@ class page_requirements_manager {
if (!empty($CFG->useexternalyui)) {
$this->yui3loader->base = 'http://yui.yahooapis.com/' . $CFG->yui3version . '/build/';
$this->yui2loader->base = 'http://yui.yahooapis.com/' . $CFG->yui2version . '/build/';
$this->yui3loader->comboBase = 'http://yui.yahooapis.com/combo?';
$this->yui2loader->comboBase = 'http://yui.yahooapis.com/combo?';
} else {
$this->yui3loader->base = $CFG->httpswwwroot . '/lib/yui/'. $CFG->yui3version . '/build/';
$this->yui2loader->base = $CFG->httpswwwroot . '/lib/yui/'. $CFG->yui2version . '/build/';
}
// This file helps to minimise number of http requests and implements proper caching
$this->yui3loader->comboBase = $CFG->httpswwwroot . '/theme/yui_combo.php?';
$this->yui2loader->comboBase = $CFG->httpswwwroot . '/theme/yui_combo.php?';
}
// enable combo loader? this significantly helps with caching and performance
// enable combo loader? this significantly helps with caching and performance!
$this->yui3loader->combine = !empty($CFG->yuicomboloading);
$this->yui2loader->combine = !empty($CFG->yuicomboloading);
// set up JS loader helper object
$this->json_yui3loader = new stdClass();
$this->json_yui3loader->base = $this->yui3loader->base;
$this->json_yui3loader->comboBase = $this->yui3loader->comboBase;
$this->json_yui3loader->combine = $this->yui3loader->combine;
$this->json_yui3loader->filter = ($this->yui3loader->filter == YUI_DEBUG) ? 'debug' : '';
}
/**
* Initialise with the bits of JavaScript that every Moodle page should have.
*
* @param moodle_page $page
* @param core_renderer $output
*/
function setup_core_javascript(moodle_page $page, core_renderer $output) {
global $CFG;
// JavaScript should always work with $CFG->httpswwwroot rather than $CFG->wwwroot.
// Otherwise, in some situations, users will get warnings about insecure content
// on sercure pages from their web browser.
//TODO: problem here is we may need this in some included JS - move this somehow to the very beginning
// right after the YUI loading
$config = array(
'wwwroot' => $CFG->httpswwwroot, // Yes, really. See above.
'sesskey' => sesskey(),
'loadingicon' => $output->pix_url('i/loading_small', 'moodle')->out_raw(),
'themerev' => theme_get_revision(),
'theme' => $page->theme->name,
'yui2loaderBase' => $this->yui2loader->base,
'yui3loaderBase' => $this->yui3loader->base,
'yui2loaderComboBase' => $this->yui2loader->comboBase,
'yui3loaderComboBase' => $this->yui3loader->comboBase,
'yuicombine' => (int)$this->yui3loader->combine,
'yuifilter' => debugging('', DEBUG_DEVELOPER) ? 'debug' : '',
);
if (debugging('', DEBUG_DEVELOPER)) {
$config['developerdebug'] = true;
}
$this->data_for_js('moodle_cfg', $config)->in_head();
// note: in JavaScript use "YUI(yui3loader).use('overlay', function(Y) { .... });"
$this->data_for_js('yui3loader', $this->json_yui3loader)->in_head();
if (debugging('', DEBUG_DEVELOPER)) {
$this->yui2_lib('logger');
}
// YUI3 init code
$this->yui3_lib(array('cssreset', 'cssbase', 'cssfonts', 'cssgrids')); // full CSS reset
$this->yui3_lib(array('yui', 'loader')); // allows autoloading of everything else
$this->skip_link_to('maincontent', get_string('tocontent', 'access'));
// Note that, as a short-cut, the code
// $js = "document.body.className += ' jsenabled';\n";
// is hard-coded in {@link page_requirements_manager::get_top_of_body_code)
$this->yui2_lib('container');
$this->yui2_lib('connection');
$this->string_for_js('confirmation', 'admin');
$this->string_for_js('cancel', 'moodle');
$this->string_for_js('yes', 'moodle');
$this->js_function_call('init_help_icons');
}
/**
@ -511,8 +532,10 @@ class page_requirements_manager {
*
* @return string the HTML code to to inside the <head> tag.
*/
public function get_head_code() {
setup_core_javascript($this);
public function get_head_code($page, $output) {
// note: the $page and $output are not stored here because it would
// create circular references in memory which prevents garbage collection
$this->setup_core_javascript($page, $output);
$output = $this->get_yui3lib_headcode();
$output .= $this->get_yui2lib_code();
$output .= $this->get_linked_resources_code(self::WHEN_IN_HEAD);

View file

@ -394,7 +394,7 @@ class core_renderer extends renderer_base {
}
// Get any HTML from the page_requirements_manager.
$output .= $this->page->requires->get_head_code();
$output .= $this->page->requires->get_head_code($this->page, $this);
// List alternate versions.
foreach ($this->page->alternateversions as $type => $alt) {

View file

@ -33,6 +33,8 @@ if (!$parts = combo_params()) {
combo_not_found();
}
$parts = trim($parts, '&');
// find out what we are serving - only one type per request
$content = '';
if (substr($parts, -3) === '.js') {
@ -46,6 +48,9 @@ if (substr($parts, -3) === '.js') {
$parts = explode('&', $parts);
foreach ($parts as $part) {
if (empty($part)) {
continue;
}
$part = min_clean_param($part, 'SAFEPATH');
$bits = explode('/', $part);
if (count($bits) < 2) {
@ -81,6 +86,7 @@ function combo_send_cached($content, $mimetype) {
header('Last-Modified: '. gmdate('D, d M Y H:i:s', time()) .' GMT');
header('Expires: '. gmdate('D, d M Y H:i:s', time() + $lifetime) .' GMT');
header('Pragma: ');
header('Cache-Control: max-age=315360000');
header('Accept-Ranges: none');
header('Content-Type: '.$mimetype);
header('Content-Length: '.strlen($content));

View file

@ -70,6 +70,7 @@ function yui_image_cached($imagepath) {
header('Last-Modified: '. gmdate('D, d M Y H:i:s', filemtime($imagepath)) .' GMT');
header('Expires: '. gmdate('D, d M Y H:i:s', time() + $lifetime) .' GMT');
header('Pragma: ');
header('Cache-Control: max-age=315360000');
header('Accept-Ranges: none');
header('Content-Type: '.$mimetype);
header('Content-Length: '.filesize($imagepath));