Implements hook_advagg_relocate_process_http_request_alter().
Related topics
File
-
advagg_relocate/
advagg_relocate.advagg.inc, line 103
Code
function advagg_relocate_advagg_relocate_process_http_request_alter(&$response, $type) {
if ($type !== 'js' || strpos($response->url, 'connect.facebook.net/en_US/fbevents.js') === FALSE) {
return 1;
}
// Fix loader so it works if not loaded from connect.facebook.net.
$base_fb_url = 'https://connect.facebook.net';
$matches = array();
$pattern = '/function\\s+([\\w]{1,2})\\(\\)\\s*\\{\\s*var\\s+([\\w]{1,2})\\s*=\\s*null,\\s*([\\w]{1,2})\\s*=\\s*null,\\s*([\\w]{1,2})\\s*=\\s*([\\w]{1,2})\\.getElementsByTagName\\([\'"]script[\'"]\\)/';
preg_match($pattern, $response->data, $matches);
// Bail out if not matched.
if (empty($matches[0])) {
return 2;
}
// Transform
// function B(){var E=null,F=null,G=b.getElementsByTagName("script");
// to
// function B(){var E="https://connect.facebook.net",G=b.getElementsByTagName("script"),F=G[0].
$response->data = str_replace($matches[0], "function {$matches[1]}(){var {$matches[2]}=\"{$base_fb_url}\",{$matches[4]}={$matches[5]}.getElementsByTagName(\"script\"),{$matches[3]}={$matches[4]}[0]", $response->data);
// Get Facebook IDs.
$fb_ids = array_filter(array_map('trim', explode("\n", variable_get('advagg_relocate_js_fbevents_local_ids', ADVAGG_RELOCATE_JS_FBEVENTS_LOCAL_IDS))));
if (empty($fb_ids)) {
return 3;
}
// Get Facebook Version.
$matches = array();
$pattern = '/fbq.version\\s*=\\s*[\'"]([\\.\\d]+)[\'"]/';
preg_match($pattern, $response->data, $matches);
if (empty($matches[1])) {
return 4;
}
$version = $matches[1];
// Get Release Segment.
$segment = 'stable';
$matches = array();
$pattern = '/fbq._releaseSegment\\s*=\\s*[\'"](.+)[\'"]/';
preg_match($pattern, $response->data, $matches);
if (!empty($matches[1])) {
$segment = $matches[1];
}
// Update local copies of the /signals/config/ js.
$js = array();
foreach ($fb_ids as $fb_id) {
$url = "{$base_fb_url}/signals/config/{$fb_id}?v={$version}&r={$segment}";
$js[$url]['data'] = $url;
$js[$url]['type'] = 'external';
$js[$url]['#fbid'] = "config{$fb_id}";
$url = "{$base_fb_url}/signals/plugins/{$fb_id}?v={$version}&r={$segment}";
$js[$url]['data'] = $url;
$js[$url]['type'] = 'external';
$js[$url]['#fbid'] = "plugins{$fb_id}";
}
if (!empty($js)) {
advagg_relocate_js_post_alter($js, TRUE);
}
// Get a list of the local copies for this version.
$local_copies = array();
foreach ($js as $values) {
if ($values['type'] === 'file') {
// Create an aggregate just for this file.
$values += drupal_js_defaults($values);
$elements = array(
$values,
);
$groups = advagg_group_js($elements);
_advagg_aggregate_js($groups);
if (isset($groups[0]['data'])) {
$local_copies[$values['#fbid']] = advagg_file_create_url($groups[0]['data']);
}
}
}
if (empty($local_copies)) {
return 5;
}
// Add the local copies to the js file.
$local_copies = json_encode($local_copies);
$matches = array();
$pattern = '/return\\s*\\{\\s*baseURL:\\s*([\\w]{1,2}),\\s*scriptElement:\\s*([\\w]{1,2})\\s*\\}/';
preg_match($pattern, $response->data, $matches);
// Bail out if not matched.
if (empty($matches[0])) {
return 6;
}
// Transform
// return{baseURL:E,scriptElement:F}
// to
// return{baseURL:E,scriptElement:F,localCopies:ARRAY_OF_LOCAL_JS_FILES}.
$response->data = str_replace($matches[0], "return{baseURL:{$matches[1]},scriptElement:{$matches[2]},localCopies:{$local_copies}}", $response->data);
// Change logic so it'll use the local copy if it exists.
$matches = array();
$pattern = '/([\\w]{1,2})\\s*=\\s*([\\w]{1,2})\\.baseURL;\\s*var\\s+([\\w]{1,2})\\s*=\\s*([\\w]{1,2})\\s*\\+\\s*[\'"]\\/signals\\/config\\/[\'"]\\s*\\+\\s*([\\w]{1,2})\\s*\\+\\s*[\'"]\\?v=[\'"]\\s*\\+\\s*([\\w]{1,2})\\s*\\+\\s*[\'"]\\&r=[\'"]\\s*\\+\\s*([\\w]{1,2}),\\s*([\\w]{1,2})\\s*=\\s*([\\w]{1,2})\\.createElement\\([\'"]script[\'"]\\);\\s*[\\w]{1,2}.src\\s*=\\s*[\\w]{1,2};/';
preg_match($pattern, $response->data, $matches);
// Bail out if not matched.
if (empty($matches[0])) {
return 7;
}
// Transform
// 1 2 3 4 5 6 7 8 9 8 3
// I=H.baseURL;var J=I+"/signals/config/"+E+"?v="+F+"&r="+G,K=b.createElement("script");K.src=J;
// to
// 1 2 3 4 5 6 7 8 9 2 2 5 3 2 5 8 3
// I=H.baseURL;var J=I+"/signals/config/"+E+"?v="+F+"&r="+G,K=b.createElement("script");if(H.localCopies&&H.localCopies["config"+E]){J=H.localCopies["config"+E];}K.src=J;.
$response->data = str_replace($matches[0], "{$matches[1]}={$matches[2]}.baseURL;var {$matches[3]}={$matches[4]}+\"/signals/config/\"+{$matches[5]}+\"?v=\"+{$matches[6]}+\"&r=\"+{$matches[7]},{$matches[8]}={$matches[9]}.createElement(\"script\");if({$matches[2]}.localCopies&&{$matches[2]}.localCopies[\"config\"+{$matches[5]}]){{$matches[3]}={$matches[2]}.localCopies[\"config\"+{$matches[5]}];}{$matches[8]}.src={$matches[3]};", $response->data);
// Change logic so it'll use the local copy if it exists.
$matches = array();
$pattern = '/if\\s*\\(([\\w]{1,2})\\.baseURL\\s*\\&\\&\\s*([\\w]{1,2})\\.scriptElement\\)\\s*\\{\\s*var\\s+([\\w]{1,2})\\s*\\=\\s*([\\w]{1,2})\\.baseURL\\s*\\+\\s*[\'"]\\/signals\\/plugins\\/[\'"]\\s*\\+\\s*([\\w]{1,2})\\s*\\+\\s*[\'"]\\.js\\?v\\=[\'"]\\s*\\+\\s*([\\w]{1,2})\\.version;/';
preg_match($pattern, $response->data, $matches);
// Bail out if not matched.
if (empty($matches[0])) {
return 8;
}
// Transform
// if(C.baseURL&&C.scriptElement){var D=C.baseURL+"/signals/plugins/"+A+".js?v="+g.version;
// to
// if(C.baseURL&&C.scriptElement){var D=C.baseURL+"/signals/plugins/"+A+".js?v="+g.version;if(C.localCopies&&C.localCopies["plugins"+A]){D=C.localCopies["plugins"+A];}.
$response->data = str_replace($matches[0], "if({$matches[1]}.baseURL&&{$matches[2]}.scriptElement){var {$matches[3]}={$matches[4]}.baseURL+\"/signals/plugins/\"+{$matches[5]}+\".js?v=\"+{$matches[6]}.version;if({$matches[1]}.localCopies&&{$matches[1]}.localCopies[\"plugins\"+{$matches[5]}]){{$matches[3]}={$matches[1]}.localCopies[\"plugins\"+{$matches[5]}];}", $response->data);
}