]> source.dussan.org Git - jquery.git/commitdiff
Fixes #9255: xml parsing error in $.parseXML is now properly detected for all browser...
authorjaubourg <j@ubourg.net>
Sat, 23 Jul 2011 01:26:36 +0000 (03:26 +0200)
committerjaubourg <j@ubourg.net>
Sat, 23 Jul 2011 01:26:36 +0000 (03:26 +0200)
src/core.js
test/unit/core.js

index ab0d9f7b56edd7bb32c3ac0985f57d0c2eb96f69..715d73ad37bd5057ae3dbebac5114ac328672cf7 100644 (file)
@@ -553,24 +553,23 @@ jQuery.extend({
        },
 
        // Cross-browser xml parsing
-       // (xml & tmp used internally)
-       parseXML: function( data , xml , tmp ) {
-
-               if ( window.DOMParser ) { // Standard
-                       tmp = new DOMParser();
-                       xml = tmp.parseFromString( data , "text/xml" );
-               } else { // IE
-                       xml = new ActiveXObject( "Microsoft.XMLDOM" );
-                       xml.async = "false";
-                       xml.loadXML( data );
+       parseXML: function( data ) {
+               var xml, tmp;
+               try {
+                       if ( window.DOMParser ) { // Standard
+                               tmp = new DOMParser();
+                               xml = tmp.parseFromString( data , "text/xml" );
+                       } else { // IE
+                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                               xml.async = "false";
+                               xml.loadXML( data );
+                       }
+               } catch( e ) {
+                       xml = undefined;
                }
-
-               tmp = xml.documentElement;
-
-               if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
+               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
                        jQuery.error( "Invalid XML: " + data );
                }
-
                return xml;
        },
 
index 3a15535264e2107eef68d023faf07a185bd5a7ea..8c285f6dd89411ad539e8b3efde45b2392a09449 100644 (file)
@@ -867,7 +867,7 @@ test("jQuery.each(Object,Function)", function() {
                f[i] = "baz";
        });
        equals( "baz", f.foo, "Loop over a function" );
-       
+
        var stylesheet_count = 0;
        jQuery.each(document.styleSheets, function(i){
                stylesheet_count++;
@@ -984,6 +984,26 @@ test("jQuery.parseJSON", function(){
        }
 });
 
+test("jQuery.parseXML", 4, function(){
+       var xml, tmp;
+       try {
+               xml = jQuery.parseXML( "<p>A <b>well-formed</b> xml string</p>" );
+               tmp = xml.getElementsByTagName( "p" )[ 0 ];
+               ok( !!tmp, "<p> present in document" );
+               tmp = tmp.getElementsByTagName( "b" )[ 0 ];
+               ok( !!tmp, "<b> present in document" );
+               strictEqual( tmp.childNodes[ 0 ].nodeValue, "well-formed", "<b> text is as expected" );
+       } catch (e) {
+               strictEqual( e, undefined, "unexpected error" );
+       }
+       try {
+               xml = jQuery.parseXML( "<p>Not a <<b>well-formed</b> xml string</p>" );
+               ok( false, "invalid xml not detected" );
+       } catch( e ) {
+               strictEqual( e, "Invalid XML: <p>Not a <<b>well-formed</b> xml string</p>", "invalid xml detected" );
+       }
+});
+
 test("jQuery.sub() - Static Methods", function(){
     expect(18);
     var Subclass = jQuery.sub();
@@ -1108,7 +1128,7 @@ test("jQuery.sub() - .fn Methods", function(){
 test("jQuery.camelCase()", function() {
 
        var tests = {
-               "foo-bar": "fooBar", 
+               "foo-bar": "fooBar",
                "foo-bar-baz": "fooBarBaz"
        };