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);
}