Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.870
diff -u -r1.870 common.inc
--- includes/common.inc	28 Feb 2009 07:36:06 -0000	1.870
+++ includes/common.inc	28 Feb 2009 09:11:45 -0000
@@ -2339,8 +2339,7 @@
  *
  * - Add external JavaScript ('external'):
  *   Allows the inclusion of external JavaScript files that are not hosted on the
- *   local server. Note that these external JavaScript references do not get
- *   aggregated when preprocessing is on.
+ *   local server.
  *
  * - Add settings ('setting'):
  *   Adds a setting to Drupal's global storage of JavaScript settings. Per-page
@@ -2411,8 +2410,7 @@
  *       a JavaScript file. Defaults to TRUE.
  *   - preprocess
  *       Aggregate the JavaScript if the JavaScript optimization setting has
- *       been toggled in admin/settings/performance. Note that JavaScript of
- *       type 'external' is not aggregated. Defaults to TRUE.
+ *       been toggled in admin/settings/performance. Defaults to TRUE.
  * @return
  *   The contructed array of JavaScript files.
  * @see drupal_get_js()
@@ -2606,8 +2604,12 @@
         break;
 
       case 'external':
-        // Preprocessing for external JavaScript files is ignored.
-        $output .= '<script type="text/javascript"' . ($item['defer'] ? ' defer="defer"' : '') . ' src="' . $item['data'] . "\"></script>\n";
+        if (!$item['preprocess'] || !$is_writable || !$preprocess_js) {
+          $output .= '<script type="text/javascript"' . ($item['defer'] ? ' defer="defer"' : '') . ' src="' . $item['data'] . "\"></script>\n";
+        }
+        else {
+          $files[$item['data']] = $item;
+        }
         break;
     }
   }
@@ -2776,8 +2778,20 @@
     // Build aggregate JS file.
     foreach ($files as $path => $info) {
       if ($info['preprocess']) {
-        // Append a ';' after each JS file to prevent them from running together.
-        $contents .= file_get_contents($path) . ';';
+        switch ($info['type']) {
+          case 'file':
+            // Append a ';' after each JS file to prevent them from running together.
+            $contents .= file_get_contents($path) . ';';
+            break;
+          case 'external':
+            // Request the external file.
+            $request = drupal_http_request($info['data']);
+            // Aggregate the file when the response is successful.
+            if ($request->code == 200) {
+              $contents .= $request->data . ';';
+            }
+            break;
+        }
       }
     }
 
