Index: misc/ajax.js
===================================================================
RCS file: /cvs/drupal/drupal/misc/ajax.js,v
retrieving revision 1.17
diff -u -p -r1.17 ajax.js
--- misc/ajax.js	16 May 2010 19:08:08 -0000	1.17
+++ misc/ajax.js	14 Jun 2010 22:37:29 -0000
@@ -325,10 +325,27 @@ Drupal.ajax.prototype.commands = {
     var method = response.method || ajax.method;
     var effect = ajax.getEffect(response);
 
-    // Manually insert HTML into the jQuery object, using $() directly crashes
-    // Safari with long string lengths. http://dev.jquery.com/ticket/3178
+    // We don't know what response.data contains: it might be a string of text
+    // without HTML, so don't rely on jQuery correctly iterpreting
+    // $(response.data) as new HTML rather than a CSS selector. Also, if
+    // response.data contains top-level text nodes, they get lost with either
+    // $(response.data) or $('<div></div>').replaceWith(response.data);
     var new_content = $('<div></div>').html(response.data);
 
+    // For legacy reasons, the effects processing code assumes that new_content
+    // consists of a single top-level element. Also, it has not been
+    // sufficiently tested whether attachBehaviors() can be successfully called
+    // with a context object that includes top-level text nodes. However, to
+    // give developers full control of the HTML appearing in the page, and to
+    // enable AJAX content to be inserted in places where DIV elements are not
+    // allowed (e.g., within TABLE, TR, and SPAN parents), we remove the
+    // container DIV created above in cases where response.data consists of a
+    // single top-level element. For more information, please see
+    // http://drupal.org/node/736066.
+    if (new_content.contents().length == 1 && new_content.contents().get(0).nodeType == 1) {
+      new_content = new_content.contents();
+    }
+
     // If removing content from the wrapper, detach behaviors first.
     switch (method) {
       case 'html':
