Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.842
diff -u -p -r1.842 common.inc
--- includes/common.inc	5 Jan 2009 22:23:58 -0000	1.842
+++ includes/common.inc	8 Jan 2009 09:57:10 -0000
@@ -2301,7 +2301,9 @@ function drupal_clear_css_cache() {
  * performed using this function:
  *
  * - Add a file ('file'):
- *   Adds a reference to a JavaScript file to the page.
+ *   Adds a reference to a JavaScript file to the page. This may either be a file
+ *   relative to base_path(), or the absolute path to a JavaScript file hosted
+ *   externally. 
  *
  * - Add inline JavaScript code ('inline'):
  *   Executes a piece of JavaScript code on the current page by placing the code
@@ -2322,11 +2324,13 @@ function drupal_clear_css_cache() {
  *   drupal_add_js('$(document).ready(function(){alert("Hello!");});',
  *     array('type' => 'inline', 'scope' => 'footer', 'weight' => 5)
  *   );
+ *   drupal_add_js('http://yui.yahooapis.com/2.6.0/build/utilities/utilities.js');
  * @endcode
  *
  * @param $data
  *   (optional) If given, the value depends on the $options parameter:
- *   - 'file': Path to the file relative to base_path().
+ *   - 'file': Path to the file relative to base_path(), or the absolute path
+ *       to a JavaScript file hosted externally.
  *   - 'inline': The JavaScript code that should be placed in the given scope.
  *   - 'setting': An array with configuration options as associative array. The
  *       array is directly placed in Drupal.settings. All modules should wrap
@@ -2371,7 +2375,8 @@ function drupal_clear_css_cache() {
  *       a JavaScript file. Defaults to TRUE.
  *   - preprocess
  *       Aggregate the JavaScript if the JavaScript optimization setting has
- *       been toggled in admin/settings/performance. Defaults to TRUE.
+ *       been toggled in admin/settings/performance. Defaults to TRUE for
+ *       internal files and FALSE for external files.
  * @param $reset
  *   (optional) Resets the currently loaded JavaScript.
  * @return
@@ -2390,8 +2395,17 @@ function drupal_add_js($data = NULL, $op
   else {
     $options = array();
   }
+
+  // Store the original value of preprocess for external file JavaScript default.
+  $preprocess = isset($options['preprocess']) ? $options['preprocess'] : NULL;
+
   $options += drupal_js_defaults($data);
 
+  // Default external JavaScript files preprocess to FALSE.
+  if (is_null($preprocess) && $options['type'] == 'file' && filter_var($data, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED)) {
+    $options['preprocess'] = FALSE;
+  }
+
   // Preprocess can only be set if caching is enabled.
   $options['preprocess'] = $options['cache'] ? $options['preprocess'] : FALSE;
 
@@ -2559,7 +2573,8 @@ function drupal_get_js($scope = 'header'
 
       case 'file':
         if (!$item['preprocess'] || !$is_writable || !$preprocess_js) {
-          $no_preprocess .= '<script type="text/javascript"' . ($item['defer'] ? ' defer="defer"' : '') . ' src="' . base_path() . $item['data'] . ($item['cache'] ? $query_string : '?' . REQUEST_TIME) . "\"></script>\n";
+          $prefix = filter_var($item['data'], FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED) ? '' : base_path();
+          $no_preprocess .= '<script type="text/javascript"' . ($item['defer'] ? ' defer="defer"' : '') . ' src="' . $prefix . $item['data'] . ($item['cache'] ? $query_string : '?' . REQUEST_TIME) . "\"></script>\n";
         }
         else {
           $files[$item['data']] = $item;
Index: modules/simpletest/tests/common.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/common.test,v
retrieving revision 1.19
diff -u -p -r1.19 common.test
--- modules/simpletest/tests/common.test	26 Dec 2008 21:01:57 -0000	1.19
+++ modules/simpletest/tests/common.test	8 Jan 2009 09:57:11 -0000
@@ -470,6 +470,17 @@ class JavaScriptTestCase extends DrupalW
     $javascript = drupal_get_js();
     $this->assertTrue(strpos($javascript, 'simpletest.js') < strpos($javascript, 'misc/tableselect.js'), t('Altering JavaScript weight through the alter hook.'));
   }
+
+  /**
+   * Test rendering an external JavaScript file.
+   */
+  function testRenderExternal() {
+    $external = 'http://yui.yahooapis.com/2.6.0/build/utilities/utilities.js';
+    drupal_add_js($external);
+    $javascript = drupal_get_js();
+    // Local files have a base_path() prefix, external files should not.
+    $this->assertTrue(strpos($javascript, 'src="' . $external) > 0, t('Rendering an external JavaScript file.'));
+  }
 }
 
 /**
