]> source.dussan.org Git - jquery.git/commitdiff
Core: Report browser errors in parseXML
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Tue, 8 Dec 2020 10:22:21 +0000 (11:22 +0100)
committerGitHub <noreply@github.com>
Tue, 8 Dec 2020 10:22:21 +0000 (11:22 +0100)
Fixes gh-4784
Closes gh-4816

src/core/parseXML.js
test/unit/core.js

index 715f59f1fe06627a1788bd0724830fb21fa8ec8b..482545aafc54b1c960a3a45028c39f8274e1825d 100644 (file)
@@ -2,7 +2,7 @@ import jQuery from "../core.js";
 
 // Cross-browser xml parsing
 jQuery.parseXML = function( data ) {
-       var xml;
+       var xml, parserErrorElem;
        if ( !data || typeof data !== "string" ) {
                return null;
        }
@@ -11,12 +11,17 @@ jQuery.parseXML = function( data ) {
        // IE throws on parseFromString with invalid input.
        try {
                xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
-       } catch ( e ) {
-               xml = undefined;
-       }
+       } catch ( e ) {}
 
-       if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
-               jQuery.error( "Invalid XML: " + data );
+       parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+       if ( !xml || parserErrorElem ) {
+               jQuery.error( "Invalid XML: " + (
+                       parserErrorElem ?
+                               jQuery.map( parserErrorElem.childNodes, function( el ) {
+                                       return el.textContent;
+                               } ).join( "\n" ) :
+                               data
+               ) );
        }
        return xml;
 };
index 6bcea95af20ff0da0968d0a8a7288f0d95db9706..af355c62154baf3edf1b58ad5a5ef02491f344ef 100644 (file)
@@ -1418,9 +1418,9 @@ QUnit.test( "jQuery.parseXML", function( assert ) {
        }
        try {
                xml = jQuery.parseXML( "<p>Not a <<b>well-formed</b> xml string</p>" );
-               assert.ok( false, "invalid xml not detected" );
+               assert.ok( false, "invalid XML not detected" );
        } catch ( e ) {
-               assert.strictEqual( e.message, "Invalid XML: <p>Not a <<b>well-formed</b> xml string</p>", "invalid xml detected" );
+               assert.ok( e.message.indexOf( "Invalid XML:" ) === 0, "invalid XML detected" );
        }
        try {
                xml = jQuery.parseXML( "" );
@@ -1436,6 +1436,29 @@ QUnit.test( "jQuery.parseXML", function( assert ) {
        }
 } );
 
+// Support: IE 11+
+// IE throws an error when parsing invalid XML instead of reporting the error
+// in a `parsererror` element, skip the test there.
+QUnit.testUnlessIE( "jQuery.parseXML - error reporting", function( assert ) {
+       assert.expect( 2 );
+
+       var errorArg, lineMatch, line, columnMatch, column;
+
+       sinon.stub( jQuery, "error" );
+
+       jQuery.parseXML( "<p>Not a <<b>well-formed</b> xml string</p>" );
+       errorArg = jQuery.error.firstCall.lastArg.toLowerCase();
+       console.log( "errorArg", errorArg );
+
+       lineMatch = errorArg.match( /line\s*(?:number)?\s*(\d+)/ );
+       line = lineMatch && lineMatch[ 1 ];
+       columnMatch = errorArg.match( /column\s*(\d+)/ );
+       column = columnMatch && columnMatch[ 1 ];
+
+       assert.strictEqual( line, "1", "reports error line" );
+       assert.strictEqual( column, "11", "reports error column" );
+} );
+
 testIframe(
        "document ready when jQuery loaded asynchronously (#13655)",
        "core/dynamic_ready.html",