You are here

function advagg_relocate_advagg_relocate_process_http_request_alter in Advanced CSS/JS Aggregation 7.2

Implements hook_advagg_relocate_process_http_request_alter().

Related topics

File

advagg_relocate/advagg_relocate.advagg.inc, line 103
Advanced aggregation relocate module.

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