View source
<?php
define('ADVAGG_MOD_JS_FOOTER', 0);
define('ADVAGG_MOD_JS_PREPROCESS', FALSE);
define('ADVAGG_MOD_JS_DEFER', 0);
define('ADVAGG_MOD_JS_ASYNC_SHIM', FALSE);
define('ADVAGG_MOD_JS_REMOVE_UNUSED', FALSE);
define('ADVAGG_MOD_CSS_PREPROCESS', FALSE);
define('ADVAGG_MOD_CSS_TRANSLATE', FALSE);
define('ADVAGG_MOD_JS_ADJUST_SORT_EXTERNAL', FALSE);
define('ADVAGG_MOD_JS_ADJUST_SORT_INLINE', FALSE);
define('ADVAGG_MOD_JS_ADJUST_SORT_BROWSERS', FALSE);
define('ADVAGG_MOD_CSS_ADJUST_SORT_EXTERNAL', FALSE);
define('ADVAGG_MOD_CSS_ADJUST_SORT_INLINE', FALSE);
define('ADVAGG_MOD_CSS_ADJUST_SORT_BROWSERS', FALSE);
define('ADVAGG_MOD_CSS_DEFER', 0);
define('ADVAGG_MOD_CSS_DEFER_ADMIN', FALSE);
define('ADVAGG_MOD_CSS_HEAD_EXTRACT', FALSE);
define('ADVAGG_MOD_JS_HEAD_EXTRACT', FALSE);
define('ADVAGG_MOD_JS_ASYNC', FALSE);
define('ADVAGG_MOD_JS_FOOTER_INLINE_ALTER', FALSE);
define('ADVAGG_MOD_VISIBILITY_NOTLISTED', 0);
define('ADVAGG_MOD_VISIBILITY_LISTED', 1);
define('ADVAGG_MOD_VISIBILITY_PHP', 2);
define('ADVAGG_MOD_VISIBILITY_FILE_CONTROLLED', 3);
define('ADVAGG_MOD_CSS_DEFER_JS_CODE', 0);
define('ADVAGG_MOD_GA_INLINE_TO_FILE', FALSE);
define('ADVAGG_MOD_WRAP_INLINE_JS_SKIP_LIST', '');
define('ADVAGG_MOD_WRAP_INLINE_JS_XPATH', FALSE);
define('ADVAGG_MOD_JS_DEFER_INLINE_ALTER', FALSE);
define('ADVAGG_MOD_DEFER_INLINE_JS_SKIP_LIST', '');
define('ADVAGG_MOD_JS_ASYNC_IN_HEADER', FALSE);
define('ADVAGG_MOD_JS_NO_AJAXPAGESTATE', FALSE);
define('ADVAGG_MOD_JS_INLINE_RESOURCE_HINTS', FALSE);
define('ADVAGG_MOD_JS_DEFER_JQUERY', TRUE);
define('ADVAGG_MOD_PREFETCH', FALSE);
define('ADVAGG_MOD_CSS_DEFER_REL_PRELOAD', FALSE);
define('ADVAGG_MOD_CSS_DEFER_SKIP_FIRST_FILE', 0);
define('ADVAGG_MOD_CSS_DEFER_INLINE_SIZE_LIMIT', 12288);
define('ADVAGG_MOD_INLINE_CRITICAL_CSS_STRIP_IMPORTANT', TRUE);
define('ADVAGG_MOD_ADMIN_MODE', 4);
define('ADVAGG_MOD_INLINE_JS_VISIBILITY', ADVAGG_MOD_VISIBILITY_LISTED);
define('ADVAGG_MOD_INLINE_CSS_VISIBILITY', ADVAGG_MOD_VISIBILITY_LISTED);
define('ADVAGG_MOD_INLINE_VISIBILITY', ADVAGG_MOD_VISIBILITY_LISTED);
define('ADVAGG_MOD_CSS_DEFER_VISIBILITY', ADVAGG_MOD_VISIBILITY_LISTED);
function advagg_mod_module_implements_alter(&$implementations, $hook) {
if ($hook === 'library_alter' && array_key_exists('advagg_mod', $implementations)) {
$item = array(
'advagg_mod' => $implementations['advagg_mod'],
);
unset($implementations['advagg_mod']);
$implementations = array_merge($item, $implementations);
}
if ($hook === 'html_head_alter' && array_key_exists('advagg_mod', $implementations)) {
unset($implementations['advagg_mod']);
}
if ($hook === 'css_post_alter' && array_key_exists('advagg_mod', $implementations)) {
$item = $implementations['advagg_mod'];
unset($implementations['advagg_mod']);
$implementations['advagg_mod'] = $item;
}
if ($hook === 'js_post_alter' && array_key_exists('advagg_mod', $implementations)) {
$item = $implementations['advagg_mod'];
unset($implementations['advagg_mod']);
$implementations['advagg_mod'] = $item;
}
}
function advagg_mod_library_alter(&$javascript, $module) {
if (!advagg_enabled()) {
return;
}
if (!module_exists('jquery_update')) {
return;
}
if (!advagg_mod_inline_page_js()) {
return;
}
$GLOBALS['conf']['jquery_update_jquery_cdn'] = 'none';
$GLOBALS['conf']['jquery_update_jquery_migrate_cdn'] = 'none';
}
function advagg_mod_init() {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
if (variable_get('advagg_enabled', ADVAGG_ENABLED) && (variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER) || variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC))) {
$callbacks =& drupal_register_shutdown_function();
foreach ($callbacks as $key => $values) {
if ($values['callback'] === 'devel_shutdown') {
$callbacks[$key]['callback'] = 'advagg_mod_devel_shutdown';
break;
}
}
reset($callbacks);
}
$dir = rtrim(variable_get('advagg_mod_unified_multisite_dir', ''), '/');
if (!empty($dir) && file_exists($dir) && is_dir($dir)) {
$counter_filename = $dir . '/' . ADVAGG_SPACE . 'advagg_global_counter';
$local_counter = advagg_get_global_counter();
if (!file_exists($counter_filename)) {
module_load_include('inc', 'advagg', 'advagg.missing');
advagg_save_data($counter_filename, $local_counter);
}
else {
$shared_counter = (int) advagg_file_get_contents($counter_filename);
if ($shared_counter == $local_counter) {
}
elseif ($shared_counter < $local_counter) {
module_load_include('inc', 'advagg', 'advagg.missing');
advagg_save_data($counter_filename, $local_counter, TRUE);
}
elseif ($shared_counter > $local_counter) {
variable_set('advagg_global_counter', $shared_counter);
}
}
}
if (module_exists('imce')) {
$args = arg();
if ($args[0] === 'imce' && empty($args[1])) {
if (variable_get('advagg_mod_js_footer', ADVAGG_MOD_JS_FOOTER)) {
$GLOBALS['conf']['advagg_mod_js_footer'] = 0;
}
if (variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER)) {
$GLOBALS['conf']['advagg_mod_js_defer'] = 0;
}
}
}
}
function advagg_mod_menu() {
$file_path = drupal_get_path('module', 'advagg_mod');
$config_path = advagg_admin_config_root_path();
$items[$config_path . '/advagg/mod'] = array(
'title' => 'Modifications',
'description' => 'Turn on or off various mods for CSS/JS.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'advagg_mod_admin_settings_form',
),
'type' => MENU_LOCAL_TASK,
'access arguments' => array(
'administer site configuration',
),
'file path' => $file_path,
'file' => 'advagg_mod.admin.inc',
'weight' => 10,
);
return $items;
}
function advagg_mod_element_info_alter(&$type) {
if (!isset($type['styles']['#pre_render'])) {
$type['styles']['#pre_render'] = array();
}
$key_drupal = array_search('drupal_pre_render_styles', $type['styles']['#pre_render']);
$key_advagg = array_search('advagg_pre_render_styles', $type['styles']['#pre_render']);
if ($key_drupal !== FALSE) {
$type['styles']['#pre_render'] = advagg_insert_into_array_at_location($type['styles']['#pre_render'], array(
'_advagg_mod_pre_render_styles',
), $key_drupal);
}
elseif ($key_advagg !== FALSE) {
$type['styles']['#pre_render'] = advagg_insert_into_array_at_location($type['styles']['#pre_render'], array(
'_advagg_mod_pre_render_styles',
), $key_advagg);
}
else {
$type['styles']['#pre_render'][] = '_advagg_mod_pre_render_styles';
}
if (!isset($type['scripts']['#pre_render'])) {
$type['scripts']['#pre_render'] = array();
}
$key_drupal = array_search('drupal_pre_render_scripts', $type['scripts']['#pre_render']);
$key_advagg = array_search('advagg_pre_render_scripts', $type['scripts']['#pre_render']);
$key_omega = array_search('omega_pre_render_scripts', $type['scripts']['#pre_render']);
$key_aurora = array_search('aurora_pre_render_scripts', $type['scripts']['#pre_render']);
if ($key_drupal !== FALSE) {
$type['scripts']['#pre_render'] = advagg_insert_into_array_at_location($type['scripts']['#pre_render'], array(
'_advagg_mod_pre_render_scripts',
), $key_drupal);
}
elseif ($key_advagg !== FALSE) {
$type['scripts']['#pre_render'] = advagg_insert_into_array_at_location($type['scripts']['#pre_render'], array(
'_advagg_mod_pre_render_scripts',
), $key_advagg);
}
elseif ($key_omega !== FALSE) {
$type['scripts']['#pre_render'] = advagg_insert_into_array_at_location($type['scripts']['#pre_render'], array(
'_advagg_mod_pre_render_scripts',
), $key_omega);
}
elseif ($key_aurora !== FALSE) {
$type['scripts']['#pre_render'] = advagg_insert_into_array_at_location($type['scripts']['#pre_render'], array(
'_advagg_mod_pre_render_scripts',
), $key_aurora);
}
else {
$type['scripts']['#pre_render'][] = '_advagg_mod_pre_render_scripts';
}
}
function advagg_mod_css_alter(&$css) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
if (variable_get('advagg_mod_css_preprocess', ADVAGG_MOD_CSS_PREPROCESS)) {
foreach ($css as &$values) {
if (!empty($values['preprocess_lock'])) {
continue;
}
$values['preprocess'] = TRUE;
}
unset($values);
}
}
function advagg_mod_css_post_alter(&$css) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
if (variable_get('advagg_mod_css_adjust_sort_external', ADVAGG_MOD_CSS_ADJUST_SORT_EXTERNAL) || variable_get('advagg_mod_css_adjust_sort_inline', ADVAGG_MOD_CSS_ADJUST_SORT_INLINE) || variable_get('advagg_mod_css_adjust_sort_browsers', ADVAGG_MOD_CSS_ADJUST_SORT_BROWSERS)) {
advagg_mod_sort_css_js($css, 'css');
}
}
function advagg_mod_html_head_alter(&$head_elements) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
foreach ($head_elements as $key => $element) {
if (variable_get('advagg_mod_css_head_extract', ADVAGG_MOD_CSS_HEAD_EXTRACT) && !empty($element['#tag']) && $element['#tag'] === 'link' && !empty($element['#attributes']['type']) && $element['#attributes']['type'] === 'text/css' && !empty($element['#attributes']['href'])) {
$type = 'file';
if (strpos($element['#attributes']['href'], 'http://') === 0 || strpos($element['#attributes']['href'], 'https://') === 0 || strpos($element['#attributes']['href'], '//') === 0) {
$type = 'external';
}
drupal_add_css($element['#attributes']['href'], array(
'type' => $type,
'group' => CSS_SYSTEM,
'every_page' => TRUE,
'weight' => -50000,
));
unset($head_elements[$key]);
}
if (variable_get('advagg_mod_js_head_extract', ADVAGG_MOD_JS_HEAD_EXTRACT) && !empty($element['#tag']) && $element['#tag'] === 'script' && !empty($element['#attributes']['type']) && $element['#attributes']['type'] === 'text/javascript' && !empty($element['#attributes']['src'])) {
$type = 'file';
if (strpos($element['#attributes']['src'], 'http://') === 0 || strpos($element['#attributes']['src'], 'https://') === 0 || strpos($element['#attributes']['src'], '//') === 0) {
$type = 'external';
}
drupal_add_js($element['#attributes']['src'], array(
'type' => $type,
'scope' => 'header',
'group' => JS_LIBRARY,
'every_page' => TRUE,
'weight' => -50000,
));
unset($head_elements[$key]);
}
}
}
function advagg_mod_theme_registry_alter(&$theme_registry) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
if (!isset($theme_registry['html'])) {
return;
}
$index = array_search('_advagg_process_html', $theme_registry['html']['process functions']);
if ($index === FALSE) {
$index = array_search('template_process_html', $theme_registry['html']['process functions']);
if ($index === FALSE) {
return;
}
}
array_splice($theme_registry['html']['process functions'], $index, 0, 'advagg_mod_process_move_js');
}
function advagg_mod_process_move_js(array &$variables) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
if (!variable_get('advagg_mod_js_footer_inline_alter', ADVAGG_MOD_JS_FOOTER_INLINE_ALTER) && !variable_get('advagg_mod_js_inline_resource_hints', ADVAGG_MOD_JS_INLINE_RESOURCE_HINTS)) {
return;
}
foreach (element_children($variables) as $child) {
if (empty($variables[$child])) {
continue;
}
if (is_string($variables[$child]) && stripos($variables[$child], '<script') !== FALSE) {
advagg_mod_js_inline_processor($variables[$child]);
}
if (is_array($variables[$child])) {
if (isset($variables[$child]['#children']) && is_string($variables[$child]['#children']) && stripos($variables[$child]['#children'], '<script') !== FALSE) {
advagg_mod_js_inline_processor($variables[$child]['#children']);
}
if (isset($variables[$child]['#markup']) && is_string($variables[$child]['#markup']) && stripos($variables[$child]['#markup'], '<script') !== FALSE) {
}
}
}
}
function advagg_mod_page_alter() {
if (!advagg_enabled()) {
return;
}
list(, , , , , , , , , , $css_defer) = advagg_mod_get_lists();
if (empty($css_defer)) {
return;
}
if (variable_get('advagg_mod_css_defer_visibility', ADVAGG_MOD_VISIBILITY_LISTED) != ADVAGG_MOD_VISIBILITY_FILE_CONTROLLED) {
return;
}
list(, , $inline_strings) = advagg_mod_find_critical_css_file();
$preload_from_inline_css = array();
$domains_from_inline_css = array();
if (!empty($inline_strings[0])) {
$matches = array();
$pattern = '/url\\s*\\(\\s*[\'"]?(.+?)[\'"]?\\s*\\)/i';
preg_match_all($pattern, $inline_strings[0], $matches);
if (!empty($matches[1])) {
foreach ($matches[1] as $key => $url) {
$parsed = parse_url($url);
if (!empty($parsed['scheme']) && $parsed['scheme'] === 'data') {
unset($matches[1][$key]);
continue;
}
if (empty($parsed['path']) || strpos($parsed['path'], '.') === FALSE) {
unset($matches[1][$key]);
continue;
}
if (isset($parsed['host'])) {
$domains_from_inline_css[] = $url;
}
}
$preload_from_inline_css = $matches[1];
}
drupal_add_css('advagg_mod_critical_css', array(
'data' => $inline_strings[0],
'type' => 'inline',
'group' => CSS_SYSTEM - 1,
'weight' => -50000,
'movable' => FALSE,
'critical-css' => TRUE,
));
advagg_mod_add_loadcss_js_lib();
}
$domains = array();
if (!empty($inline_strings[1])) {
$domains = preg_split("/\\r\\n|\\r|\\n/", $inline_strings[1]);
}
$domains = array_merge($domains, $domains_from_inline_css);
$domains = array_filter(array_unique($domains));
if (!empty($domains)) {
foreach ($domains as $domain) {
advagg_add_dns_prefetch(trim($domain));
}
}
$preload = array();
if (!empty($inline_strings[2])) {
$preload = preg_split("/\\r\\n|\\r|\\n/", $inline_strings[2]);
}
$preload = array_merge($preload, $preload_from_inline_css);
$preload = array_filter(array_unique($preload));
if (!empty($preload)) {
$preload_array = array();
$counter = 0;
foreach ($preload as $value) {
if (empty($value)) {
$counter++;
continue;
}
if (stripos($value, 'as: ') === 0) {
$preload_array[$counter]['as'] = trim(substr($value, 4));
}
elseif (stripos($value, 'type: ') === 0) {
$preload_array[$counter]['type'] = trim(substr($value, 6));
}
elseif (stripos($value, 'media: ') === 0) {
$preload_array[$counter]['media'] = trim(substr($value, 7));
}
elseif (stripos($value, 'crossorigin: ') === 0) {
$preload_array[$counter]['crossorigin'] = trim(substr($value, 13));
}
elseif (stripos($value, 'url: ') === 0) {
if (!empty($preload_array[$counter]['url'])) {
$counter++;
}
$preload_array[$counter]['url'] = trim(substr($value, 4));
}
else {
if (!empty($preload_array[$counter]['url'])) {
$counter++;
}
$preload_array[$counter]['url'] = trim($value);
}
}
foreach ($preload_array as $values) {
if (empty($values['url'])) {
continue;
}
$url = $values['url'];
$media = '';
if (!empty($values['media'])) {
$media = $values['media'];
}
$as = '';
if (!empty($values['as'])) {
$as = $values['as'];
}
$type = '';
if (!empty($values['type'])) {
$type = $values['type'];
}
$crossorigin = NULL;
if (!empty($values['crossorigin'])) {
$crossorigin = $values['crossorigin'];
}
advagg_add_preload_link($url, $media, $as, $type, $crossorigin);
}
}
}
function advagg_mod_advagg_modify_js_pre_render_alter(&$children, &$elements) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
if (advagg_mod_inline_page() || advagg_mod_inline_page_js()) {
return;
}
if (variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER) || variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC)) {
$onload_code = array();
foreach ($children as $values) {
if (isset($values['#attributes']['onload'])) {
$onload_code[$values['#attributes']['src']] = $values['#attributes']['onload'];
}
}
$jquery_rev = strrev('/jquery.js');
$jquery_min_rev = strrev('/jquery.min.js');
$ie_fixes = array();
foreach ($elements['#groups'] as $group) {
if ($group['type'] !== 'file' || empty($group['defer']) || empty($group['items']['files'])) {
continue;
}
$found = FALSE;
foreach ($group['items']['files'] as $name => &$values) {
if (stripos(strrev($name), $jquery_rev) === 0 || stripos(strrev($name), $jquery_min_rev) === 0) {
$found = TRUE;
}
}
if ($found) {
$ie_fixes[] = basename($group['data']);
}
}
foreach ($children as $key => &$values) {
if (!empty($values['#attributes']['src']) && isset($values['#attributes']['defer']) && empty($values['#browsers'])) {
$ie_key = array_search(basename($values['#attributes']['src']), $ie_fixes);
if ($ie_key !== FALSE) {
unset($ie_fixes[$ie_key]);
$values['#browsers'] = array(
'IE' => FALSE,
'!IE' => TRUE,
);
$copy = $values;
$copy['#browsers'] = array(
'IE' => 'gt IE 9',
'!IE' => FALSE,
);
$copy['#attributes']['src'] .= '#ie10+';
array_splice($children, $key, 0, array(
$copy,
));
$copy = $values;
$copy['#browsers'] = array(
'IE' => 'lte IE 9',
'!IE' => FALSE,
);
unset($copy['defer']);
unset($copy['#attributes']['defer']);
$copy['#attributes']['src'] .= '#ie9-';
array_splice($children, $key, 0, array(
$copy,
));
}
}
}
$holdready_count = array();
foreach ($children as $key => &$values) {
if (!empty($values['#attributes']['onload']) && (stripos($values['#attributes']['onload'], 'jQuery.holdReady(true)') !== FALSE || stripos($values['#attributes']['onload'], 'jQuery.holdReady(!0)') !== FALSE)) {
$src = $values['#attributes']['src'];
$pos = strpos($values['#attributes']['src'], '#');
if ($pos !== FALSE) {
$src = substr($values['#attributes']['src'], 0, $pos);
}
$holdready_count[$src] = TRUE;
break;
}
}
foreach ($children as $key => &$values) {
if (!empty($values['#value']) && strpos($values['#value'], 'jQuery.extend(Drupal.settings') !== FALSE) {
$found = FALSE;
foreach ($onload_code as $src => $code) {
if (strpos($code, 'init_drupal_core_settings(') !== FALSE) {
$found = TRUE;
unset($onload_code[$src]);
break;
}
}
if ($found) {
$holdready_string = '';
if (!empty($holdready_count)) {
$holdready_string = "\nif(jQuery.isFunction(jQuery.holdReady)){jQuery.holdReady(false);}";
}
$values['#value'] = "function init_drupal_core_settings() {{$values['#value']} {$holdready_string}} if(window.jQuery && window.Drupal){init_drupal_core_settings();}";
}
}
}
unset($values);
}
if (variable_get('advagg_mod_js_async_shim', ADVAGG_MOD_JS_ASYNC_SHIM)) {
foreach ($children as &$values) {
if (isset($values['#attributes']) && isset($values['#attributes']['async']) && $values['#attributes']['async'] === 'async' && !empty($values['#attributes']['src'])) {
$source = $values['#attributes']['src'];
if (strpos($source, 'http://') !== 0 && strpos($source, 'https://') !== 0 && strpos($source, '//') !== 0) {
$source = url($values['#attributes']['src']);
}
$values['#value'] = "(function() {\n var s = document.createElement('script');\n s.type = 'text/javascript';\n s.async = true;\n s.src = '{$source}';\n var d = document.getElementsByTagName('script')[0];\n d.parentNode.insertBefore(s, d);\n})();";
unset($values['#attributes']['async']);
unset($values['#attributes']['src']);
}
}
unset($values);
}
}
function advagg_mod_advagg_modify_css_pre_render_alter(&$children, &$elements) {
if (empty($children)) {
return;
}
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
list(, , , , , , , , , , $css_defer) = advagg_mod_get_lists(array(), $elements['#items']);
if (empty($css_defer)) {
return;
}
$critical_css = FALSE;
if (variable_get('advagg_mod_css_defer_visibility', ADVAGG_MOD_VISIBILITY_LISTED) == ADVAGG_MOD_VISIBILITY_FILE_CONTROLLED) {
foreach ($elements['#items'] as $item) {
if ($item['type'] === 'inline' && !empty($item['critical-css'])) {
$critical_css = TRUE;
break;
}
}
if (!$critical_css) {
return;
}
}
if (!$critical_css) {
if (!advagg_mod_css_defer_page()) {
return;
}
$css_defer_admin = variable_get('advagg_mod_css_defer_admin', ADVAGG_MOD_CSS_DEFER_ADMIN);
if (empty($css_defer_admin) && path_is_admin(current_path())) {
return;
}
}
static $added;
advagg_mod_add_loadcss_js_lib(array(), $elements['#items']);
$defer_skip_first_file = variable_get('advagg_mod_css_defer_skip_first_file', ADVAGG_MOD_CSS_DEFER_SKIP_FIRST_FILE);
$options = array(
'type' => 'inline',
'scope' => $css_defer >= 5 ? 'footer' : 'header',
'scope_lock' => TRUE,
'group' => $css_defer == 1 ? JS_LIBRARY - 1 : JS_DEFAULT,
'weight' => $css_defer == 1 ? -50000 : 0,
'movable' => $css_defer == 1 ? FALSE : TRUE,
);
$last_key = NULL;
foreach ($children as $children_key => $values) {
if ($values['#tag'] === 'style' || empty($values['#attributes']['href'])) {
continue;
}
if (isset($values['#browsers']['!IE']) && $values['#browsers']['!IE'] === TRUE && isset($values['#browsers']['IE']) && $values['#browsers']['IE'] === TRUE && isset($values['#attributes']['media']) && $values['#attributes']['media'] !== 'print' && $values['#attributes']['media'] !== 'none') {
$last_key = $children_key;
}
}
if ($last_key === NULL) {
$last_key = $children_key;
}
$preload_array = array();
foreach ($children as $children_key => &$values) {
if ($values['#tag'] === 'style' || empty($values['#attributes']['href'])) {
continue;
}
if (empty($preload_array) && $defer_skip_first_file == 2) {
$preload_array[] = array();
continue;
}
$onload_extra = '';
if ($last_key === $children_key) {
$holdready_script = 'window.advagg_mod_loadcss = function() {if (window.jQuery) {if (jQuery.isFunction(jQuery.holdReady)){jQuery.holdReady(false);}} else {setTimeout(advagg_mod_loadcss, 100);}};';
$onload_extra = "{$holdready_script}setTimeout(advagg_mod_loadcss, 200);";
$GLOBALS['advagg_mod_loadcss_jquery_holdready'] = TRUE;
}
$id = "advagg_loadcss_{$children_key}";
if ($css_defer == 4) {
$copy = $values;
$copy['#attributes']['rel'] = 'preload';
$copy['#attributes']['as'] = 'style';
$copy['#attributes']['onload'] = "{$onload_extra}this.onload=null;this.rel='stylesheet'";
$preload_array[$children_key] = $copy;
}
else {
if (isset($values['#browsers'])) {
$options['browsers'] = $values['#browsers'];
}
$inline = "loadCSS(\"{$values['#attributes']['href']}\", document.getElementById(\"{$id}\")";
if ($values['#attributes']['media'] !== 'all') {
$inline .= ", \"{$values['#attributes']['media']}\"";
}
if (!empty($values['#attributes']['crossorigin'])) {
$inline .= ", \"{$values['#attributes']['crossorigin']}\"";
}
$inline .= ')';
if (!empty($values['#attributes']['onloadCSS'])) {
$inline = "onloadCSS({$inline}, function() {{$onload_extra}{$values['#attributes']['onloadCSS']}});";
}
elseif (!empty($onload_extra)) {
$inline = "onloadCSS({$inline}, function() {{$onload_extra}});";
}
$matches[2] = $matches[0] = $inline;
$inline = advagg_mod_wrap_inline_js($matches, "window.loadCSS", 40);
if (!isset($added[$values['#attributes']['href']])) {
drupal_add_js($inline, $options);
$added[$values['#attributes']['href']] = TRUE;
}
}
$values['#prefix'] = "<noscript id=\"{$id}\">\n";
$values['#suffix'] = '</noscript>';
if (isset($options['browsers'])) {
unset($options['browsers']);
}
}
unset($values);
$new_elements = array();
foreach ($elements as $elements_key => $elements_value) {
if (is_numeric($elements_key)) {
$new_elements[] = $elements_value;
}
else {
$new_elements[$elements_key] = $elements_value;
}
if (isset($preload_array[$elements_key])) {
$new_elements[] = $preload_array[$elements_key];
}
}
$elements = $new_elements;
unset($new_elements);
}
function advagg_mod_advagg_hooks_implemented_alter(&$hooks, $all) {
if ($all) {
$hooks += array(
'advagg_mod_get_lists_alter' => array(),
);
}
}
function advagg_mod_advagg_get_root_files_dir_alter(&$css_paths, &$js_paths) {
$dir = rtrim(variable_get('advagg_mod_unified_multisite_dir', ''), '/');
if (empty($dir) || !file_exists($dir) || !is_dir($dir)) {
return;
}
$css_paths[0] = $dir . '/advagg_css';
$js_paths[0] = $dir . '/advagg_js';
file_prepare_directory($css_paths[0], FILE_CREATE_DIRECTORY);
file_prepare_directory($js_paths[0], FILE_CREATE_DIRECTORY);
$css_paths[1] = advagg_get_relative_path($css_paths[0]);
$js_paths[1] = advagg_get_relative_path($js_paths[0]);
}
function advagg_mod_advagg_current_hooks_hash_array_alter(&$aggregate_settings) {
$aggregate_settings['variables']['advagg_mod_js_async_shim'] = variable_get('advagg_mod_js_async_shim', ADVAGG_MOD_JS_ASYNC_SHIM);
if (variable_get('advagg_cache_level', ADVAGG_CACHE_LEVEL) >= 5) {
$aggregate_settings['variables']['advagg_mod_js_preprocess'] = variable_get('advagg_mod_js_preprocess', ADVAGG_MOD_JS_PREPROCESS);
$aggregate_settings['variables']['advagg_mod_js_remove_unused'] = variable_get('advagg_mod_js_remove_unused', ADVAGG_MOD_JS_REMOVE_UNUSED);
$aggregate_settings['variables']['advagg_mod_js_head_extract'] = variable_get('advagg_mod_js_head_extract', ADVAGG_MOD_JS_HEAD_EXTRACT);
$aggregate_settings['variables']['advagg_mod_js_adjust_sort_external'] = variable_get('advagg_mod_js_adjust_sort_external', ADVAGG_MOD_JS_ADJUST_SORT_EXTERNAL);
$aggregate_settings['variables']['advagg_mod_js_adjust_sort_inline'] = variable_get('advagg_mod_js_adjust_sort_inline', ADVAGG_MOD_JS_ADJUST_SORT_INLINE);
$aggregate_settings['variables']['advagg_mod_js_adjust_sort_browsers'] = variable_get('advagg_mod_js_adjust_sort_browsers', ADVAGG_MOD_JS_ADJUST_SORT_BROWSERS);
$aggregate_settings['variables']['advagg_mod_ga_inline_to_file'] = variable_get('advagg_mod_ga_inline_to_file', ADVAGG_MOD_GA_INLINE_TO_FILE);
$aggregate_settings['variables']['advagg_mod_js_footer'] = variable_get('advagg_mod_js_footer', ADVAGG_MOD_JS_FOOTER);
$aggregate_settings['variables']['advagg_mod_js_defer'] = variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER);
$aggregate_settings['variables']['advagg_mod_js_footer_inline_alter'] = variable_get('advagg_mod_js_footer_inline_alter', ADVAGG_MOD_JS_FOOTER_INLINE_ALTER);
$aggregate_settings['variables']['advagg_mod_js_async'] = variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC);
}
$aggregate_settings['variables']['advagg_mod_css_translate'] = variable_get('advagg_mod_css_translate', ADVAGG_MOD_CSS_TRANSLATE);
if (variable_get('advagg_mod_css_translate', ADVAGG_MOD_CSS_TRANSLATE)) {
$aggregate_settings['variables']['advagg_mod_css_translate_lang'] = isset($GLOBALS['language']->language) ? $GLOBALS['language']->language : 'en';
}
$aggregate_settings['variables']['advagg_mod_css_adjust_sort_external'] = variable_get('advagg_mod_css_adjust_sort_external', ADVAGG_MOD_CSS_ADJUST_SORT_EXTERNAL);
$aggregate_settings['variables']['advagg_mod_css_adjust_sort_inline'] = variable_get('advagg_mod_css_adjust_sort_inline', ADVAGG_MOD_CSS_ADJUST_SORT_INLINE);
if (variable_get('advagg_cache_level', ADVAGG_CACHE_LEVEL) >= 5) {
$aggregate_settings['variables']['advagg_mod_css_preprocess'] = variable_get('advagg_mod_css_preprocess', ADVAGG_MOD_CSS_PREPROCESS);
$aggregate_settings['variables']['advagg_mod_css_head_extract'] = variable_get('advagg_mod_css_head_extract', ADVAGG_MOD_CSS_HEAD_EXTRACT);
$aggregate_settings['variables']['advagg_mod_css_adjust_sort_browsers'] = variable_get('advagg_mod_css_adjust_sort_browsers', ADVAGG_MOD_CSS_ADJUST_SORT_BROWSERS);
$aggregate_settings['variables']['advagg_mod_css_defer'] = variable_get('advagg_mod_css_defer', ADVAGG_MOD_CSS_DEFER);
$aggregate_settings['variables']['advagg_mod_css_defer_js_code'] = variable_get('advagg_mod_css_defer_js_code', ADVAGG_MOD_CSS_DEFER_JS_CODE);
$aggregate_settings['variables']['advagg_mod_inline_visibility'] = variable_get('advagg_mod_inline_visibility', ADVAGG_MOD_VISIBILITY_LISTED);
$aggregate_settings['variables']['advagg_mod_inline_pages'] = variable_get('advagg_mod_inline_pages', '');
$aggregate_settings['variables']['advagg_mod_css_defer_visibility'] = variable_get('advagg_mod_css_defer_visibility', ADVAGG_MOD_VISIBILITY_LISTED);
$aggregate_settings['variables']['advagg_mod_css_defer_pages'] = variable_get('advagg_mod_css_defer_pages', '');
$aggregate_settings['variables']['advagg_mod_inline_page'] = advagg_mod_inline_page();
$aggregate_settings['variables']['advagg_mod_inline_page_js'] = advagg_mod_inline_page_js();
$aggregate_settings['variables']['advagg_mod_inline_page_css'] = advagg_mod_inline_page_css();
$aggregate_settings['variables']['advagg_mod_css_defer_page'] = advagg_mod_css_defer_page();
}
}
function advagg_mod_libraries_info() {
$libraries['loadCSS'] = array(
'name' => 'loadCSS',
'vendor url' => 'https://github.com/filamentgroup/loadCSS',
'download url' => 'https://github.com/filamentgroup/loadCSS/archive/master.zip',
'version arguments' => array(
'file' => 'package.json',
'pattern' => '/"version":\\s+"([0-9\\.]+)"/',
'lines' => 100,
),
'callbacks' => array(
'pre-load' => array(
'advagg_mod_libraries_preload_callback',
),
),
'local version' => '2.0.1',
'remote' => array(
'callback' => 'advagg_get_github_version_json',
'url' => 'https://cdn.jsdelivr.net/gh/filamentgroup/loadCSS@master/package.json',
),
'files' => array(
'js' => array(
'src/loadCSS.js' => array(
'type' => 'file',
'async' => TRUE,
),
),
),
);
$version = advagg_get_remote_libraries_version('loadCSS', $libraries['loadCSS']);
$advagg_mod_path = drupal_get_path('module', 'advagg_mod');
$libraries['loadCSS'] += array(
'variants' => array(
'normal-preload' => array(
'files' => array(
'js' => array(
'src/cssrelpreload.js' => array(
'type' => 'file',
'async' => TRUE,
),
),
),
),
'normal-onload' => array(
'files' => array(
'js' => array(
'src/loadCSS.js' => array(
'type' => 'file',
'async' => TRUE,
),
'src/onloadCSS.js' => array(
'type' => 'file',
'async' => TRUE,
),
),
),
),
'minified' => array(
'files' => array(
'js' => array(
'src/loadCSS.min.js' => array(
'type' => 'file',
'async' => TRUE,
),
),
),
),
'minified-preload' => array(
'files' => array(
'js' => array(
'src/cssrelpreload.min.js' => array(
'type' => 'file',
'async' => TRUE,
),
),
),
),
'minified-onload' => array(
'files' => array(
'js' => array(
'src/loadCSS.min.js' => array(
'type' => 'file',
'async' => TRUE,
),
'src/onloadCSS.min.js' => array(
'type' => 'file',
'async' => TRUE,
),
),
),
),
'external' => array(
'files' => array(
'js' => array(
"//cdn.jsdelivr.net/gh/filamentgroup/loadCSS@v{$version}/src/loadCSS.js" => array(
'type' => 'external',
'data' => "//cdn.jsdelivr.net/gh/filamentgroup/loadCSS@v{$version}/src/loadCSS.js",
'async' => TRUE,
),
),
),
),
'external-preload' => array(
'files' => array(
'js' => array(
"//cdn.jsdelivr.net/gh/filamentgroup/loadCSS@v{$version}/src/cssrelpreload.js" => array(
'type' => 'external',
'data' => "//cdn.jsdelivr.net/gh/filamentgroup/loadCSS@v{$version}/src/cssrelpreload.js",
'async' => TRUE,
),
),
),
),
'external-onload' => array(
'files' => array(
'js' => array(
"//cdn.jsdelivr.net/gh/filamentgroup/loadCSS@v{$version}/src/loadCSS.js" => array(
'type' => 'external',
'data' => "//cdn.jsdelivr.net/gh/filamentgroup/loadCSS@v{$version}/src/loadCSS.js",
'async' => TRUE,
),
"//cdn.jsdelivr.net/gh/filamentgroup/loadCSS@v{$version}/src/onloadCSS.js" => array(
'type' => 'external',
'data' => "//cdn.jsdelivr.net/gh/filamentgroup/loadCSS@v{$version}/src/onloadCSS.js",
'async' => TRUE,
),
),
),
),
'local' => array(
'version' => '1.3.1',
'files' => array(
'js' => array(
"{$advagg_mod_path}/loadCSS.js" => array(
'type' => 'file',
'data' => "{$advagg_mod_path}/loadCSS.js",
'async' => TRUE,
),
),
),
),
'local-preload' => array(
'version' => '1.3.1',
'files' => array(
'js' => array(
"{$advagg_mod_path}/cssrelpreload.js" => array(
'type' => 'file',
'data' => "{$advagg_mod_path}/cssrelpreload.js",
'async' => TRUE,
),
),
),
),
'local-onload' => array(
'version' => '1.3.1',
'files' => array(
'js' => array(
"{$advagg_mod_path}/loadCSS.js" => array(
'type' => 'file',
'data' => "{$advagg_mod_path}/loadCSS.js",
'async' => TRUE,
),
"{$advagg_mod_path}/onloadCSS.js" => array(
'type' => 'file',
'data' => "{$advagg_mod_path}/onloadCSS.js",
'async' => TRUE,
),
),
),
),
'local-minified' => array(
'version' => '1.3.1',
'files' => array(
'js' => array(
"{$advagg_mod_path}/loadCSS.min.js" => array(
'type' => 'file',
'data' => "{$advagg_mod_path}/loadCSS.min.js",
'async' => TRUE,
),
),
),
),
'local-minified-preload' => array(
'version' => '1.3.1',
'files' => array(
'js' => array(
"{$advagg_mod_path}/cssrelpreload.min.js" => array(
'type' => 'file',
'data' => "{$advagg_mod_path}/cssrelpreload.min.js",
'async' => TRUE,
),
),
),
),
'local-minified-onload' => array(
'version' => '1.3.1',
'files' => array(
'js' => array(
"{$advagg_mod_path}/loadCSS.min.js" => array(
'type' => 'file',
'data' => "{$advagg_mod_path}/loadCSS.min.js",
'async' => TRUE,
),
"{$advagg_mod_path}/onloadCSS.min.js" => array(
'type' => 'file',
'data' => "{$advagg_mod_path}/onloadCSS.min.js",
'async' => TRUE,
),
),
),
),
),
);
$loadcss_loc = "{$advagg_mod_path}/loadCSS.min.js";
$cssrelpreload_loc = "{$advagg_mod_path}/cssrelpreload.min.js";
$onloadcss_loc = "{$advagg_mod_path}/onloadCSS.min.js";
$libraries_paths = array();
if (is_callable('libraries_get_libraries')) {
$libraries_paths = libraries_get_libraries();
}
if (isset($libraries_paths['loadCSS'])) {
if (is_readable($libraries_paths['loadCSS'] . '/src/loadCSS.min.js')) {
$loadcss_loc = $libraries_paths['loadCSS'] . '/src/loadCSS.min.js';
$libraries['loadCSS']['variants']['minified']['#files_exists'] = TRUE;
}
elseif (is_readable($libraries_paths['loadCSS'] . '/src/loadCSS.js')) {
$loadcss_loc = $libraries_paths['loadCSS'] . '/src/loadCSS.js';
}
if (is_readable($libraries_paths['loadCSS'] . '/src/cssrelpreload.min.js')) {
$cssrelpreload_loc = $libraries_paths['loadCSS'] . '/src/cssrelpreload.min.js';
if ($libraries['loadCSS']['variants']['minified']['#files_exists']) {
$libraries['loadCSS']['variants']['minified-preload']['#files_exists'] = TRUE;
}
}
elseif (is_readable($libraries_paths['loadCSS'] . '/src/cssrelpreload.js')) {
$cssrelpreload_loc = $libraries_paths['loadCSS'] . '/src/cssrelpreload.js';
}
if (is_readable($libraries_paths['loadCSS'] . '/src/onloadCSS.min.js')) {
$onloadcss_loc = $libraries_paths['loadCSS'] . '/src/onloadCSS.min.js';
if ($libraries['loadCSS']['variants']['minified']['#files_exists']) {
$libraries['loadCSS']['variants']['minified-preload']['#files_exists'] = TRUE;
}
}
elseif (is_readable($libraries_paths['loadCSS'] . '/src/onloadCSS.js')) {
$onloadcss_loc = $libraries_paths['loadCSS'] . '/src/onloadCSS.js';
}
}
$libraries['loadCSS']['variants'] += array(
'inline' => array(
'files' => array(
'js' => array(
'loadCSS_inline' => array(
'type' => 'inline',
'data' => (string) @advagg_file_get_contents($loadcss_loc),
'no_defer' => TRUE,
),
),
),
),
'inline-preload' => array(
'files' => array(
'js' => array(
'cssrelpreload_inline' => array(
'type' => 'inline',
'data' => (string) @advagg_file_get_contents($cssrelpreload_loc),
'no_defer' => TRUE,
),
),
),
),
'inline-onload' => array(
'files' => array(
'js' => array(
'loadCSS_inline' => array(
'type' => 'inline',
'data' => (string) @advagg_file_get_contents($loadcss_loc),
'no_defer' => TRUE,
),
'onloadCSS_inline' => array(
'type' => 'inline',
'data' => (string) @advagg_file_get_contents($onloadcss_loc),
'no_defer' => TRUE,
),
),
),
),
);
if (!is_callable('libraries_detect')) {
$default_options = advagg_mod_loadcss_js_defaults();
foreach ($libraries['loadCSS']['files']['js'] as &$value) {
$value += $default_options;
}
foreach ($libraries['loadCSS']['variants'] as &$values) {
foreach ($values['files']['js'] as &$value) {
$value += $default_options;
}
}
}
return $libraries;
}
function advagg_mod_magic(array $magic_settings, $theme) {
$settings = array();
if (!isset($magic_settings['css']['magic_embedded_mqs']['#access'])) {
$settings['css']['magic_embedded_mqs']['#access'] = FALSE;
}
if (!isset($magic_settings['css']['magic_embedded_mqs']['#default_value'])) {
$settings['css']['magic_embedded_mqs']['#default_value'] = FALSE;
}
if (!isset($magic_settings['js']['magic_footer_js']['#access'])) {
$settings['js']['magic_footer_js']['#access'] = FALSE;
}
if (!isset($magic_settings['js']['magic_footer_js']['#default_value'])) {
$settings['js']['magic_footer_js']['#default_value'] = FALSE;
}
if (!isset($magic_settings['js']['magic_library_head']['#access'])) {
$settings['js']['magic_library_head']['#access'] = FALSE;
}
if (!isset($magic_settings['js']['magic_library_head']['#default_value'])) {
$settings['js']['magic_library_head']['#default_value'] = FALSE;
}
if (!isset($magic_settings['js']['magic_experimental_js']['#access'])) {
$settings['js']['magic_experimental_js']['#access'] = FALSE;
}
if (!isset($magic_settings['js']['magic_experimental_js']['#default_value'])) {
$settings['js']['magic_experimental_js']['#default_value'] = FALSE;
}
$settings['#validate'] = array(
'advagg_mod_magic_form_validate',
);
return $settings;
}
function advagg_mod_loadcss_js_defaults() {
list(, , , , , , , , , , $css_defer) = advagg_mod_get_lists();
$default_options = array(
'scope' => $css_defer >= 7 ? 'footer' : 'header',
'scope_lock' => TRUE,
'every_page' => TRUE,
'group' => $css_defer == 1 ? JS_LIBRARY - 1 : JS_LIBRARY,
'weight' => $css_defer == 1 ? -50000 : 0,
'movable' => $css_defer == 1 ? FALSE : TRUE,
);
return $default_options;
}
function advagg_mod_libraries_preload_callback(array &$version_variant) {
$default_options = advagg_mod_loadcss_js_defaults();
foreach ($version_variant['files']['js'] as &$value) {
$value += $default_options;
}
}
function advagg_mod_add_loadcss_js_lib(array $js = array(), array $css = array()) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
list(, , , , , , , , , , $css_defer) = advagg_mod_get_lists($js, $css);
if (empty($css_defer)) {
return;
}
static $added;
$library = advagg_get_library('loadCSS', 'advagg_mod');
$options_defaults = advagg_mod_loadcss_js_defaults();
$preload = '-onload';
if ($css_defer == 4) {
$preload = '-preload';
}
$css_defer_js_code = variable_get('advagg_mod_css_defer_js_code', ADVAGG_MOD_CSS_DEFER_JS_CODE);
if ($css_defer_js_code == 0) {
if (!empty($library['installed'])) {
libraries_load('loadCSS', "inline{$preload}");
}
else {
foreach ($library['variants']["inline{$preload}"]['files']['js'] as $data => $options) {
if (!isset($added[$data])) {
if (!empty($options['data'])) {
drupal_add_js($options['data'], $options + $options_defaults);
$added[$data] = TRUE;
}
else {
$css_defer_js_code = 2;
}
}
}
}
}
if ($css_defer_js_code == 2) {
if ($library['installed']) {
if (variable_get('advagg_cache_level', ADVAGG_CACHE_LEVEL) >= 0 && $library['variants']['minified']['#files_exists']) {
libraries_load('loadCSS', "minified{$preload}");
}
else {
if ($preload) {
libraries_load('loadCSS');
}
else {
libraries_load('loadCSS', "normal{$preload}");
}
}
}
else {
foreach ($library['variants']["local{$preload}"]['files']['js'] as $data => $options) {
if (!isset($added[$data])) {
if (!empty($options['data'])) {
drupal_add_js($options['data'], $options + $options_defaults);
$added[$data] = TRUE;
}
else {
$css_defer_js_code = 4;
}
}
}
}
}
if ($css_defer_js_code == 4) {
foreach ($library['variants']["external{$preload}"]['files']['js'] as $data => $options) {
if (!isset($added[$data])) {
drupal_add_js($options['data'], $options + $options_defaults);
$added[$data] = TRUE;
}
}
}
}
function advagg_mod_find_critical_css_file() {
$filename = FALSE;
$base_path = base_path();
$request_uri = request_uri();
$pos = strpos($request_uri, $base_path);
if ($pos === 0) {
$request_uri = substr($request_uri, strlen($base_path));
}
$dirs = array(
0 => drupal_get_path('theme', $GLOBALS['theme']) . '/',
1 => 'critical-css/',
2 => user_is_logged_in() ? 'authenticated/' : 'anonymous/',
3 => 'all/',
4 => 'urls/',
5 => 'type/',
6 => current_path(),
7 => advagg_url_to_filename($request_uri, FALSE),
8 => advagg_url_to_filename(request_path(), FALSE),
9 => $request_uri,
10 => request_path(),
);
$front_page = drupal_is_front_page();
if (!$front_page) {
$front_page = drupal_get_path_alias() == variable_get('site_frontpage', 'node');
}
$object = menu_get_object();
$params = array(
$dirs,
$front_page,
$object,
);
$inline_strings = array(
'',
'',
'',
);
drupal_alter('advagg_mod_critical_css_file_pre', $filename, $params, $inline_strings);
list($dirs, $front_page, $object) = $params;
if ((!empty($dirs[0]) || !empty($dirs[1])) && is_readable("{$dirs[0]}{$dirs[1]}")) {
if (!$filename && $front_page && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}front.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}front";
}
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[6]}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[6]}";
}
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[7]}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[7]}";
}
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[8]}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[4]}{$dirs[8]}";
}
if (isset($object->type)) {
$filtered_object_type = advagg_url_to_filename($object->type);
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[5]}{$object->type}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[5]}{$object->type}";
}
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[5]}{$filtered_object_type}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[2]}{$dirs[5]}{$filtered_object_type}";
}
}
if (!$filename && $front_page && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}front.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}front";
}
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[6]}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[6]}";
}
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[7]}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[7]}";
}
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[8]}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[4]}{$dirs[8]}";
}
if (isset($object->type)) {
$filtered_object_type = advagg_url_to_filename($object->type);
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[5]}{$object->type}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[5]}{$object->type}";
}
if (!$filename && is_readable("{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[5]}{$filtered_object_type}.css")) {
$filename = "{$dirs[0]}{$dirs[1]}{$dirs[3]}{$dirs[5]}{$filtered_object_type}";
}
}
}
$filenames = array(
'',
'',
'',
);
if ($filename) {
$filenames = array(
"{$filename}.css",
"{$filename}.dns",
"{$filename}.pre",
);
}
if (empty($inline_strings[0]) && !empty($filenames[0]) && is_readable($filenames[0])) {
module_load_include('inc', 'advagg', 'advagg');
$inline_css = advagg_load_stylesheet($filenames[0], TRUE);
drupal_alter('advagg_get_css_file_contents', $inline_css, $filenames[0]);
$inline_strings[0] = $inline_css;
}
if (stripos($inline_strings[0], '<style>') === 0) {
$inline_strings[0] = trim(substr($inline_strings[0], 7));
}
$len = strlen($inline_strings[0]);
if (stripos($inline_strings[0], '</style>') === $len - 8) {
$inline_strings[0] = trim(substr($inline_strings[0], 0, $len - 8));
}
if (empty($inline_strings[1]) && !empty($filenames[1]) && is_readable($filenames[1])) {
$inline_strings[1] = file_get_contents($filenames[1]);
}
if (empty($inline_strings[2]) && !empty($filenames[2]) && is_readable($filenames[2])) {
$inline_strings[2] = file_get_contents($filenames[2]);
}
if (variable_get('advagg_mod_inline_critical_css_strip_important', ADVAGG_MOD_INLINE_CRITICAL_CSS_STRIP_IMPORTANT)) {
if (!empty($inline_strings)) {
$inline_strings[0] = str_replace('!important', '', $inline_strings[0]);
}
}
drupal_alter('advagg_mod_critical_css_file_post', $filenames, $params, $inline_strings);
return array(
$filenames,
$params,
$inline_strings,
);
}
function advagg_mod_magic_form_validate($form, &$form_state) {
$form_state['values']['magic_embedded_mqs'] = 0;
$form_state['values']['magic_footer_js'] = 0;
$form_state['values']['magic_library_head'] = 0;
$form_state['values']['magic_experimental_js'] = 0;
}
function advagg_mod_js_pre_alter(array &$js) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
if (variable_get('advagg_mod_ga_inline_to_file', ADVAGG_MOD_GA_INLINE_TO_FILE)) {
advagg_mod_ga_inline_to_file($js);
}
if (variable_get('advagg_mod_js_inline_resource_hints', ADVAGG_MOD_JS_INLINE_RESOURCE_HINTS)) {
advagg_mod_find_inline_domains($js);
}
}
function advagg_mod_find_inline_domains(array &$js) {
$parsed = @parse_url($GLOBALS['base_root']);
$host = $parsed['host'];
foreach ($js as &$values) {
if ($values['type'] !== 'inline') {
continue;
}
$matches = array();
$pattern = "/[\"'](.*?)[\"']/";
$matched = preg_match_all($pattern, $values['data'], $matches);
if (!$matched) {
continue;
}
foreach ($matches[1] as $value) {
if (strpos($value, '//') !== FALSE) {
$parsed = @parse_url($value);
if (!empty($parsed['host']) && $host !== $parsed['host']) {
$values['dns_prefetch'][] = $value;
}
}
}
}
}
function advagg_mod_js_post_alter(array &$js) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
if (variable_get('advagg_mod_js_remove_unused', ADVAGG_MOD_JS_REMOVE_UNUSED)) {
advagg_mod_remove_js_if_not_used($js);
}
if (variable_get('advagg_mod_js_adjust_sort_external', ADVAGG_MOD_JS_ADJUST_SORT_EXTERNAL) || variable_get('advagg_mod_js_adjust_sort_inline', ADVAGG_MOD_JS_ADJUST_SORT_INLINE) || variable_get('advagg_mod_js_adjust_sort_browsers', ADVAGG_MOD_JS_ADJUST_SORT_BROWSERS)) {
advagg_mod_sort_css_js($js, 'js');
}
advagg_mod_js_move_to_footer($js);
if (variable_get('advagg_mod_js_preprocess', ADVAGG_MOD_JS_PREPROCESS)) {
foreach ($js as &$values) {
if (!empty($values['preprocess_lock'])) {
continue;
}
$values['preprocess'] = TRUE;
$values['cache'] = TRUE;
}
unset($values);
}
$jquery_deferred = advagg_mod_js_async_defer($js);
advagg_mod_inline_defer($js, $jquery_deferred);
if (variable_get('advagg_mod_js_async_in_header', ADVAGG_MOD_JS_ASYNC_IN_HEADER)) {
foreach ($js as &$values) {
if ($values['type'] !== 'file' && $values['type'] !== 'external') {
continue;
}
if (empty($values['async']) && empty($values['attributes']['async'])) {
continue;
}
if (!empty($values['scope_lock'])) {
continue;
}
$values['scope'] = 'header';
$values['group'] = 1000;
}
unset($values);
}
advagg_mod_prefetch_link($js);
}
function advagg_mod_prefetch_link(array &$js) {
if (!variable_get('advagg_mod_prefetch', ADVAGG_MOD_PREFETCH)) {
return;
}
foreach ($js as &$values) {
if (!isset($values['dns_prefetch'])) {
continue;
}
foreach ($values['dns_prefetch'] as &$url) {
if (strpos($url, '//stats.g.doubleclick.net') === FALSE) {
continue;
}
if (variable_get('advagg_resource_hints_preconnect', ADVAGG_RESOURCE_HINTS_PRECONNECT)) {
$parse = @parse_url($url);
$inline_script = 'var preconnect_support = false; try {if (document.createElement("link").relList.supports("preconnect")) {preconnect_support = true;}} catch (e) {} if (!preconnect_support) { var prefetch = document.createElement("link"); prefetch.href = "https://' . $parse['host'] . '/robots.txt"; prefetch.rel="prefetch"; document.getElementsByTagName("head")[0].appendChild(prefetch);}';
$js['advagg_preconnect_support'] = array(
'type' => 'inline',
'group' => JS_LIBRARY - 1,
'weight' => -50000,
'scope_lock' => TRUE,
'movable' => FALSE,
'no_defer' => TRUE,
'data' => $inline_script,
) + drupal_js_defaults($inline_script);
}
else {
$url .= '#prefetch';
}
}
}
}
function advagg_mod_js_no_ajaxpagestate(array &$scripts) {
if (!module_exists('advagg') || !advagg_enabled()) {
return;
}
if (!variable_get('advagg_mod_js_no_ajaxpagestate', ADVAGG_MOD_JS_NO_AJAXPAGESTATE) || variable_get('advagg_cache_level', ADVAGG_CACHE_LEVEL) < 0) {
return;
}
$ajax_found = FALSE;
if (isset($scripts['#items']) && is_array($scripts['#items'])) {
foreach ($scripts['#items'] as $key => $values) {
if (strpos($key, 'misc/ajax.js') !== FALSE || strpos($key, 'misc/ajax.min.js')) {
$ajax_found = TRUE;
break;
}
}
}
if (!$ajax_found && isset($scripts['#items']['settings']['data'])) {
foreach ($scripts['#items']['settings']['data'] as $delta => $setting) {
if (array_key_exists('ajaxPageState', $setting)) {
if (isset($scripts['#items']['settings']['data'][$delta]['ajaxPageState']['js'])) {
unset($scripts['#items']['settings']['data'][$delta]['ajaxPageState']['js']);
}
if (isset($scripts['#items']['settings']['data'][$delta]['ajaxPageState']['css'])) {
unset($scripts['#items']['settings']['data'][$delta]['ajaxPageState']['css']);
}
if (empty($scripts['#items']['settings']['data'][$delta]['ajaxPageState'])) {
unset($scripts['#items']['settings']['data'][$delta]['ajaxPageState']);
if (empty($scripts['#items']['settings']['data'][$delta])) {
unset($scripts['#items']['settings']['data'][$delta]);
}
}
}
}
}
}
function advagg_mod_get_lists(array $js = array(), array $css = array()) {
$lists =& drupal_static(__FUNCTION__);
$js_count = count($js);
$css_count = count($css);
$key = $js_count . '.' . $css_count;
if (!isset($lists[$key])) {
$header_file_list = array(
'/modernizr.',
'/html5shiv.',
'/html5shiv-printshiv.',
'/google_service.',
);
$header_inline_list = array(
'GoogleAnalyticsObject',
'window.google_analytics_uacct',
'GS_googleAddAdSenseService(',
'GS_googleEnableAllServices(',
'GA_googleAddSlot(',
'GA_googleFetchAds(',
);
$no_async_defer_list = array(
'//fast.wistia.',
'//dev.virtualearth.net',
'//api.maps.yahoo.com',
'/google_service.',
);
if (module_exists('openlayers')) {
$path = variable_get('openlayers_layers_cloudmade_js', '');
if (valid_url($path, TRUE)) {
$no_async_defer_list['openlayers_layers_cloudmade'] = $path;
}
$mapdomain = variable_get('openlayers_layers_google_mapdomain', 'maps.google.com');
$no_async_defer_list['openlayers_layers_google'] = $mapdomain . '/maps';
}
$inline_wrapper_list = array();
$inline_js_wrap_skip_list = array_filter(array_map('trim', explode("\n", variable_get('advagg_mod_wrap_inline_js_skip_list', ADVAGG_MOD_WRAP_INLINE_JS_SKIP_LIST))));
$inline_js_wrap_skip_list[] = '.write(';
$inline_js_wrap_skip_list[] = '._fbq';
$inline_js_wrap_skip_list[] = '.fbq';
$inline_js_wrap_skip_list[] = 'gtm.start';
$inline_js_wrap_skip_list[] = '_gaq.push(["_';
$inline_js_wrap_skip_list[] = 'ga("';
$inline_js_wrap_skip_list[] = "ga('";
$inline_js_wrap_skip_list[] = 'GoogleAnalyticsObject';
$inline_js_wrap_skip_list[] = 'window.google_analytics_uacct';
$inline_js_wrap_skip_list[] = 'function krumo(';
$inline_js_wrap_skip_list[] = '// no advagg';
$inline_js_wrap_skip_list[] = '// noadvagg';
$inline_js_wrap_skip_list[] = '// no-advagg';
$inline_js_wrap_skip_list[] = '//no advagg';
$inline_js_wrap_skip_list[] = '//noadvagg';
$inline_js_wrap_skip_list[] = '//no-advagg';
$inline_js_wrap_skip_list[] = 'GS_googleAddAdSenseService(';
$inline_js_wrap_skip_list[] = 'GS_googleEnableAllServices(';
$inline_js_wrap_skip_list[] = 'GA_googleAddSlot(';
$inline_js_wrap_skip_list[] = 'GA_googleFetchAds(';
$inline_js_wrap_skip_list[] = 'GA_googleFillSlot(';
$inline_js_wrap_skip_list[] = 'adsbygoogle';
$inline_js_wrap_skip_list[] = '_paq.push(["';
if (module_exists('h5p')) {
$inline_js_wrap_skip_list[] = 'H5PIntegration';
}
$inline_js_defer_skip_list = array_filter(array_map('trim', explode("\n", variable_get('advagg_mod_defer_inline_js_skip_list', ADVAGG_MOD_DEFER_INLINE_JS_SKIP_LIST))));
$inline_js_defer_skip_list[] = 'loadCSS(';
$inline_js_defer_skip_list[] = '._fbq';
$inline_js_defer_skip_list[] = '.fbq';
$inline_js_defer_skip_list[] = 'gtm.start';
$inline_js_defer_skip_list[] = '_gaq.push(["_';
$inline_js_defer_skip_list[] = 'GoogleAnalyticsObject';
$inline_js_defer_skip_list[] = 'window.google_analytics_uacct';
$inline_js_defer_skip_list[] = '// no advagg';
$inline_js_defer_skip_list[] = '// noadvagg';
$inline_js_defer_skip_list[] = '// no-advagg';
$inline_js_defer_skip_list[] = '//no advagg';
$inline_js_defer_skip_list[] = '//noadvagg';
$inline_js_defer_skip_list[] = '//no-advagg';
$inline_js_defer_skip_list[] = 'GS_googleAddAdSenseService(';
$inline_js_defer_skip_list[] = 'GS_googleEnableAllServices(';
$inline_js_defer_skip_list[] = 'GA_googleAddSlot(';
$inline_js_defer_skip_list[] = 'GA_googleFetchAds(';
$inline_js_defer_skip_list[] = 'GA_googleFillSlot(';
$inline_js_defer_skip_list[] = 'adsbygoogle';
$inline_js_defer_skip_list[] = '_paq.push(["';
if (module_exists('h5p')) {
$inline_js_defer_skip_list[] = 'H5PIntegration';
}
$all_in_footer_list = array(
'misc/ajax.js' => array(
'/jquery.js',
'/jquery.min.js',
'/jquery.once.js',
'/ajax.js',
'/drupal.js',
'settings',
),
);
$move_js_to_footer = variable_get('advagg_mod_js_footer', ADVAGG_MOD_JS_FOOTER);
$defer_setting = variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER);
$async_setting = variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC);
$css_defer = variable_get('advagg_mod_css_defer', ADVAGG_MOD_CSS_DEFER);
$lists[$key] = array(
$header_file_list,
$header_inline_list,
$no_async_defer_list,
$inline_wrapper_list,
$inline_js_wrap_skip_list,
$inline_js_defer_skip_list,
$all_in_footer_list,
$move_js_to_footer,
$defer_setting,
$async_setting,
$css_defer,
);
drupal_alter('advagg_mod_get_lists', $lists[$key], $js, $css);
}
return $lists[$key];
}
function advagg_mod_js_move_to_footer(array &$js) {
list($header_file_list, $header_inline_list, , , , , $all_in_footer_list, $move_js_to_footer) = advagg_mod_get_lists($js);
if (empty($move_js_to_footer)) {
return;
}
if ($move_js_to_footer == 3 && !empty($all_in_footer_list)) {
foreach ($all_in_footer_list as $key => $search_strings) {
if (isset($js[$key])) {
foreach ($js as $name => &$values) {
foreach ($search_strings as $string) {
if (!empty($string) && strpos($name, (string) $string) !== FALSE) {
$values['scope_lock'] = TRUE;
break;
}
if (is_string($values['data']) && !empty($string) && strpos($values['data'], (string) $string) !== FALSE) {
$values['scope_lock'] = TRUE;
break;
}
if (!empty($values['pre_relocate_data']) && is_string($values['pre_relocate_data']) && !empty($string) && strpos($values['pre_relocate_data'], (string) $string) !== FALSE) {
$values['scope_lock'] = TRUE;
break;
}
}
}
}
}
}
foreach ($js as $key => &$values) {
if (!isset($values['scope'])) {
unset($js[$key]);
continue;
}
if (strpos($values['scope'], ':') !== FALSE) {
continue;
}
if ($move_js_to_footer == 1 && isset($values['group']) && $values['group'] <= JS_LIBRARY) {
continue;
}
if (!empty($values['scope_lock'])) {
continue;
}
if ($values['type'] !== 'inline' && $values['type'] !== 'setting') {
foreach ($header_file_list as $search_string) {
if (stripos($values['data'], $search_string) !== FALSE) {
continue 2;
}
if (!empty($values['pre_relocate_data']) && stripos($values['pre_relocate_data'], $search_string) !== FALSE) {
continue 2;
}
}
}
if ($values['type'] === 'inline') {
foreach ($header_inline_list as $search_string) {
if (strpos($values['data'], $search_string) !== FALSE) {
continue 2;
}
}
}
if (!isset($values['group'])) {
$values['group'] = JS_DEFAULT;
}
if (!isset($values['weight'])) {
$values['weight'] = 0;
}
if (!isset($values['every_page'])) {
$values['every_page'] = FALSE;
}
if ($values['scope'] !== 'header' && is_numeric($values['group'])) {
$values['group'] += 10000;
}
if ($values['scope'] === 'footer' && is_numeric($values['group'])) {
$values['group'] += 10000;
}
$values['scope'] = 'footer';
}
unset($values);
}
function advagg_mod_js_async_defer(array &$js) {
$jquery_deferred = FALSE;
$jquery_rev = strrev('/jquery.js');
$jquery_min_rev = strrev('/jquery.min.js');
$jquery_ui_rev = strrev('/jquery-ui.js');
$jquery_ui_min_rev = strrev('jquery-ui.min.js');
list(, , $no_async_defer_list, $inline_wrapper_list, , , , , $defer_setting, $async_setting) = advagg_mod_get_lists($js);
if (!$defer_setting && !$async_setting) {
if (!empty($GLOBALS['advagg_mod_loadcss_jquery_holdready'])) {
foreach ($js as $name => &$values) {
if (stripos(strrev($name), $jquery_rev) === 0 || stripos(strrev($name), $jquery_min_rev) === 0) {
$values['onload'] = "if(jQuery.isFunction(jQuery.holdReady)){jQuery.holdReady(true);}";
break;
}
}
}
return $jquery_deferred;
}
$use_on_error = FALSE;
if (variable_get('advagg_mod_js_defer_jquery', ADVAGG_MOD_JS_DEFER_JQUERY) !== FALSE && variable_get('advagg_mod_js_defer_inline_alter', ADVAGG_MOD_JS_DEFER_INLINE_ALTER) && variable_get('jquery_update_jquery_cdn', 'none') !== 'none') {
$use_on_error = TRUE;
}
if ($use_on_error) {
$jquery_update_fallback = '';
$jquery_update_ui_fallback = '';
$jquery_migrate_fallback = '';
$inline_array = array();
if (module_exists('jquery_update') && (variable_get('jquery_update_jquery_cdn', 'none') !== 'none' || variable_get('jquery_update_jquery_migrate_cdn', 'none') !== 'none')) {
$min = variable_get('jquery_update_compression_type', 'min') == 'none' ? '' : '.min';
$path = drupal_get_path('module', 'jquery_update');
foreach ($js as $name => &$values) {
if ($values['type'] !== 'inline') {
continue;
}
if (stripos($values['data'], 'window.jQuery.ui') !== FALSE && stripos($values['data'], 'document.write("<script') !== FALSE && variable_get('jquery_update_jquery_cdn', 'none') !== 'none') {
$js_path = $min == '.min' ? '/replace/ui/ui/minified/jquery-ui.min.js' : '/replace/ui/ui/jquery-ui.js';
$jquery_update_ui_fallback = "{$GLOBALS['base_path']}{$path}{$js_path}";
if (empty($inline_array)) {
$inline_array = $values;
}
unset($js[$name]);
continue;
}
if (stripos($values['data'], 'window.jQuery.migrateWarnings') !== FALSE && stripos($values['data'], 'document.write("<script') !== FALSE && variable_get('jquery_update_jquery_migrate_cdn', 'none') !== 'none') {
$version = '1.2.1';
$jquery_migrate_fallback = "{$GLOBALS['base_path']}{$path}/replace/jquery-migrate/{$version}/jquery-migrate{$min}.js";
$inline_array = $values;
unset($js[$name]);
continue;
}
if (stripos($values['data'], 'window.jQuery') !== FALSE && stripos($values['data'], 'document.write("<script') !== FALSE && variable_get('jquery_update_jquery_cdn', 'none') !== 'none') {
$version = variable_get('jquery_update_jquery_version', '1.10');
$jquery_update_fallback = "{$GLOBALS['base_path']}{$path}/replace/jquery/{$version}/jquery{$min}.js";
$inline_array = $values;
unset($js[$name]);
continue;
}
}
unset($values);
}
if (!empty($jquery_update_fallback) || !empty($jquery_update_ui_fallback) || !empty($jquery_migrate_fallback)) {
$inline_array['group'] = '-150';
$inline_array['weight'] += -10;
$inline_array['data'] = 'function advagg_fallback(file){var head = document.getElementsByTagName("head")[0];var script = document.createElement("script");script.src = file;script.type = "text/javascript";head.appendChild(script);};';
$inline_array['scope_lock'] = TRUE;
$inline_array['movable'] = FALSE;
$inline_array['no_defer'] = TRUE;
$inline_array['scope'] = 'header';
$js['advagg_fallback'] = $inline_array;
}
}
$hold_ready = FALSE;
foreach ($js as $name => &$values) {
if ($values['type'] !== 'file' && $values['type'] !== 'external') {
continue;
}
if (variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER) && empty($values['nodefer'])) {
$values['defer'] = TRUE;
}
if (variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC) && empty($values['noasync'])) {
$values['async'] = TRUE;
}
if (stripos(strrev($name), $jquery_rev) === 0 || stripos(strrev($name), $jquery_min_rev) === 0) {
$jquery_deferred = TRUE;
if (empty($hold_ready)) {
if (!empty($GLOBALS['advagg_mod_loadcss_jquery_holdready'])) {
$values['onload'] = "if(jQuery.isFunction(jQuery.holdReady)){jQuery.holdReady(true);jQuery.holdReady(true);}";
}
else {
$values['onload'] = "if(jQuery.isFunction(jQuery.holdReady)){jQuery.holdReady(true);}";
}
$hold_ready = TRUE;
}
if (module_exists('jquery_update') && variable_get('jquery_update_jquery_cdn', 'none') !== 'none') {
if ($use_on_error && !empty($jquery_update_fallback)) {
if (!isset($values['onerror'])) {
$values['onerror'] = '';
}
$values['onerror'] .= "advagg_fallback('{$jquery_update_fallback}');";
}
if (!variable_get('advagg_mod_js_defer_jquery', ADVAGG_MOD_JS_DEFER_JQUERY) !== FALSE && variable_get('advagg_mod_js_defer_inline_alter', ADVAGG_MOD_JS_DEFER_INLINE_ALTER) && variable_get('jquery_update_jquery_cdn', 'none') !== 'none') {
if (variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER)) {
$values['defer'] = FALSE;
$jquery_deferred = FALSE;
}
}
if (variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC)) {
$values['async'] = FALSE;
}
continue;
}
}
if (stripos($name, '/jquery-migrate') !== FALSE) {
if (module_exists('jquery_update') && variable_get('jquery_update_jquery_migrate_cdn', 'none') !== 'none') {
if ($use_on_error) {
if (!isset($values['onerror'])) {
$values['onerror'] = '';
}
$values['onerror'] .= "advagg_fallback('{$jquery_migrate_fallback}');";
}
if (!variable_get('advagg_mod_js_defer_jquery', ADVAGG_MOD_JS_DEFER_JQUERY) !== FALSE && variable_get('advagg_mod_js_defer_inline_alter', ADVAGG_MOD_JS_DEFER_INLINE_ALTER) && variable_get('jquery_update_jquery_cdn', 'none') !== 'none') {
if (variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER)) {
$values['defer'] = FALSE;
}
}
if (variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC)) {
$values['async'] = FALSE;
}
continue;
}
}
if (stripos(strrev($name), $jquery_ui_rev) === 0 || stripos(strrev($name), $jquery_ui_min_rev) === 0) {
if (module_exists('jquery_update') && variable_get('jquery_update_jquery_cdn', 'none') !== 'none') {
if ($use_on_error) {
if (!isset($values['onerror'])) {
$values['onerror'] = '';
}
$values['onerror'] .= "advagg_fallback('{$jquery_update_ui_fallback}');";
}
if (!variable_get('advagg_mod_js_defer_jquery', ADVAGG_MOD_JS_DEFER_JQUERY) !== FALSE && variable_get('advagg_mod_js_defer_inline_alter', ADVAGG_MOD_JS_DEFER_INLINE_ALTER) && variable_get('jquery_update_jquery_cdn', 'none') !== 'none') {
if (variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER)) {
$values['defer'] = FALSE;
}
}
if (variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC)) {
$values['async'] = FALSE;
}
continue;
}
}
if ($name === 'misc/drupal.js') {
if (!isset($values['onload'])) {
$values['onload'] = '';
}
$matches[0] = $matches[2] = 'init_drupal_core_settings();';
$values['onload'] .= advagg_mod_wrap_inline_js($matches, "window.init_drupal_core_settings && window.jQuery && window.Drupal", 1);
}
foreach ($no_async_defer_list as $search_string) {
if (strpos($name, $search_string) !== FALSE) {
if (variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER)) {
$values['defer'] = FALSE;
}
if (variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC)) {
$values['async'] = FALSE;
}
}
}
if ($defer_setting == 2 && $values['type'] === 'external') {
$values['defer'] = FALSE;
}
}
unset($values);
foreach ($js as &$values) {
if ($values['type'] !== 'inline') {
continue;
}
foreach ($inline_wrapper_list as $search_string => $js_condition) {
if (strpos($values['data'], $search_string) !== FALSE) {
$matches[0] = $matches[2] = $values['data'];
$values['data'] = advagg_mod_wrap_inline_js($matches, $js_condition);
}
}
}
unset($values);
return $jquery_deferred;
}
function advagg_mod_inline_defer(array &$js, $jquery_deferred) {
if ($jquery_deferred) {
$bootstrap_rev = strrev('/bootstrap.js');
$bootstrap_min_rev = strrev('/bootstrap.min.js');
foreach ($js as &$values) {
if (is_string($values['data']) && (stripos(strrev($values['data']), $bootstrap_rev) === 0 || stripos(strrev($values['data']), $bootstrap_min_rev) === 0)) {
$values['defer'] = TRUE;
continue;
}
if ($values['type'] === 'inline') {
if (strpos($values['data'], 'advagg_mod_') !== FALSE) {
continue;
}
if (!empty($values['no_defer'])) {
continue;
}
$pattern = '/\\s*function\\s+((?:[a-z][a-z0-9_]*))\\s*\\(.*\\)\\s*\\{/smix';
$match = preg_match($pattern, $values['data']);
if (!$match) {
$matches[2] = $matches[0] = $values['data'];
$values['data'] = advagg_mod_wrap_inline_js($matches);
}
elseif (stripos($values['data'], 'jQuery.') !== FALSE || stripos($values['data'], '(jQuery)') !== FALSE) {
$no_jquery_defer = TRUE;
}
}
}
unset($values);
}
elseif (variable_get('advagg_mod_js_defer_inline_alter', ADVAGG_MOD_JS_DEFER_INLINE_ALTER)) {
foreach ($js as &$values) {
if ($values['type'] !== 'inline') {
continue;
}
if (strpos($values['data'], 'advagg_mod_') !== FALSE) {
continue;
}
if (!empty($values['no_defer'])) {
continue;
}
$pattern = '/\\s*function\\s+((?:[a-z][a-z0-9_]*))\\s*\\(.*\\)\\s*\\{/smix';
$match = preg_match($pattern, $values['data']);
if (!$match) {
$values['data'] = advagg_mod_defer_inline_js($values['data']);
}
}
unset($values);
}
if (!empty($no_jquery_defer)) {
$jquery_rev = strrev('/jquery.js');
$jquery_min_rev = strrev('/jquery.min.js');
foreach ($js as $name => &$values) {
if ($values['type'] !== 'file' && $values['type'] !== 'external') {
continue;
}
if (stripos(strrev($name), $jquery_rev) === 0 || stripos(strrev($name), $jquery_min_rev) === 0) {
$values['defer'] = FALSE;
}
}
}
}
function _advagg_mod_pre_render_scripts(array $elements) {
if (advagg_mod_inline_page() || advagg_mod_inline_page_js()) {
advagg_mod_inline_js($elements['#items']);
}
return $elements;
}
function _advagg_mod_pre_render_styles(array $elements) {
if (!module_exists('advagg') || !advagg_enabled()) {
return $elements;
}
if (advagg_mod_inline_page() || advagg_mod_inline_page_css()) {
advagg_mod_inline_css($elements['#items']);
}
elseif (variable_get('advagg_mod_css_defer_skip_first_file', ADVAGG_MOD_CSS_DEFER_SKIP_FIRST_FILE) == 4) {
list(, , , , , , , , , , $css_defer) = advagg_mod_get_lists(array(), $elements['#items']);
$css_defer_admin = variable_get('advagg_mod_css_defer_admin', ADVAGG_MOD_CSS_DEFER_ADMIN);
if (advagg_mod_css_defer_page() && !empty($css_defer) && (!empty($css_defer_admin) || !path_is_admin(current_path()))) {
advagg_mod_inline_css($elements['#items'], 0, variable_get('advagg_mod_css_defer_inline_size_limit', ADVAGG_MOD_CSS_DEFER_INLINE_SIZE_LIMIT));
}
}
return $elements;
}
function advagg_mod_xpath_script_wrapper($html) {
libxml_use_internal_errors(TRUE);
$dom = new DOMDocument();
$dom
->loadHTML('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>' . $html . '</body></html>');
$xpath = new DOMXPath($dom);
$nodes = $xpath
->query("//script[not(@src)][not(ancestor::textarea)][contains(translate(@type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'javascript') or not(@type)]");
foreach ($nodes as $node) {
$matches[2] = $node->nodeValue;
$matches[0] = $node->nodeValue;
$new_html = advagg_mod_wrap_inline_js($matches);
$advagg = $dom
->createElement('script');
$advagg
->appendchild($dom
->createTextNode($new_html));
$node->parentNode
->replaceChild($advagg, $node);
}
$output = $dom
->saveHTML();
$output = str_replace(array(
'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>',
'</body></html>',
), array(
'',
'',
), $output);
libxml_clear_errors();
return $output;
}
function advagg_mod_xpath_script_external_dns($html) {
libxml_use_internal_errors(TRUE);
$dom = new DOMDocument();
$dom
->loadHTML('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>' . $html . '</body></html>');
$xpath = new DOMXPath($dom);
$nodes = $xpath
->query("//script[@src][not(ancestor::textarea)]");
foreach ($nodes as $node) {
advagg_add_dns_prefetch($node->attributes
->getNamedItem('src')->nodeValue);
}
libxml_clear_errors();
}
function advagg_mod_defer_inline_js($input) {
if (variable_get('advagg_mod_js_defer_jquery', ADVAGG_MOD_JS_DEFER_JQUERY) !== FALSE && variable_get('jquery_update_jquery_cdn', 'none') !== 'none' && (stripos($input, 'jQuery') !== FALSE || strpos($input, '$(') !== FALSE || stripos($input, 'Drupal.') !== FALSE)) {
$matches[2] = $matches[0] = $input;
return advagg_mod_wrap_inline_js($matches);
}
list(, , , , , $inline_js_defer_skip_list) = advagg_mod_get_lists();
if (!empty($inline_js_defer_skip_list)) {
foreach ($inline_js_defer_skip_list as $string_to_check) {
if (stripos($input, $string_to_check) !== FALSE) {
return $input;
}
}
}
static $counter;
++$counter;
$new = "\nfunction advagg_mod_defer_{$counter}() {\n {$input};\n}\nwindow.setTimeout(advagg_mod_defer_{$counter}, 0);";
return $new;
}
function advagg_mod_wrap_inline_js(array $matches, $check_string = NULL, $ms_wait = 250) {
list(, , , $inline_wrapper_list, $inline_js_wrap_skip_list) = advagg_mod_get_lists();
if (empty($check_string)) {
foreach ($inline_wrapper_list as $search_string => $js_condition) {
if (strpos($matches[2], $search_string) !== FALSE) {
$check_string = $js_condition;
break;
}
}
if (empty($check_string)) {
$check_string = 'window.jQuery && window.Drupal && window.Drupal.settings';
}
}
if (!empty($inline_js_wrap_skip_list) && stripos($matches[2], '(jQuery') === FALSE && stripos($matches[2], 'jQuery.') === FALSE && stripos($matches[2], '(Drupal') === FALSE && stripos($matches[2], 'Drupal.') === FALSE) {
foreach ($inline_js_wrap_skip_list as $string_to_check) {
if (stripos($matches[2], $string_to_check) !== FALSE) {
return $matches[0];
}
}
}
static $counter;
++$counter;
$new = "\nfunction advagg_mod_{$counter}() {\n // Count how many times this function is called.\n advagg_mod_{$counter}.count = ++advagg_mod_{$counter}.count || 1;\n try {\n if (advagg_mod_{$counter}.count <= 40) {\n {$matches[2]}\n\n // Set this to 100 so that this function only runs once.\n advagg_mod_{$counter}.count = 100;\n }\n }\n catch(e) {\n if (advagg_mod_{$counter}.count >= 40) {\n // Throw the exception if this still fails after running 40 times.\n throw e;\n }\n else {\n // Try again in {$ms_wait} ms.\n window.setTimeout(advagg_mod_{$counter}, {$ms_wait});\n }\n }\n}\nfunction advagg_mod_{$counter}_check() {\n if ({$check_string}) {\n advagg_mod_{$counter}();\n }\n else {\n window.setTimeout(advagg_mod_{$counter}_check, {$ms_wait});\n }\n}\nadvagg_mod_{$counter}_check();";
$return = str_replace($matches[2], $new, $matches[0]);
return $return;
}
function advagg_mod_sort_css_js(array &$array, $type) {
if ($type === 'js' && variable_get('advagg_mod_js_adjust_sort_external', ADVAGG_MOD_JS_ADJUST_SORT_EXTERNAL) || $type === 'css' && variable_get('advagg_mod_css_adjust_sort_external', ADVAGG_MOD_CSS_ADJUST_SORT_EXTERNAL)) {
$external = array();
$group = NULL;
$every_page = NULL;
$weight = NULL;
foreach ($array as $key => $value) {
if (is_null($group)) {
$group = $value['group'];
}
if (is_null($every_page)) {
$every_page = $value['every_page'];
}
if (is_null($weight)) {
$weight = $value['weight'];
}
if (isset($value['group']) && $value['group'] < $group) {
$group = $value['group'];
}
if (!empty($value['every_page']) && !$every_page) {
$every_page = $value['every_page'];
}
if (isset($value['weight']) && $value['weight'] < $weight) {
$weight = $value['weight'];
}
if (!empty($value['type']) && $value['type'] === 'external') {
$external[$key] = $value;
unset($array[$key]);
}
if (!empty($value['type']) && $value['type'] === 'inline') {
if (strpos($value['data'], 'window.jQuery') === 0) {
$external[$key] = $value;
unset($array[$key]);
}
if (strpos($value['data'], 'window.jQuery.ui') === 0) {
$external[$key] = $value;
unset($array[$key]);
}
}
}
advagg_drupal_sort_css_js_stable($external);
$offset = 0.0001;
$weight += -1;
$found_jquery = FALSE;
foreach ($external as $key => $value) {
if (isset($value['movable']) && empty($value['movable'])) {
$array[$key] = $value;
continue;
}
if (strpos($value['data'], 'jquery.min.js') !== FALSE || strpos($value['data'], 'jquery.js') !== FALSE) {
$found_jquery = TRUE;
}
if (!$found_jquery && (strpos($value['data'], 'bootstrap.min.js') !== FALSE || strpos($value['data'], 'bootstrap.js') !== FALSE)) {
$array[$key] = $value;
continue;
}
$value['group'] = $group;
$value['every_page'] = $every_page;
$value['weight'] = $weight;
$weight += $offset;
$array[$key] = $value;
}
}
if ($type === 'js' && variable_get('advagg_mod_js_adjust_sort_inline', ADVAGG_MOD_JS_ADJUST_SORT_INLINE) || $type === 'css' && variable_get('advagg_mod_css_adjust_sort_inline', ADVAGG_MOD_CSS_ADJUST_SORT_INLINE)) {
$inline = array();
$group = NULL;
$every_page = NULL;
$weight = NULL;
foreach ($array as $key => $value) {
if (is_null($group)) {
$group = $value['group'];
}
if (is_null($every_page)) {
$every_page = $value['every_page'];
}
if (is_null($weight)) {
$weight = $value['weight'];
}
if (isset($value['group']) && $value['group'] > $group) {
$group = $value['group'];
}
if (empty($value['every_page']) && $every_page) {
$every_page = FALSE;
}
if (isset($value['weight']) && $value['weight'] > $weight) {
$weight = $value['weight'];
}
if (!empty($value['type']) && $value['type'] === 'inline') {
if (strpos($value['data'], 'window.jQuery') === 0) {
continue;
}
if (strpos($value['data'], 'window.jQuery.ui') === 0) {
continue;
}
$inline[$key] = $value;
unset($array[$key]);
}
}
advagg_drupal_sort_css_js_stable($inline);
$offset = 0.0001;
$weight += 1;
foreach ($inline as $key => $value) {
if (isset($value['movable']) && empty($value['movable'])) {
$array[$key] = $value;
continue;
}
$value['group'] = $group;
$value['every_page'] = $every_page;
$value['weight'] = $weight;
$weight += $offset;
$array[$key] = $value;
}
}
if ($type === 'js' && variable_get('advagg_mod_js_adjust_sort_browsers', ADVAGG_MOD_JS_ADJUST_SORT_BROWSERS) || $type === 'css' && variable_get('advagg_mod_css_adjust_sort_browsers', ADVAGG_MOD_CSS_ADJUST_SORT_BROWSERS)) {
$browsers_list = array();
foreach ($array as $key => $value) {
if (isset($value['browsers']['IE']) && $value['browsers']['IE'] !== TRUE) {
$browsers_list['IE'][] = $value['browsers']['IE'];
}
}
if (isset($browsers_list['IE'])) {
$browsers_list['IE'] = array_values(array_unique($browsers_list['IE']));
foreach ($browsers_list['IE'] as $browser) {
$browsers = array();
$group = NULL;
$every_page = NULL;
$weight = NULL;
foreach ($array as $key => $value) {
if (isset($value['browsers']['IE']) && $browser === $value['browsers']['IE']) {
if (is_null($group)) {
$group = $value['group'];
}
if (is_null($every_page)) {
$every_page = $value['every_page'];
}
if (is_null($weight)) {
$weight = $value['weight'];
}
if ($value['group'] > $group) {
$group = $value['group'];
}
if (!$value['every_page'] && $every_page) {
$every_page = $value['every_page'];
}
if ($value['weight'] > $weight) {
$weight = $value['weight'];
}
$browsers[$key] = $value;
unset($array[$key]);
}
}
advagg_drupal_sort_css_js_stable($browsers);
$offset = 0.0001;
foreach ($browsers as $key => $value) {
if (isset($value['movable']) && empty($value['movable'])) {
$array[$key] = $value;
continue;
}
$value['group'] = $group;
$value['every_page'] = $every_page;
$value['weight'] = $weight;
$weight += $offset;
$array[$key] = $value;
}
}
}
}
}
function advagg_mod_inline_page() {
$visibility = variable_get('advagg_mod_inline_visibility', ADVAGG_MOD_VISIBILITY_LISTED);
$pages = variable_get('advagg_mod_inline_pages', '');
return advagg_mod_match_path($pages, $visibility);
}
function advagg_mod_inline_page_css() {
$visibility = variable_get('advagg_mod_inline_css_visibility', ADVAGG_MOD_VISIBILITY_LISTED);
$pages = variable_get('advagg_mod_inline_css_pages', '');
return advagg_mod_match_path($pages, $visibility);
}
function advagg_mod_inline_page_js() {
$visibility = variable_get('advagg_mod_inline_js_visibility', ADVAGG_MOD_VISIBILITY_LISTED);
$pages = variable_get('advagg_mod_inline_js_pages', '');
return advagg_mod_match_path($pages, $visibility);
}
function advagg_mod_css_defer_page() {
$visibility = variable_get('advagg_mod_css_defer_visibility', ADVAGG_MOD_VISIBILITY_LISTED);
$pages = variable_get('advagg_mod_css_defer_pages', '');
return advagg_mod_match_path($pages, $visibility);
}
function advagg_mod_inline_js(array &$js) {
$aggregate_settings = advagg_current_hooks_hash_array();
foreach ($js as &$values) {
if ($values['type'] !== 'file') {
continue;
}
$filename = $values['data'];
if (file_exists($filename)) {
$contents = (string) @advagg_file_get_contents($filename);
}
drupal_alter('advagg_get_js_file_contents', $contents, $filename, $aggregate_settings);
$values['data'] = $contents;
$values['type'] = 'inline';
}
unset($values);
}
function advagg_mod_inline_css(array &$css, $file_limit = 0, $size_limit = 0) {
$aggregate_settings = advagg_current_hooks_hash_array();
$optimize = TRUE;
module_load_include('inc', 'advagg', 'advagg');
$count = 0;
$size = 0;
foreach ($css as &$values) {
if ($values['type'] !== 'file') {
continue;
}
$file = $values['data'];
if (file_exists($file)) {
if (!empty($file_limit) && $count > $file_limit) {
break;
}
$contents = advagg_load_css_stylesheet($file, $optimize, $aggregate_settings);
drupal_alter('advagg_get_css_file_contents', $contents, $file, $aggregate_settings);
$regexp = '/@import[^;]+;/i';
preg_match_all($regexp, $contents, $matches);
$contents = preg_replace($regexp, '', $contents);
$contents = implode('', $matches[0]) . $contents;
$size += strlen($contents);
if (!empty($size_limit) && $size > $size_limit) {
break;
}
$values['data'] = $contents;
$values['type'] = 'inline';
$count++;
}
}
unset($values);
}
function advagg_mod_match_path($pages, $visibility) {
$page_match = FALSE;
if (empty($pages) && $visibility <= ADVAGG_MOD_VISIBILITY_PHP) {
if ($visibility == ADVAGG_MOD_VISIBILITY_NOTLISTED) {
$page_match = TRUE;
}
}
else {
if ($visibility == ADVAGG_MOD_VISIBILITY_PHP) {
if (module_exists('php')) {
$page_match = php_eval($pages);
}
}
elseif ($visibility < ADVAGG_MOD_VISIBILITY_PHP) {
$current_path = current_path();
$pages = drupal_strtolower($pages);
$path = drupal_strtolower(drupal_get_path_alias($current_path));
$page_match = drupal_match_path($path, $pages);
if ($path != $current_path) {
$page_match = $page_match || drupal_match_path($current_path, $pages);
}
$page_match = !($visibility xor $page_match);
}
}
return $page_match;
}
function advagg_mod_js_contains_jquery_drupal($filename, $type = '') {
if (is_string($filename)) {
if ($type === 'inline') {
$contents = $filename;
}
elseif ($type === 'external' || strpos($filename, 'http://') === 0 || strpos($filename, 'https://') === 0 || strpos($filename, '//') === 0) {
$result = drupal_http_request($filename);
if (($result->code == 200 || isset($result->redirect_code) && $result->redirect_code == 200) && !empty($result->data)) {
$contents = $result->data;
}
}
elseif (file_exists($filename)) {
$contents = (string) @advagg_file_get_contents($filename);
}
}
$results = array();
if (!empty($contents) && stripos($contents, 'drupal.') !== FALSE) {
$results['contents']['drupal'] = TRUE;
if (stripos($contents, 'drupal.settings.') !== FALSE) {
$results['contents']['drupal.settings'] = TRUE;
}
else {
$results['contents']['drupal.settings'] = FALSE;
}
if (stripos($contents, 'drupal.behaviors.') !== FALSE) {
$results['contents']['drupal.behaviors'] = TRUE;
}
else {
$results['contents']['drupal.behaviors'] = FALSE;
}
}
else {
$results['contents']['drupal'] = FALSE;
$results['contents']['drupal.settings'] = FALSE;
$results['contents']['drupal.behaviors'] = FALSE;
}
if (!empty($contents) && stripos($contents, 'jquery') !== FALSE) {
$results['contents']['jquery'] = TRUE;
}
else {
$results['contents']['jquery'] = FALSE;
}
return $results;
}
function advagg_mod_ga_inline_to_file(array &$js) {
if (!module_exists('googleanalytics') || !is_callable('googleanalytics_api') || !is_callable('_googleanalytics_cache')) {
return;
}
$ga_script = '';
$debug = variable_get('googleanalytics_debug', 0);
$api = googleanalytics_api();
if ($api['api'] === 'analytics.js') {
$library_tracker_url = '//www.google-analytics.com/' . ($debug ? 'analytics_debug.js' : 'analytics.js');
$library_cache_url = 'http:' . $library_tracker_url;
}
else {
if ($trackdoubleclick = variable_get('googleanalytics_trackdoubleclick', FALSE)) {
$library_tracker_url = 'stats.g.doubleclick.net/dc.js';
$library_cache_url = 'http://' . $library_tracker_url;
}
else {
$library_tracker_url = '.google-analytics.com/ga.js';
$library_cache_url = 'http://www' . $library_tracker_url;
}
}
$ga_script = _googleanalytics_cache($library_cache_url);
if (variable_get('googleanalytics_cache', 0) && $ga_script) {
$mod_base_url = substr($GLOBALS['base_root'] . $GLOBALS['base_path'], strpos($GLOBALS['base_root'] . $GLOBALS['base_path'], '//') + 2);
$mod_base_url_len = strlen($mod_base_url);
$ga_script = substr($ga_script, stripos($ga_script, $mod_base_url) + $mod_base_url_len);
}
else {
$ga_script = $library_cache_url;
if ($api['api'] === 'ga.js' && $GLOBALS['is_https']) {
if (!empty($trackdoubleclick)) {
$ga_script = str_replace('http://', 'https://', $ga_script);
}
else {
$ga_script = str_replace('http://www', 'https://ssl', $ga_script);
}
}
}
if (!empty($ga_script)) {
foreach ($js as $key => $value) {
if ($value['type'] !== 'inline') {
continue;
}
$add_ga = FALSE;
if ($api['api'] === 'analytics.js') {
$start = strpos($value['data'], '(function(i,s,o,g,r,a,m){i["GoogleAnalyticsObject"]=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();');
$end = strpos($value['data'], '})(window,document,"script",');
if ($start === 0) {
$js[$key]['data'] = substr($value['data'], 0, $start + 133) . substr($value['data'], $end);
$js[$key]['data'] = advagg_mod_defer_inline_js($js[$key]['data']);
$add_ga = TRUE;
}
}
if ($api['api'] === 'ga.js') {
$start = strpos($value['data'], '(function() {var ga = document.createElement("script");ga.type = "text/javascript";ga.async = true;ga.src =');
$end = strpos($value['data'], '";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(ga, s);})();');
if ($start !== FALSE && $end !== FALSE) {
$js[$key]['data'] = substr($value['data'], 0, $start) . substr($value['data'], $end + 91);
$js[$key]['no_defer'] = TRUE;
$add_ga = TRUE;
}
}
if ($add_ga) {
$js[$ga_script] = array(
'data' => $ga_script,
'type' => 'file',
'async' => TRUE,
'defer' => TRUE,
);
$js[$ga_script] += $value;
break;
}
}
}
}
function advagg_mod_remove_js_if_not_used(array &$js) {
$files_skiplist = array(
'drupal.js',
'jquery.js',
'jquery.min.js',
'jquery.once.js',
);
$inline_skiplist = array();
if (module_exists('jquery_update')) {
$inline_skiplist[] = 'document.write("<script src=\'' . $GLOBALS['base_path'] . drupal_get_path('module', 'jquery_update') . '/replace/jquery/' . variable_get('jquery_update_jquery_version', '1.10') . '/jquery' . (variable_get('jquery_update_compression_type', 'min') === 'none' ? '' : '.min') . ".js'>";
}
if (module_exists('labjs')) {
$inline_skiplist[] = 'var $L = $LAB.setGlobalDefaults';
}
$include_jquery = FALSE;
$include_drupal = FALSE;
module_load_include('inc', 'advagg', 'advagg');
$files_info_filenames = array();
foreach ($js as &$values) {
if ($values['type'] !== 'file' || !is_string($values['data'])) {
continue;
}
foreach ($files_skiplist as $skip_name) {
if (strlen($skip_name) < strlen($values['data']) && substr_compare($values['data'], $skip_name, -strlen($skip_name), strlen($skip_name)) === 0) {
continue 2;
}
}
$files_info_filenames[] = $values['data'];
}
unset($values);
$files_info = advagg_get_info_on_files($files_info_filenames);
foreach ($js as $name => &$values) {
if ($values['type'] === 'file' || $values['type'] === 'external') {
foreach ($files_skiplist as $skip_name) {
if (substr_compare($values['data'], $skip_name, -strlen($skip_name), strlen($skip_name)) === 0) {
continue 2;
}
}
}
if ($values['type'] === 'inline' && !empty($inline_skiplist)) {
foreach ($inline_skiplist as $skip_string) {
if (stripos($values['data'], $skip_string) !== FALSE) {
continue 2;
}
}
}
if (!isset($files_info[$name]['advagg_mod']) && $values['type'] !== 'external') {
$files_info[$name]['advagg_mod'] = advagg_mod_js_contains_jquery_drupal($values['data'], $values['type']);
}
if (!empty($files_info[$name]['advagg_mod']['contents']['drupal'])) {
$include_jquery = TRUE;
$include_drupal = TRUE;
break;
}
elseif (!empty($files_info[$name]['advagg_mod']['contents']['jquery'])) {
$include_jquery = TRUE;
}
elseif (isset($values['requires_jquery']) && !empty($values['requires_jquery'])) {
$include_jquery = TRUE;
}
}
unset($values);
if (!$include_drupal) {
unset($js['settings']);
foreach ($js as $name => &$values) {
$drupal = 'drupal.js';
if (substr_compare($name, $drupal, -strlen($drupal), strlen($drupal)) === 0) {
unset($js[$name]);
}
}
unset($values);
if (!$include_jquery) {
foreach ($js as $name => &$values) {
if ($values['type'] === 'file' || $values['type'] === 'external') {
foreach ($files_skiplist as $skip_name) {
if (substr_compare($name, $skip_name, -strlen($skip_name), strlen($skip_name)) === 0) {
unset($js[$name]);
}
}
}
elseif ($values['type'] === 'inline') {
foreach ($inline_skiplist as $skip_string) {
if (stripos($values['data'], $skip_string) !== FALSE) {
unset($js[$name]);
}
}
}
}
unset($values);
}
}
}
function advagg_mod_js_inline_processor(&$html) {
if (variable_get('advagg_mod_js_inline_resource_hints', ADVAGG_MOD_JS_INLINE_RESOURCE_HINTS)) {
advagg_mod_xpath_script_external_dns($html);
}
if (variable_get('advagg_mod_js_footer_inline_alter', ADVAGG_MOD_JS_FOOTER_INLINE_ALTER) && (variable_get('advagg_mod_js_footer', ADVAGG_MOD_JS_FOOTER) >= 1 || variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER) || variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC))) {
$pattern = '/<script(?![^<>]*src=)(?:(?![^<>]*type=)|(?=[^<>]*type="?[^<>"]*javascript))(.*?)>(.*?)<\\/script>/smix';
$callback = 'advagg_mod_wrap_inline_js';
if (variable_get('advagg_mod_wrap_inline_js_xpath', ADVAGG_MOD_WRAP_INLINE_JS_XPATH)) {
$html = advagg_mod_xpath_script_wrapper($html);
}
else {
$html = preg_replace_callback($pattern, $callback, $html);
}
}
}
function advagg_mod_devel_shutdown() {
drupal_register_shutdown_function('advagg_mod_devel_shutdown_real');
}
function advagg_mod_devel_shutdown_real() {
global $user;
$output = '';
if (!devel_silent() && !isset($GLOBALS['devel_shutdown']) && !isset($GLOBALS['devel_redirecting'])) {
if (function_exists('drupal_get_http_header')) {
$header = drupal_get_http_header('content-type');
if ($header) {
$formats = array(
'xml',
'javascript',
'json',
'plain',
'image',
'application',
'csv',
'x-comma-separated-values',
);
foreach ($formats as $format) {
if (strstr($header, $format)) {
return;
}
}
}
}
if (isset($user) && is_object($user) && user_access('access devel information')) {
$queries = devel_query_enabled() ? Database::getLog('devel', 'default') : NULL;
if (!empty($queries)) {
foreach ($queries as &$query) {
unset($query['caller']['args']);
}
}
$output .= devel_shutdown_summary($queries);
$output .= advagg_mod_devel_shutdown_query($queries);
}
if ($output) {
print $output;
}
}
}
function advagg_mod_devel_shutdown_query($queries) {
if (!empty($queries)) {
if (function_exists('theme_get_registry') && theme_get_registry()) {
list($counts) = devel_query_summary($queries);
$output = devel_query_table($queries, $counts);
advagg_mod_devel_query_put_contents($queries);
}
else {
$output = '</div>' . dprint_r($queries, TRUE);
}
return $output;
}
}
function advagg_mod_devel_query_put_contents($queries) {
$request_id = mt_rand(1, 1000000);
$path = "temporary://devel_querylog";
file_prepare_directory($path, FILE_CREATE_DIRECTORY);
if (mt_rand(1, 1000) == 401) {
devel_empty_dir($path);
}
$path .= "/{$request_id}.txt";
$path = file_stream_wrapper_uri_normalize($path);
$options = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT;
if (version_compare(PHP_VERSION, '5.5.0', '>=')) {
$options |= JSON_PARTIAL_OUTPUT_ON_ERROR;
}
if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
$options |= JSON_PRETTY_PRINT;
}
$depth = 32;
$json_data = FALSE;
while (empty($json_data) && $depth > 0) {
$json_data = @json_encode($queries, $options, $depth);
$depth--;
}
file_put_contents($path, $json_data);
$settings['devel'] = array(
'request_id' => $request_id,
);
$inline = 'jQuery.extend(Drupal.settings, ' . json_encode($settings) . ');';
if (variable_get('advagg_mod_js_defer', ADVAGG_MOD_JS_DEFER) || variable_get('advagg_mod_js_async', ADVAGG_MOD_JS_ASYNC)) {
$matches[2] = $matches[0] = $inline;
$inline = advagg_mod_wrap_inline_js($matches);
}
$options = array(
'type' => 'inline',
);
$options += drupal_js_defaults($inline);
$scripts_array = array(
'#type' => 'scripts',
'#items' => array(
$options,
),
);
$scripts = drupal_render($scripts_array);
print $scripts;
}