Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.756.2.91
diff -u -p -r1.756.2.91 common.inc
--- includes/common.inc	30 Jun 2010 11:14:14 -0000	1.756.2.91
+++ includes/common.inc	8 Jul 2010 01:58:58 -0000
@@ -2500,9 +2500,25 @@ function drupal_to_js($var) {
       return $var;
     case 'resource':
     case 'string':
-      return '"'. str_replace(array("\r", "\n", "<", ">", "&"),
-                              array('\r', '\n', '\x3c', '\x3e', '\x26'),
-                              addslashes($var)) .'"';
+      static $replace_pairs = array();
+
+      if (empty($replace_pairs)) {
+        $replace_pairs = array(
+          "\\" => '\u005c',
+          "<" => '\u003c',
+          ">" => '\u003e',
+          "&" => '\u0026',
+          '"' => '\u0022',
+          '/' => '\u002f',
+          "\xe2\x80\xa8" => '\u2028', // Line Separator
+          "\xe2\x80\xa9" => '\u2029', // Paragraph Separator
+        );
+        // Remaining unicode replacements.
+        for ($i = 0; $i < 32; $i++) {
+          $replace_pairs[chr($i)] = '\u00' . sprintf("%02s", dechex($i));
+        }
+      }
+      return '"'. strtr($var, $replace_pairs) .'"';
     case 'array':
       // Arrays in JSON can't be associative. If the array is empty or if it
       // has sequential whole number keys starting with 0, it's not associative
